1. 背景
在开始渗透一个网站之前,你需要知道这个网站的网络资产:域名、IP等。IP和域名有直接的解析关系,所以如何找到该网站的所有子域名是关键。
2.实现思路
如果你知道网站主域名,可以按照以下方式收集域名。
2.1. 搜索引擎
使用百度等搜索引擎,可以用site关键字查询所有包含该域名的记录,权重高的子域名会排在前面。
举例来说,您可以通过搜索 site: 来获取包含的子域名。
缺点:界面性质的子域名不会被搜索引擎收录,而且可能会有遗漏
HTTPS 证书透明度
透明度报告中的证书透明度项目()是为了解决HTTPS证书体系的结构性缺陷,允许大家查询各个网站的HTTPS证书信息,从而找到颁发证书的子域名,证书透明度结果(:true;:true;:&lu=)
缺点:仅签署根域名证书存在疏漏
2.3. 自我披露
搜索:o=desc&q=%%22&s=&type=Code&utf8=✓
DNS 域名转移:dig@8.8.8.8 axfr
.xml文件:
:
缺点:不完整,有遗漏
2.4. DNS 查询
域名的存在是为了避免人们去记住 IP 地址,所以域名和 IP 地址是一一对应的。所以可以收集一个常用域名的字典,去 DNS 服务商查询是否有解析记录,枚举子域名。比如可以用 dig 命令查看二级域名的 DNS 解析记录()。
缺点:速度慢,假阴性量少
3.最佳实践
每种方式都有漏报的可能,结合多种方式查询结果才能最全面。我们重点讲第四种方式,通过DNS查询枚举子域名。通过DNS枚举需要解决两个问题:字典和速度。
3.1. 词典
DNS服务提供商:从子域名到子域名
DNS 服务提供商的词典是最准确和有效的。首先找到最常用的子域名的已发布列表:--sub-.txt()
通用词典
一些基本的组合词典在大小和命中率之间做出权衡。
常用短语
一些最常见的中文和英文短语。
类似爆破工具词典
类似的工具各自收集和组织自己独特的词典,并将它们全部组合在一起。
3.2. 速度
使用常见的多进程,多线程等不能发挥最大作用,使用()+()可以发挥最大速度,简单例子:
实施过程
加载词典
协程批量查询
结果
字典生成
最多可并行运行 10,000 个协程
通过扫描,一共查到了规则,1913个域名,耗时大概100-160秒,平均每秒1000-1500条规则。后续又引入了多个进程,充分利用带宽。
4. 问题
域名通用解析问题
通过DNS查询枚举子域名遇到的最大问题就是域名泛解析的问题,域名泛解析是厂商为了方便维护解析记录,将所有域名情况解析到同一台服务器的一种做法。
比如你在域名服务商上将*.的A记录配置为103.21.141.30,那么无论你访问//,都会被解析到103.21.141.30,而这台服务器上的NGINX会区分出域名和对应的后端应用。
因此在使用字典对一个泛解析域名的子域名进行爆破时,无论该域名是否真实存在,都会有解析结果。
目前最好的方案是先获取绝对不存在的域名的响应内容,再遍历获取各个字典对应的子域名的响应内容,通过与不存在域名内容的相似度对比来枚举子域名,但这种实现方式是以牺牲速度为代价的,后续计划会将其作为可选方案。
5. 应对措施
虽然子域名本身是公共网络资产,但是作为甲方,我们必须思考如何具体增加收集子域名的难度。
使用 pan-parse
爆破泛解析的难点在于枚举子域名,而泛解析的出现则是为了方便业务快速管理子域名。在这种情况下,企业使用泛解析的优点大于缺点。例如,在上线新子域名时,无需等待域名同步时间,部分不存在的域名可以显示404页面,内部子域名统计也更加方便。
人类和机器识别
使用pan-parse方法只是增加了时间成本,如果是针对性攻击,攻击者不在乎时间成本或者采用分布式方法,那么甲方就需要为机器程序解决人机识别和页面相似度混淆问题。
6. 最后的想法
作为渗透测试中最基本的前提条件,枚举子域时要做的事情实在是太多了,只有覆盖到所有点,才能得到最接近真实全量的子域。项目名为ESD,最终实现已经开源到(),欢迎大家参与维护。
@Feei 博客链接:枚举子域名
扫一扫在手机端查看
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。