C段查询雏形之在Java中反查一个IP上的所有域名(旁站查询)

简介:

这里使用了两个接口来反查IP,分别是“站长工具”和“爱站”的接口,两者各有千秋,结合起来查询就较为准确了。

注:我目前只写了个初始版本,还不太完善,但是可以基本使用了,代码中关键地方有注释,所以我就不多解释了

算法核心:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
package  NmapTest;
 
import  java.io.BufferedReader;
import  java.io.IOException;
import  java.io.InputStream;
import  java.io.InputStreamReader;
import  java.io.OutputStream;
import  java.net.HttpURLConnection;
import  java.net.MalformedURLException;
import  java.net.URL;
import  java.util.HashSet;
import  java.util.Set;
import  java.util.regex.Matcher;
import  java.util.regex.Pattern;
 
public  class  SearchDomainByIP {
     /**
      * IP反查(旁站查询),综合两个接口的结果
      * @param ip 待查IP
     
      * @return 返回结果集
      * */
     public  Set<String> getDomains(String ip){
         Set<String> set =  new  HashSet<String>();
         set = getDomainByChinaz(searchDomainByChinaz(ip));   //chinaz接口
         
         try 
             String[] domainByAiZhan = searchDomainByAiZhan(ip,  1 false ).split( " " );   //aizhan接口
             for (String s : domainByAiZhan){
                 if (!s.equals( "" ))
                     set.add(s);
             }
         catch  (IOException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }
         
         return  set;
     }
     
