子域名收集及端口扫描之ZeroScan

为了自动化日常的一些渗透测试任务,做了一个前期信息收集的轮子。ZeroScan 主要分为子域名收集和端口扫描两个部分。这样,只需要输入目标域名,就能输出一个子域名以及对应ip端口扫描的报告。

子域名收集部分主要采用了主动扫描和被动 DNS 数据查询两种方式。被动 DNS 数据查询主要从 virustotal 和 dnsdb 上获取数据。此外还从 DuckDuckSearch 以及 crt.sh 上收集子域名的信息。主动扫描采用了 lijiejie 的 subDomainsBrute。对于设置了泛解析的域名会进行一次过滤操作。

dnsdb 的数据无法主动获取,需要用户自己查询并下载 json 格式放在 input 目录下。DuckDuckSearch 的结果也可以自己写入。

子域名收集完毕后进行一次检测,主要为了判断改域名是否是CNAME指向另一个域名,是否指向CDN,是否指向内网IP。实际上,一般而言如果一个域名存在CNAME记录并且指向另外一个域名的话,该域名有很大的概率指向CDN。对于指向CDN的域名和指向内网的域名,不做后续的端口扫描。

目前常用的端口扫描方式为尝试建立一个 socket 连接,如果超时活错误则认为该端口未开启。为了提高效率,这里采用了 zmap 的扫描方式,在root权限下分两个进程一个发送扫描包,一个接收结果并过滤和保存。采用 scapy 库可以很简单的实现。

1
2
3
4
5
6
7
# send.py
from scapy.all import *
dst_ip = '127.0.0.1'
dst_port = (1, 60000)
send(IP(dst=dst_ip)/TCP(dport=dst_port,flags="S"))
1
2
3
4
5
6
7
8
9
10
11
12
# recv.py
from scapy.all import *
whitelist = ['127.0.0.1']
f="tcp[tcpflags] & tcp-syn != 0 and tcp[tcpflags] & tcp-ack != 0"
def callback(pkt):
#pkt.show()
if pkt[IP].src in whitelist:
print "%s:%s"%(pkt[IP].src, pkt[TCP].sport)
sniff(prn=callback, filter=f, store=0)

有时候这种扫描方式会产生一些遗漏,在这里对没有端口返回的ip进行二次扫描。

在获取端口信息之后,会进行一次粗略的服务识别。对于一些常见的端口,内置了一份端口和服务的对应关系表,直接查询即可获取。对没有对应关系的端口,会发生一些探测流量,根据响应来判断服务类型。这里抄袭了A牛的InsightScan里的代码。如果还没有识别,那么就从nmap的nmap-services列表去查询。

最后会根据结果输出一份 html 的报告,一些中间结果会在 output 文件夹里保存。

参考资料

https://github.com/lijiejie/subDomainsBrute
https://github.com/AnthraX1/InsightScan
http://biot.com/capstats/bpf.html
http://www.freebuf.com/sectool/94507.html

分享到 评论