一次成功的子域名劫持
很久之前就看过介绍子域名劫持的文章,可是一直没有遇到过,直到在最近的一次测试中真正遇到了,下面从什么是域名解析开始,大体梳理一下子域名劫持漏洞的成因、挖掘思路、工具,最后通过一个真实的案例来将整个漏洞做一个梳理。
一.域名解析
域名解析也叫DNS解析,是将域名指向网络中的IP地址。
访问网络中的服务都需要获取其IP地址才能访问,但是记住不同的IP地址过于繁琐,通过使用域名解析,可以使人们不用记住繁琐的IP地址,而是可以通过一个通俗易懂的域名来访问相应的网站。
在域名解析中,一个域名只能对应一个IP地址,但是一个IP地址可以对应多个域名。
用于解析域名的协议叫做域名解析协议,也就是DNS协议。
域名解析的过程
1、在浏览器中输入www.1987web.com域名,系统会先检查自己本地的hosts文件是否有这个网址映射关系,如果有就先调用这个IP地址映射,完成当前域名的解析。
2、如果hosts里没有这个域名的映射,则查找本地DNS解析器缓存,是否有这个网址映射关系,如果有,直接返回,完成域名解析。
3、如果hosts与本地DNS解析器缓存都没有相应的网址映射关系,首先会找TCP/IP参数中设置的首选DNS服务器,在此我们叫它本地DNS服务器,此服务器收到查询时,如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性。
4、如果要查询的域名,不由本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析,此解析不具有权威性。
5、如果本地DNS服务器本地区域文件与缓存解析都失效,则根据本地DNS服务器的设置(是否设置转发器)进行查询
如果未用转发模式,本地DNS就把请求发至13台根DNS,根DNS服务器收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP。
本地DNS服务器收到IP信息后,将会联系负责.com域的这台服务器。
这台负责.com域的服务器收到请求后,如果自己无法解析,它就会找一个管理.com域的下一级DNS服务器地址(1987web.com)给本地DNS服务器。
当本地DNS服务器收到这个地址后,就会找1987web.com域服务器,重复上面的动作,进行查询,直至找到www.1987web.com主机。
6、如果用的是转发模式,此DNS服务器就会把请求转发至上一级DNS服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根DNS或把转请求转至上上级,以此循环。不管是本地DNS服务器用是是转发,还是根提示,最后都是把结果返回给本地DNS服务器,由此DNS服务器再返回给客户机。
CNAME解析
在DNS协议中,存在多种记录类型,比如最常见的A记录是把某个主机名解析到服务器的IP;
NS记录:域名服务器记录,如果需要把子域名交给其他DNS服务商解析,就需要添加NS记录;
CNAME记录:是主机名到主机名的映射,比如你拥有aaa.com和bbb.com,
你想把对aaa.com的访问指向到bbb.com,就可以通过C记录,
当访问aaa.com时,会解析到bbb.com,然后通过A记录,解析到了bbb.com的IP地址。
二.子域名劫持漏洞成因
子域名劫持的前提就是使用了CNAME解析,一些服务提供商会在提供服务的时候提供一个域名用来访问相应的服务
例如在Shopify上申请了服务,它给你分配了test.shopify.com作为你的服务的地址
但是你已经有自己的域名了,想让其他人通过你的域名来访问自己注册的服务
那么可以通在自己aaa.com上增加CNAME记录来实现,
例如添加了一个shop.aaa.com的子域名,类型为CNAME,
类型记录为test.shopify.com
这时用户访问shop.aaa.com会解析到test.shopify.com。
如果有一天开通的服务到期了,或者是关闭了服务,而没有在域名上删除相应的CNAME记录
这时攻击者自己申请一个test.shopify.com的服务域名并且放上自己的内容,那么当用户访问shop.aaa.com时,访问的就是攻击者的页面。
对于用户而言,shop.aaa.com是一个可信的域名,对于这个域名的信任导致攻击者可以对用户实施钓鱼攻击。
从另一方面来说,如果网站使用了单点登录,并且Cookies在整个域中共享,攻击者可以通过诱导用户访问具有子域名劫持的域名来获取用户的Cookies。
综合上面来看,形成子域名劫持需要的前提条件是
子域名shop.aaa.com存在CNAME记录,并且指向另一个域,例如test.shopify.com
test.shopify.com过期或者服务关闭,其他用户可以在服务提供商申请当前域名
shop.aaa.com没有删除之前的CNAME记录
三.DNS记录查询工具
通过上面成因的讲解,可以了解到要存在子域名劫持漏洞,首先需要有CNAME记录。
对于一个已知的子域名,例如shop.aaa.com,可以通过查看该子域名的DNS记录来判断是否具有CNAME记录,这里可以使用的查询命令有nslookup、host,dig
nslookup命令
用来查询DNS的记录,查看域名解析情况
可以使用[nslookup 子域名 dns-server]来直接查询域名的解析情况,例如
使用 [nslookup -qt=type 子域名 dns-server] 来查询特定类型的记录,例如查询CNAME记录
上面命令后面的dns-server是使用的DNS服务器,不加的时候是使用默认的DNS服务器,可以自己指定,例如使用8.8.8.8
host命令
host 命令是常用的分析域名查询工具,是一个 DNS 查找实用程序,用于查找域名的 IP 地址。
它还执行反向查找,查找与 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
查询www.baidu.com 的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 -tCNAME www.baidu.comwww.baidu.comisanaliasforwww.a.shifen***.com.
dig命令
dig命令是用来查询单个主机的信息
dig 命令默认的输出信息比较丰富,大概可以分为 5 个部分。
dig 命令的版本和输入的参数。
服务返回的一些技术详情,比较重要的是 status。如果 status 的值为 NOERROR 则说明本次查询成功结束。
"QUESTION SECTION" 显示我们要查询的域名。
"ANSWER SECTION" 是查询到的结果。
本次查询的一些统计信息,比如用了多长时间,查询了哪个 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
上面介绍的三个命令都是查询域名信息的很强大的命令,子域名劫持漏洞的挖掘工具很多都是用到了这三个命令。
四.子域名劫持挖掘思路
想要发现子域名解析漏洞,首先需要挖掘收集目标的子域名,并且密切关注这些子域名的变化
收集子域名的方式有很多,也有很多优秀的工具可以进行查询,例如Oneforall、Layer子域名挖掘机、Subdomain3、Sublist3r等
还有一些其他的方法来进行收集,例如在之前的文章中有介绍。
收集完成子域名后,有两种方式来对这些子域名是否存在子域名劫持漏洞,一种思路是访问这些域名,根据网页内容进行判断。
例如页面内容如下时,可能存在github子域名劫持
对于可能存在子域名劫持的页面,这里有个项目已经做了整理和收集,can-i-take-over-xyz对许多可能存在子域名劫持的页面都进行了整理,列出了其指纹以及相关的文章。
另外一个检测的思路就是检查域名的DNS记录,如果存在可疑的记录,那么就可以通过手工验证的方法是来检测漏洞是否存在。
五.漏洞挖掘工具
sub404
Sub 404是一个使用python编写的工具,利用异步方式批量检查子域劫持漏洞。
它会批量查询目标URL的状态,通过404页面的内容来判断是否具有子域名劫持漏洞,另外,它还会通过获取CNAME来进行检测,这个工具使用的前提是安装了sublist3r 和 subfinder。
如果不想再另外安装这两个工具,可以使用docker来运行sub404。
Docker运行方式
https://github.com/r3curs1v3-pr0xy/sub404.gitcdsub404dockerbuild-tsub404.docker run --rmsub404-h
选项 | 描述 | 例子 |
---|---|---|
-d | 目标的域名。 | python3 sub404.py -d noobarmy.tech |
-f | 如果未安装 subfinder,请提供子域文件的位置以检查接管。 | python3 sub404.py -f subdomain.txt |
-p | 为请求设置协议。默认值为"http"。 | python3 sub404.py -f subdomain.txt -p https 或 python3 sub404.py -d noobarmy.tech -p https |
-o | 将 sublist3r 和 subfinder 的唯一子域输出到文本文件。默认为"uniqueURL.txt" | python3 sub404.py -d noobarmy.tech -o output.txt |
-h | 显示此帮助信息并退出 | python3 sub404.py -h |
dockerrun --rm sub404 -d xxxxx.com这里使用docker方式运行,并且只测试一个域名的子域名劫持漏洞
在运行过程中可能会报一个错误,这是sublist3r的报错,主要是python版本问题导致的。
可以忽略,也可以自己动手改一下,这个工具是很厉害的,检测速度也非常快,如果自己已经收集了子域名,可以将子域名放到一个文本文件里,使用-f选项来检测文件中的子域名。
NtHiM(https://github.com/TheBinitGhimire/NtHiM)
NtHiM同样可以针对单个目标和批量进行测试
用法
选项 | 描述 | 例子 |
---|---|---|
-H | 显示与使用相关的帮助 | NtHiM -h |
-t | 扫描单个目标 | NtHiM -t https://example.example.com |
-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 |
上面仅仅是列举了两个我在挖掘子域名劫持漏洞的两个工具,还有不少其他的漏洞检测工具具有类似的功能,甚至是可以自己根据经验编写一个自动化的验证工具。
六.子域名劫持漏洞实例
声明:截至文章发出时,该漏洞已提交厂商并且修复完成
在一次渗透测试过程中,获得了要测试站点的主域名,这里就暂且用xxxxxx.com来表示
首先在资产收集的过程中,就收集了一些子域名
使用了一些比较常见的工具,例如Oneforall、Layer子域名挖掘机,在获取了大量子域名后想到了之前看过的子域名劫持漏洞
这里就用到了一些工具进行测试,其中就有上面介绍的两个工具,运行工具测试后发现了一个提示具有漏洞的子域名,这里就叫hacker.xxxxxx.com,然后通过访问,发现了一个网页的提示信息如下图所示
通过查看can-i-take-over-xyz中介绍的可能存在子域名劫持的页面的提示信息
通过这个提示[https://github.com/EdOverflow/can-i-take-over-xyz/issues/46]可以判断可以对其进行劫持
另外使用dig命令查看hacker.xxxxxx.com的CNAME记录,可以看到具有myshopify的cname记录
然后尝试对hacker.******.com进行子域名劫持,首先需要注册一个myshopify的账号,这个网站提供的服务是收费的,但是首次注册可以试用几天。
注册好后创建一个shopify托管域名和页面,假设这里创建的域名是test.myshopify.com,这个可以自己定义页面的内容,我就只写了一点可以验证的内容,写好后修改页面的信息,将其连接到hacker.******.com
这里就将之前发现具有漏洞的域名写上,它会验证是否可以与这个域名连接,验证的方式就是查询那个域名是否具有shops.myshopify.com的cname记录。
七.总结
本文从域名解析的过程和子域名劫持漏洞产生的原因来大概的介绍了一下漏洞原理,
后面又通过对一些工具的介绍和挖掘思路的介绍来展示的挖掘该漏洞的方式和方法,最后通过实例,来对一个具有漏洞的子域名的验证过程做了详细介绍。
子域名劫持的方式还有很多种,有的甚至可以对邮件内容进行劫持,但是由于那样的接触的不多,所以没有做过多的介绍.