之前提到对一家厂商无论渗透测试还是,漏洞挖掘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这样域名 可能会有很多商户域名,后续都是有待修改的。。。。