浅谈子域名枚举

Posted by bfpiaoran on August 30, 2018

之前提到对一家厂商无论渗透测试还是,漏洞挖掘70%工作都是信息收集  而信息收集中子域名的收集又是重中之重

之前有人提到一个收集子域名字典的方法 利用dns历史解析记录等

经过整理了大概400G的解析记录整理出了大字典(1000万)中字典(300万+)小字典(60万+)的字典

接着就是子域名枚举了

本来以为很简单的一件事情,而且安全圈有开源了几个不错的字典比如lijiejie的subDomainsBrute esd等等

结果发现并不理想,当subDomainsBrute加载字典过大的时候会使进程kill掉(这个坑是后来擦发现的,,,)

lijiejie的脚本有些坑,速度也不是特别快而且字典大了会产生错误,还是2.7写的 这我一个用python3的肯定是不爽的

 

开始尝试用lijiejie的思路去写  多进程+gevent协程

大概一天就能跑起来了 ,然后开心的去跑了一下  嗯1000的域名字典很快,结果跑了一个60w的字典发现奇慢无比,其中坑的有gevent的猴子补丁如果打上全局path.all的话多进程Manager数据共享管理器会抛出异常,而且这异常在windows不会出现的,那么为了多进程只好把猴子补丁关掉,而猴子补丁关掉的话,gevent协程做dns查询中协程就会失败,导致是使用多进程去跑子域名根本和协程一点关系没有,到了这里差不多搞了一周了,整个人都已经奔溃了,各种异常各种坑,说到底还是python2.7带过来的坑

 

 

柳暗花明又一村——————–

发现了在pthon3.4引入了一个新的标准库asyncio  取代gevent绰绰有余,而且速度很快,在最终的demo里如果不限制并发量的话公司的机器能跑满带宽达到3.4m/s的速度,于是乎想了一个多进程+asyncio异步的方法来实现

后来测试总是出现一个 broken  pipe的问题   查了一下谷歌说是因为管理共享数据需要加锁的原因,但是搞来搞去还是没搞掉异常,最后使用单进程+asyncio异步来实现

从敲定这个结构到完成踩了不少坑

 

1  在生成异步循环体的时候会加载大量的内存导致进程崩溃,这也是subDomainsBrute会产生kill的原因,解决方法是在生成循环之前把扫描列表切割程子字典(这块很坑,python加载一个88m字典只占用了我3%的内存,但是如果把这88m字典变成循环任务的话 会导致内存崩溃   这里具体多少内存我是不知道了  但是我24G内存的机器是满了。。。。。)

 

2 在dns查询的时候有好多time out的异常 这里如果写成获取异常重试是解决不了问题的(发现这个问题是在跑了几次发现结果不一样发现的  巨坑)最后把error的扔到一个列表中等所有队列跑完了在进行递归查询

3 还有小坑 貌似都忘了 比如Linux、 windows有socket连接数限制啊  linux默认是1024啊

 

下面的坑留给未来

 

有好多域名解析到一个nginx反向代理服务器 然后再由反向代理服务器根据域名解析到对应ip  这里如果数量多的话 影响子域名泛解析判断

再有就是像*.taobao.com这样域名  可能会有很多商户域名,后续都是有待修改的。。。。