     /**
      * 使用站长工具的接口,IP反查域名
      * @param ip 待查IP
     
      * @return 返回包含结果的字符串
      * */
     private  String searchDomainByChinaz(String ip){
         try  {
             URL url =  new  URL( "http://s.tool.chinaz.com/same" );
             HttpURLConnection connection = (HttpURLConnection) url.openConnection();
             
             connection.setRequestMethod( "POST" );
             connection.setRequestProperty( "Content-Type" "application/x-www-form-urlencoded" );
             connection.setDoInput( true );
             connection.setDoOutput( true );
             connection.setUseCaches( false );
             
             String str =  "s="  + ip;   //POST参数
             OutputStream outputStream = connection.getOutputStream();
             outputStream.write(str.getBytes( "UTF-8" ));
             outputStream.flush();   //开始请求
             outputStream.close();
             
             //返回数据包
             if (connection.getResponseCode() ==  200 ){
                 InputStream inputStream = connection.getInputStream();
                 BufferedReader reader =  new  BufferedReader( new  InputStreamReader(inputStream));
                 String line =  "" ;
                 String reg =  "\\s*<ul><li><span>1.</span>(.*)?" ;   //匹配到目标行
 
                 while ((line = reader.readLine()) !=  null ){
                     if (line.matches(reg)){
                         inputStream.close();
                         reader.close();
                         connection.disconnect();
                         return  line.replaceFirst( "\\s*<ul><li><span>1.</span>" "" );   //返回包含目标的字符串
                     }
 
                 }              
             }
                             
         catch  (MalformedURLException e) {
             e.printStackTrace();
         catch  (IOException e) {
             e.printStackTrace();
         }
     
         return  "" ;
     }
 
     /**
      * 正则匹配出需要的一个个域名
      * @param data 包含所有结果的字符串
     
      * @return 目标域名的List集合
      * */
     private  Set<String> getDomainByChinaz(String data){
         String reg =  "target=_blank>(.*?)</a></li>" ;   //准确匹配出查到的域名
         Pattern pattern = Pattern.compile(reg);
         Matcher matcher = pattern.matcher(data);
         
         Set<String> set =  new  HashSet<String>();
         while (matcher.find()){
             set.add(matcher.group( 1 ));
         }
         
         return  set;
     }
     
     /**
      * 使用爱站网的接口,IP反查域名
      * @param ip 待查IP
      * @param currentPage 当前页
      * @param checkNum 判断域名总数是否已获取
     
      * @return 返回包含结果的字符串
      * @throws IOException 
      * */
     private  String searchDomainByAiZhan(String ip, int  currentPage, boolean  checkNum)  throws  IOException{
         URL url =  new  URL( "http://dns.aizhan.com/"  + ip +  "/"  + currentPage + "/" );
         HttpURLConnection connection = (HttpURLConnection) url.openConnection();
         connection.setRequestMethod( "GET" );
         connection.setConnectTimeout( 10000 );   //毫秒
         connection.setReadTimeout( 10000 );
         
         InputStream inputStream = connection.getInputStream();  
         BufferedReader reader =  new  BufferedReader( new  InputStreamReader(inputStream));
         String line =  "" ;
         String numReg =  "共有  <font color=\"#FF0000\" id=\"yhide\">(\\d*)?</font> 个域名解析到该IP" ;
         String domainReg =  "\\s*<td class=\"dns-links\">\\s*" ;   //匹配到目标行的上一行
         
         int  domainNumber =  0 ;   //查到的域名总数
         String domainNames =  "" ;   //查到的所有域名的字符串集
         boolean  point =  false ;   //从false置为true时,表示已经找到目标行的上一行了,下一次循环即可取出目标行       
         
         Pattern pattern = Pattern.compile(numReg);
         Matcher matcher =  null ;
         while ((line = reader.readLine()) !=  null ){         
             //查域名总数
             if (!checkNum){
                 matcher = pattern.matcher(line);
                 if (matcher.find()){
                     domainNumber = Integer.valueOf(matcher.group( 1 ));
                     checkNum =  true ;
                 }
             }
             //查域名
             if (point){
                 pattern = Pattern.compile( "target=\"_blank\">(.*)?</a>" );
                 matcher = pattern.matcher(line);
                 if (matcher.find()){
//                  System.out.println(matcher.group(1));  
                     domainNames = domainNames + matcher.group( 1 ) +  " "
                     point =  false ;
                 }
             }
             else  if (line.matches(domainReg)){
                 point =  true ;
             }
 
         }
         inputStream.close();
         reader.close();
         connection.disconnect();
         
         //如果当前页下一页还有内容,则进行递归调用查询
         if (domainNumber > ( 20  * currentPage)){
             try  {
                 Thread.sleep( 1000 );   //线程休息1秒钟
             catch  (InterruptedException e) {
                 e.printStackTrace();
             }
             return  domainNames + searchDomainByAiZhan(ip,currentPage+ 1 , true );
         }
         else {
             return  domainNames;
         }  
     }
}

调用测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package  NmapTest;
 
import  java.util.HashSet;
import  java.util.Iterator;
import  java.util.Set;
 
public  class  Domains {
 
     /**
      * @param args
      */
     public  static  void  main(String[] args) {
         SearchDomainByIP searchDomain =  new  SearchDomainByIP();
         Set<String> set =  new  HashSet<String>();
         set = searchDomain.getDomains( "162.211.183.152" );
 
         Iterator<String> iterator = set.iterator();
         System.out.println( "一共查到 "  + set.size() +  "个旁站" );
         while (iterator.hasNext()){
             System.out.println(iterator.next());
         }
     }
 
}

输出:

一共查到 55个旁站
www.anhao.ga
www.3ga.cc
www.xiaotwl.cn
wapfeih.com
www.52zyw.net
lgdyw.pw
xxin888.com
www.hksf-expres.com
www.zbhz.top
yk666.cn
www.mfdhw.cn
danshenwl.com
qq67.cn
gjdc.cc
www.5x2y0.com
www.wz288.com
wapzx.org
85pj.cn
www.txbk.cc
yajie520.com
www.wuyunzhu.top
huanyan520.com
lequk.com
www.ddcd.net
ail.so
3pojie.com
www.hacksg.com
www.yin361.cn
www.wapfeih.com
xg-sfkd.com.cn
www.xuexi47.cn
www.huaxia47.com
wz288.com
www.sucaiziyuan.com
wapsog.com
qm6.cc
www.58dh.cn
hacksg.com
zhuilixiang.com
www.xhhzyw.com
www.360360.pw
www.495o.com
surfs.cn
shineky.cn
www.danshenwl.com
52daizi.com
www.hei-tan.com
xg-sfg.cn
www.qqjudian.com
sucaiziyuan.com
moran.cc
lghk.pw
www.huanyan520.com
hongbao.qq.com.mooyu.pub
lexunc.com


PS:通过IP反查域名本身就没有确定的算法,因此有误差再所难免。这也是我使用两个不同接口来查询的意义所在,可以互相弥补,使结果更加精确




本文转自 pangfc 51CTO博客,原文链接:http://blog.51cto.com/983836259/1719263,如需转载请自行联系原作者

相关实践学习
基于函数计算快速搭建Hexo博客系统
本场景介绍如何使用阿里云函数计算服务命令行工具快速搭建一个Hexo博客。
相关文章
|
1月前
|
存储 Java 关系型数据库
养老保障金查询系统【GUI/Swing+MySQL】(Java课设)
养老保障金查询系统【GUI/Swing+MySQL】(Java课设)
18 0
|
4天前
|
域名解析 弹性计算 应用服务中间件
基于nginx反向代理实现OSS固定域名IP访问
本文基于阿里云OSS手册:https://help.aliyun.com/zh/oss/use-cases/use-an-ecs-instance-that-runs-centos-to-configure-a-reverse-proxy-for-access-to-oss,继续深入讨论如何利用nginx反向代理,实现固定的IP/域名访问OSS bucket。官方文档能够解决大部分的反向代理固定IP访问oss bucket的场景,但是对于必须使用域名作为endpoint的系统,会出现signatrue鉴权问题。本文继续在官方文档的基础上,将反向代理需要域名作为endpoint的场景补齐方案。
|
4天前
|
安全 网络协议 网络安全
安全开发实战(2)---域名反查IP
本文介绍了域名与IP地址的关系以及域名反查IP的作用。通过DNS,域名与IP地址相互映射,方便用户访问网络资源。在渗透测试中,反查IP用于确定服务器真实地址、进行目标侦察和安全性评估,也能检测DNS劫持。文中提供了一些Python代码示例,演示了如何进行域名反查IP和批量处理,并强调在处理时要注意去除换行符以避免错误。
|
17天前
|
存储 Java 定位技术
【Java】根据IP地址获取省市
【Java】根据IP地址获取省市
42 1
|
19天前
|
SQL Java 数据库连接
Java从入门到精通:2.3.2数据库编程——了解SQL语言,编写基本查询语句
Java从入门到精通:2.3.2数据库编程——了解SQL语言,编写基本查询语句
|
22天前
域名信息查询同款WHOIS源码
域名查询一般是指查询域名的whois注册信息,域名WHOIS是当前域名系统中不可或缺的一项信息服务。在使用域名进行Internet冲浪时,很多用户希望进一步了解域名、名字服务器详细信息,这就会用到WHOIS。
24 5
|
23天前
|
存储 Java
Java动态转发代理IP的实现方法
Java动态转发代理IP的实现方法
32 11
|
24天前
|
Ubuntu 应用服务中间件 Linux
nginx 配置代理ip访问https的域名配置
nginx 配置代理ip访问https的域名配置
|
24天前
|
安全 Java API
java借助代理ip,解决访问api频繁导致ip被禁的问题
java借助代理ip,解决访问api频繁导致ip被禁的问题
|
25天前
|
Java Python
设置代理ip——java
设置代理ip——java