很久以前我看过一篇关于子域名劫持的文章,但直到最近一次测试中真正遇到才真正遇到,从什么是域名解析开始,大致梳理域名劫持漏洞的原因、挖掘思路、工具,最后通过一个真实案例梳理整个漏洞。
一。域名解析
DNS解析,也称为DNS解析,是将域名指向网络中的IP地址的过程。
要访问网络中的服务,需要获取它们的IP地址才能访问,但是记住不同的IP地址太麻烦了,而且通过使用域名解析,人们不需要记住繁琐的IP地址,而是可以通过一个简单易懂的域名访问相应的网站。
在DNS中,一个域名只能对应一个IP地址,但一个IP地址可以对应多个域名。
用于解析域名的协议称为 DNS 协议,也称为 DNS 协议。
域名解析的过程
1.在浏览器中输入域名,系统会先检查本地hosts文件是否具有此URL映射关系,如果有,则先调用IP地址映射,完成当前域名的解析。
2. 如果主机中没有此域名的映射,则找到本地DNS解析缓存,查看是否存在此URL映射关系,如果有,则直接返回以完成域名解析。
3.如果主机和本地DNS解析缓存没有对应的URL映射关系,首先会找到在TCP/IP参数中设置的首选DNS服务器,这里我们称之为本地DNS服务器,当服务器收到查询时,如果要查询的域名,则包含在本地配置区域资源中, 然后将解析结果返回给客户端,完成域名解析,此解析具有权威性。
4、如果待查询的域名未被本地DNS服务器可用区解析,但服务器已缓存了URL映射关系,则调用IP地址映射完成域名解析,此解析不具有权威性。
5.如果本地DNS服务器的本地区域文件和缓存解析无效,则根据本地DNS服务器的设置(是否设置转发器)进行查询。
如果不使用转发模式,本地DNS会向13根DNS发送请求,根DNS服务器在收到请求后会确定谁有权管理域名(.com),并返回负责顶级域名服务器的IP地址。
当本地 DNS 服务器收到 IP 消息时,它将联系负责.com域的服务器。
当负责.com域的服务器收到请求时,如果它自己无法解析该请求,它将在管理本地 DNS 服务器的 .com 域的域的下一级找到一个 DNS 服务器地址 ()。
当本地DNS服务器收到此地址时,它将找到域服务器并重复上述操作,直到找到主机。
6.如果使用转发模式,DNS服务器会将请求转发到更高级别的DNS服务器,由更高级别的服务器解析,如果上级服务器无法解析,则找到根DNS或将传输请求转移到更高级别的DNS,依此类推。无论本地DNS服务器转发还是root提示,结果都会返回到本地DNS服务器,而本地DNS服务器又将结果返回给客户端。
CNAME解析
在DNS协议中,有各种类型的记录,例如,最常见的A记录是将主机名解析为服务器的IP;
NS记录:域名服务器记录,如果需要将子域名交给其他DNS服务商进行解析,则需要添加NS记录;
CNAME :是主机名到主机名的映射,例如 you own 和 ,
如果你想指向正确的访问,你可以通过C记录它
访问时,它将被解析,然后通过A记录,解析后的IP地址将被解析。
二。子域劫持漏洞的原因
子域劫持的前提是使用CNAME解析,部分服务商在提供服务时会提供域名来访问相应的服务
例如,如果您在 上申请服务,它会为您分配一个地址作为您的服务
但是您已经拥有自己的域名,并希望其他人使用您的域名来访问您注册的服务
然后,您可以通过为自己添加 CNAME 记录来执行此操作
例如,添加CNAME类型的子域名
类型记录为
此时,将解决用户访问问题。
某一天开通服务或停用服务,且域名中未删除CNAME记录
在这种情况下,攻击者申请服务域名并放置自己的内容,因此当用户访问时,它是攻击者的页面。
对于用户来说,它是一个可信的域名,对这个域名的信任会导致攻击者可以对用户进行钓鱼攻击。
另一方面,如果网站使用单点登录并在整个域中共享,攻击者可以通过诱骗用户访问具有子域劫持的域名来获取用户。
综上所述,形成子域劫持的前提条件是
:
3. DNS记录查询工具
通过对以上原因的解释,我们可以理解,要想出现子域劫持漏洞,首先需要有CNAME记录。
例如,对于已知的子域名,您可以查看该子域名的DNS记录,以确定其是否具有CNAME记录
命令
用于查询DNS记录,查看域名解析状态
您可以使用 [ dns-] 直接查询域名的解析状态,例如
使用 [ -qt=type dns-] 查询特定类型的记录,例如 CNAME 记录
dns——上面命令之后——是使用的DNS服务器,不添加时,使用默认的DNS服务器,可以自己指定,比如使用8.8.8.8
host 命令
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 记录,您可以稍后添加类型来查询特定类型
$ 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
上面描述的三个命令都是查询域名信息非常强大的命令,很多针对子域劫持漏洞的挖掘工具都是用到这三个命令的。
四。子域劫持挖矿思路
要查找子域解析漏洞,首先需要深入挖掘采集目标的子域,并密切关注这些子域的变化
收集子域的方法有很多种,查询也有很多优秀的工具,比如图层子域挖掘器等
还有许多其他方法可以做到这一点,例如前面文章中描述的方法。
收集子域名后,有两种方法可以判断这些子域名是否存在子域名劫持漏洞:一种是访问这些域名,根据网页内容进行判断。
例如,如果页面内容如下,则可能存在子域劫持
对于可能存在子域劫持的页面,有些项目已经整理和收集,can-i-take-over-xyz 已经整理出了很多可能存在子域劫持的页面,列出了它们的指纹和相关文章。
另一种检查方法是检查域名的DNS记录,如果有可疑记录,那么可以手动验证是否存在漏洞。
五。利用挖矿工具
Sub 404 是一种工具,用于使用异步方法批量检查子域劫持漏洞。
它会批量查询目标 URL 的状态,通过 404 页面的内容判断是否存在子域劫持漏洞,还会通过获取 CNAME 进行检测,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
显示与使用相关的帮助
NtHiM -h
-t
扫描单个目标
NtHiM -t
-F
扫描文件中的目标列表
NtHiM -f 主机名 .txt
-C
并发线程数
NtHiM -c 100 -f 主机名 .txt
-v
启用详细模式
NtHiM -v -f 主机名 .txt
-o
将输出写入文件
NtHiM -f 主机名 .txt -o 输出.txt
-u
更新签名缓存
NtHiM -u
-V
显示版本信息
NtHiM -V
这些只是我用来挖掘子域劫持漏洞的两个工具,还有相当多的其他漏洞检测工具具有类似的功能,甚至能够根据自己的经验编写自动验证工具。
六。子域劫持漏洞示例
免责声明:截至发布时,此漏洞已提交给供应商,修复已完成
在渗透测试期间,获得了待测站点的主域名,此处暂时使用该域名
首先,在资产收集过程中,收集了一些子域名
使用一些比较常见的工具,比如层子域矿工,在获取了大量的子域后,我想出了我之前见过的子域劫持漏洞
这里我们用了一些工具进行测试,包括上面描述的两个工具,运行工具测试后,我们发现了一个提示漏洞的子域名,这里调用,然后通过访问,我们找到了一个网页提示信息,如下图所示
通过查看 can-i-take-over-xyz 中描述的可能存在子域劫持的页面的提示
从这个提示[]可以判断它可以被劫持
此外,如果使用 dig 命令查看 CNAME 记录,则可以看到 CNAME 记录
那么要尝试劫持一个子域名,你首先需要注册一个账号,这个网站提供的服务是收费的,但第一次注册可以试几天。
注册后,创建一个托管域名和页面,假设这里创建的域名是,这样就可以自己定义页面的内容了,我只要写一点可以验证的内容,写完后修改页面的信息,连接到
这里我们写之前发现有漏洞的域名,会验证是否可以连接域名,验证的方法是查询域名是否有CNAME记录。
修改保存后,子域的劫持完成,当您去访问时,您将访问您创建的页面的内容。
七。总结
本文从域名解析过程及子域名劫持漏洞的成因等方面简要介绍漏洞原理
随后,通过介绍一些工具和挖掘思路,演示了挖掘漏洞的方法和方法,最后通过实例详细介绍了某有漏洞的子域名的验证过程。
劫持子域的方法有很多种,有些甚至可以劫持邮件内容,但因为这样的接触不多,所以就不多介绍了
参考
:
扫一扫在手机端查看
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。