重点分享渗透经验,实用技巧....
福利:谁看谁有份 | 10余本书+渗透工具包,直接赠送!
很早之前看过一篇关于子域名劫持的文章,但是一直没遇到过,直到最近测试中才真正遇到。下面我们就从什么是域名解析开始,大致梳理一下域名劫持漏洞的成因、挖掘思路、工具等,最后再用一个真实的案例来梳理一下整个漏洞。
1. 域名解析
域名解析,也称为 DNS 解析,是将域名指向网络上的 IP 地址的过程。
互联网上要访问服务,就需要获取它们的IP地址,但记住不同的IP地址太麻烦了。通过使用域名解析,人们不需要记住繁琐的IP地址,而是通过简单易懂的域名就可以访问相应的网站。
在域名解析中,一个域名只能对应一个IP地址,但一个IP地址可以对应多个域名。
用于解析域名的协议称为域名解析协议,或者DNS协议。
域名解析的过程
1、在浏览器中输入域名,系统会先检查其本地hosts文件中是否存在URL映射关系,若有则优先调用IP地址映射,完成当前域名的解析。
2、如果hosts中没有该域名的映射,则查找本地DNS解析器缓存,查看是否有该URL的映射关系,如果有,则直接返回,完成域名解析。
3、如果hosts和本地DNS解析器缓存中没有对应的URL映射关系,则第一步就是查找TCP/IP参数中设置的首选DNS服务器,这里我们称之为本地DNS服务器,当该服务器接收到查询时,如果要查询的域名包含在本地配置区域资源中,则将解析结果返回给客户端,完成域名解析,此解析具有权威性。
4、如果要查询的域名没有被本地DNS服务器区域解析,但是服务器缓存了这个URL映射关系,那么就会调用这个IP地址映射来完成域名解析,这个解析不具有权威性。
5、若本地DNS服务器本地区域文件和缓存解析均无效,则根据本地DNS服务器的设置进行查询(是否设置了转发器)
如果不采用转发模式,本地DNS会将请求发送给13台根DNS服务器,根DNS服务器收到请求后,判断谁有权限管理这个域名(.com),并返回一个顶级域名服务器的IP地址。
本地DNS服务器收到IP信息后,会联系负责.com域名的服务器。
负责.com域名的服务器接到请求后,如果自身无法解析,就会寻找管理该.com域名的下一级DNS服务器地址()并将其交给本地DNS服务器。
当本地DNS服务器收到这个地址后,就会去寻找域名服务器,重复上面的步骤进行查询,直到找到主机为止。
6. 如果使用转发模式,则本台DNS服务器会将请求转发给上级DNS服务器,由上级DNS服务器进行解析。如果上级服务器无法解析,则继续查找根DNS或将请求转发给上级服务器,以此类推。无论本地DNS服务器使用转发还是根提示,最终都会将结果返回给本地DNS服务器,本地DNS服务器再将结果返回给客户端。
CNAME 解析
在DNS协议中,有多种记录类型。例如,最常见的A记录将主机名解析为服务器的IP地址。
NS记录:域名服务器记录,如果需要将子域名交给其他DNS服务商解析,需要添加NS记录;
CNAME 记录:是主机名到主机名的映射,例如,您有,
如果你想将访问指向,你可以使用 C 记录,
当访问的时候就会进行解析,然后通过A记录,解析出IP地址。
2. 子域名劫持漏洞原因
子域名劫持的前提是利用CNAME解析,有些服务商在提供服务的时候,会提供一个域名来访问对应的服务。
例如,如果您在 上申请一项服务,它将为您分配服务的地址。
但您已经拥有自己的域名,并希望其他人能够通过您的域名访问您注册的服务
然后您可以通过自行添加 CNAME 记录来实现这一点。
例如添加一个子域名,类型为CNAME,
类型记录是
这时候用户访问的问题就解决了。
如果某天服务到期或者关闭,而没有删除域名对应的CNAME记录,
这时候攻击者就申请一个服务域名,把自己的内容放在上面,然后用户访问的时候,就会访问到攻击者的页面。
对于用户来说这是一个值得信任的域名,而对这个域名的信任使得攻击者可以对用户发起钓鱼攻击。
另一方面,如果网站使用单点登录并在整个域中共享,攻击者可以通过诱骗用户访问具有子域劫持的域来获得用户的访问权限。
综上所述,子域名劫持的前提条件是:
3. DNS记录查询工具
通过以上原因的解释,我们可以了解到,子域名劫持漏洞的存在,首先需要有CNAME记录。
例如,对于已知的子域名,可以通过检查子域名的 DNS 记录来检查其是否有 CNAME 记录。这里可以使用的查询命令有 host、dig
命令
用于查询DNS记录,查看域名解析
可以使用[ dns-]直接查询域名的解析,例如
使用 [ -qt=type dns-] 查询特定类型的记录,例如查询 CNAME 记录
上述命令后面的dns-是使用的DNS服务器,如果不添加则使用默认的DNS服务器,可以自行指定,例如使用8.8.8.8
主机命令
host 命令是分析域名查询的常用工具。它是一个用于查找域名 IP 地址的 DNS 查找实用程序。
它还执行反向查找以查找与 IP 地址关联的域名。
句法
host [OPTIONS] {name} [server]
用法
host: illegal option -- h
Usage: host [-aCdilrTvVw] [-c class] [-N ndots] [-t type] [-W time]
[-R number] [-m flag] [-p port] hostname [server]
-a is equivalent to -v -t ANY
-A is like -a but omits RRSIG, NSEC, NSEC3
-c specifies query class for non-IN data
-C compares SOA records on authoritative nameservers
-d is equivalent to -v
-l lists all hosts in a domain, using AXFR
-m set memory debugging flag (trace|record|usage)
-N changes the number of dots allowed before root lookup is done
-p specifies the port on the server to query
-r disables recursive processing
-R specifies number of retries for UDP packets
-s a SERVFAIL response should stop query
-t specifies the query type
-T enables TCP/IP mode
-U enables UDP mode
-v enables verbose output
-V print version number and exit
-w specifies to wait forever for a reply
-W specifies how long to wait for a reply
-4 use IPv4 query transport only
-6 use IPv6 query transport only
查询DNS记录并显示进程详细信息
$ host -a www.baidu.com
Trying "www.baidu.com"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 49888
;; flags: qr rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;www.baidu.com. IN ANY
;; ANSWER SECTION:
www.baidu.com. 0 IN CNAME www.a.shifen.com.
Received 74 bytes from 172.27.224.1#53 in 20 ms
查询指定类型的DNS记录
$ host -t CNAME www.baidu.com
www.baidu.com is an alias for www.a.shifen.com.
dig 命令
dig命令用于查询单个主机的信息。
dig命令默认的输出信息比较丰富,大致可以分为5个部分。
dig 命令的版本和输入的参数。服务返回的一些技术细节,比较重要的。如果值为,则表示本次查询成功完成。" " 表示我们要查询的域名。" " 是查询结果。本次查询的一些统计信息,比如用了多长时间,查询了哪个 DNS 服务器,什么时候执行的查询等。
dig命令默认只查询A记录,可以在后面加上type来查询特定类型。
$ dig www.baidu.com CNAME
; <<>> DiG 9.16.6-Debian <<>> www.baidu.com CNAME
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 53008
;; flags: qr rd ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available
;; QUESTION SECTION:
;www.baidu.com. IN CNAME
;; ANSWER SECTION:
www.baidu.com. 0 IN CNAME www.a.shifen.com.
;; Query time: 30 msec
;; SERVER: 172.27.224.1#53(172.27.224.1)
;; WHEN: Sun Jun 13 22:16:34 CST 2021
;; MSG SIZE rcvd: 74
dig 命令可以设置为使用特定的 DNS 服务器进行查询
$ dig @8.8.8.8 www.baidu.com
; <<>> DiG 9.16.6-Debian <<>> @8.8.8.8 www.baidu.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 30073
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;www.baidu.com. IN A
;; ANSWER SECTION:
www.baidu.com. 442 IN CNAME www.a.shifen.com.
www.a.shifen.com. 39 IN CNAME www.wshifen.com.
www.wshifen.com. 39 IN A 103.235.46.39
;; Query time: 90 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Sun Jun 13 22:19:20 CST 2021
;; MSG SIZE rcvd: 111
上面介绍的三个命令都是非常强大的查询域名信息的命令,很多发现子域名劫持漏洞的工具都是用到这三个命令的。
4. 子域名劫持和挖矿思路
要发现子域名解析漏洞,首先需要挖掘出采集目标的子域名,并密切关注这些子域名的变化情况。
收集子域名的方式有很多,同时也有很多优秀的查询工具,比如Layer子域名挖掘等。
还有其他的收集方式,比如之前的文章中介绍的。
收集到子域名之后,可以通过两种方式检查这些子域名是否存在子域名劫持漏洞,一种方法是访问这些域名,根据网页内容进行判断。
例如,如果页面内容如下,则可能存在子域名劫持
对于可能存在子域名劫持的页面,有一个项目做了一些整理和收集。can-i-take-over-xyz 整理出了很多可能存在子域名劫持的页面,列出了它们的指纹和相关文章。
另外一个检测思路是检查域名的DNS记录,如果有可疑记录,可以采用人工验证的方式检测漏洞是否存在。
5.漏洞探索工具
Sub 404 是由 编写的一个工具,使用异步方法批量检查子域名劫持漏洞。
它会批量查询目标URL的状态,通过404页面的内容判断是否存在子域名劫持漏洞,另外也会通过获取CNAME来进行检测。使用该工具的前提是需要有并安装。
如果你不想单独安装这两个工具,你可以使用 来运行它。
操作模式
https://github.com/r3curs1v3-pr0xy/sub404.git
cd sub404
docker build -t sub404 .
docker run --rm sub404 -h
选项
描述
例子
-d
目标的域名。
.py-d .tech 复制代码
-F
如果未安装,请提供子域文件的位置以检查是否被接管。
.py-f.txt 文件
-p
设置请求的协议。默认值为“http”。
.py -f .txt -p https 或 .py -d .tech -p https
-o
将和的唯一子域输出到文本文件。默认为“.txt”
.py-d.tech-o.txt
-H
显示此帮助消息并退出
.py -h
docker run --rm sub404 -d xxxxx.com #这里使用docker方式运行,并且只测试一个域名的子域名劫持漏洞
运行过程中可能会报错,这个是错误,主要是版本问题导致的。
你可以忽略它或者自行修改。这个工具很强大,检测速度很快。如果你收集了子域名,你可以把子域名放在一个文本文件中,使用-f选项来检测文件中的子域名。
NtHiM()
NtHiM 还可用于测试单个目标和批次
用法
选项
描述
例子
-H
显示使用相关的帮助
氢键
-t
扫描单个目标
韋姆
-F
从文件中扫描目标列表
NtHiM -f 主机名.txt
-C
并发线程数
NtHiM -c 100 -f 主机名.txt
-v
启用详细模式
NtHiM -v -f 主机名.txt
-o
将输出写入文件
NtHiM -f 主机名.txt -o 输出.txt
-u
更新签名缓存
尿素
-V
显示版本信息
病毒
以上只是我用来发现子域名劫持漏洞的两个工具,还有很多其他具有类似功能的漏洞检测工具,你甚至可以根据自己的经验编写一个自动化验证工具。
6. 子域名劫持漏洞示例
声明:截至本文发布时,该漏洞已报告给制造商并修复
在渗透测试过程中,获取了待测试站点的主域名。这里我们用它来表示
首先,在资产清收过程中,收集了一些子域名。
我使用了一些常见的工具,比如Layer子域名挖掘,在获取了大量子域名后,我想到了之前见过的子域名劫持漏洞。
这里用了一些工具进行测试,包括上面介绍的两个工具,运行工具测试后,发现一个存在漏洞的子域名,这里调用了这个子域名,然后访问这个子域名,发现如下图所示的网页提示。
通过检查can-i-take-over-xyz中可能引入子域名劫持的页面提示信息
通过这个提示[]可以判断是可以被劫持的
另外使用dig命令查看CNAME记录,可以看到cname记录
然后尝试劫持子域名,首先需要注册一个账号,这个网站提供的服务是收费的,不过第一次注册可以试用几天。
注册完之后,创建托管域名和页面,假设这里创建的域名是,可以自己定义页面内容,我只是写了一点可以验证的内容,写完之后修改页面的信息,并连接到
这里把之前发现有漏洞的域名写进去,会验证是否可以连接到这个域名,验证方式是查询域名是否有cname记录。
修改保存之后,子域名的劫持就完成了,现在访问的时候就会访问到你创建的页面内容。
7. 结论
本文从域名解析的过程以及子域名劫持漏洞的原因简单介绍一下该漏洞的原理。
随后通过一些工具的介绍以及漏洞挖掘的思路阐述了漏洞利用的方法与途径,最后通过一个实例详细介绍了存在漏洞的子域名的验证流程。
劫持子域名的方法有很多,有些甚至可以劫持电子邮件内容,但由于我们对此没有太多经验,因此就不详细介绍了。
參考
扫一扫在手机端查看
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。