子域名劫持漏洞的挖掘指南
在HackerOne实时更新的公开漏洞推送Hacktivity消息中,我们可以发现,其中的子域名劫持漏洞(Subdomain Takeover)占比不少。自从2014年Detectify实验室发布了一系列子域名劫持攻击姿势的文章之后,众测行业出现了大量此类问题相关的上报漏洞。
子域名劫持漏洞的基本前提可以大致的解释为,发生了错误配置情况,对应主机指向了一个当前未在用的特定服务,这样一来,攻击者就能通过在该特定的第三方服务中注册账户,声明对该子域的接管权限,由此,在该子域上部署网络服务,实现对该子域有目的的利用。作为一位白帽和安全分析师,我每天都会遇到这类漏洞问题。今天,我就来和大家聊聊子域名错误配置导致的子域名劫持漏洞相关的理解、挖掘、利用和上报,文章假设读者具备了一定的DNS知识和子域名设置基础。
子域名劫持漏洞介绍
如果你此前不了解子域名劫持漏洞,想从基本原理听起,我这里就设计了一个简单的实例场景。在该场景中,假设example.com是你在参与漏洞众测的目标网站,经过对example.com的所有子域名进行枚举之后,发现了其中一个子域名subdomain.example.com,该子域名错误配置指向了一个GitHub页面。由此,我们可以先来看看该子域名的DNS记录,在这里假设该子域名所属的GitHub页面存在多条指向GitHub特定IP地址的A记录:
$ host subdomain.example.com
subdomain.example.com has address 192.30.252.153
subdomain.example.com has address 192.30.252.154
$ whois 192.30.252.153 | grep "OrgName"
OrgName: GitHub, Inc.
网页访问subdomain.example.com后,我们可以发现以下404响应页面:
看到这里,大多数白帽可能会觉得有戏了。这个404页面表示,在域名对应网站的顶级根目录下没被注册部署任何网页内容,因此,我们可以尝试去注册把该子域名接管为我们个人的GitHub库所有。但是,请注意,出现这种情况,并不代表所有对应的域名都存在劫持漏洞。因为有一些域名应用可能还需要检查具体的HTTP和HTTPS响应情况,以此来判断域名控制权限,而另外有些域名就不存在劫持漏洞。
这里,假设就存在子域名劫持漏洞吧。当我们把该子域名添加进入个人 GitHub 项目之后,就能把它部署上我们自己的Web内容了,也就是说,我们就能把子域名接管为我们自己所有了。如下可以让subdomain.example.com指向任何你部署的网页内容:
二阶子域名劫持漏洞
这里所说的二阶子域名劫持漏洞,有点像过期坏链劫持(Broken Link Hijacking),这种情况下的子域名,并不属于目标网站所有,但却是用来运行目标网站的网页内容的。也就是说,如目标网站网页内容中某个资源需要从外部导入的第三方资源,举例来说,像js文件一样,那么,攻击者就可以通过JavaScript的Blob对象类型进行导入,从而声明对目标网站相关子域名的控制权限。
这种在网页页面的主机劫持可以导致存储型跨站漏洞,攻击者可以针对目标网站页面,利用这种模式来加载任意的客户端代码。我在此提出这种威胁,就是希望我们不要把想像力只限制在子域名身上,还可以延伸到代码审查和目标网站的主机映射等方面。
像下图网站中,存在导入的第三方资源http://subdomain.example.com/script.js,那么,能否存在subdomain.example.com可被劫持,从而我可以变换script.js实现对example.com的间接劫持呢?
当然,也要说明的是,如果你想对某个子网站域名进行劫持,那么可以花点时间,去看看该网站上各个页面中的第三方导入资源是否能被劫持利用。
子域名枚举和探测
现在,我们对如何在错误配置的子域名上部署我们自己的网页内容有了大致了解,接下来,我就来介绍发现漏洞子域名的各种技术、技巧和工具。
在深入之前,我们需要区分检索( Scraping )和暴力猜解(Brute Forcing)的不同,因为这两种方法都能帮助你发现子域名,但最终结果却有所不同。检索是一种被动的侦测方式,它利用DNS Dumpster和VirusTotal等外部服务和资源,来收集属于某个特定主机的子域名。这种方式能快速检索出外部服务资源中之前加载过的子域记录,算是一种不费太多精力的子域名发现方式。如以下DNS Dumpster网站中记录的reddit.com子域名情况:
检索( Scraping )方式中不仅中以包含索引页面,还可以添加进目标网站的GIT库、内容安全策略头、源代码和漏洞跟踪消息等反馈源,只要你能想得到,检索列表是非常之多的。我就经常更新我自己的检索列表资源库,反正你应用的技术越多越奇特,那么最终你发现的结果也会与众不同。所以,从这一点来说,在做漏洞众测时,我们一定要具备创新精神。
Sublist3r算是检索( Scraping )方式的一个简单子域名发现工具了,它利用了轻量级的Python脚本,从各种搜索引擎、SSL证书和DNS记录网站中来收集目标子域名。具体的安装和应用如下图所示:
在HackerOne实时更新的公开漏洞推送Hacktivity消息中,我们可以发现,其中的子域名劫持漏洞(Subdomain Takeover)占比不少。自从2014年Detectify实验室发布了一系列子域名劫持攻击姿势的文章之后,众测行业出现了大量此类问题相关的上报漏洞。
子域名劫持漏洞的基本前提可以大致的解释为,发生了错误配置情况,对应主机指向了一个当前未在用的特定服务,这样一来,攻击者就能通过在该特定的第三方服务中注册账户,声明对该子域的接管权限,由此,在该子域上部署网络服务,实现对该子域有目的的利用。作为一位白帽和安全分析师,我每天都会遇到这类漏洞问题。今天,我就来和大家聊聊子域名错误配置导致的子域名劫持漏洞相关的理解、挖掘、利用和上报,文章假设读者具备了一定的DNS知识和子域名设置基础。
子域名劫持漏洞介绍
如果你此前不了解子域名劫持漏洞,想从基本原理听起,我这里就设计了一个简单的实例场景。在该场景中,假设example.com是你在参与漏洞众测的目标网站,经过对example.com的所有子域名进行枚举之后,发现了其中一个子域名subdomain.example.com,该子域名错误配置指向了一个GitHub页面。由此,我们可以先来看看该子域名的DNS记录,在这里假设该子域名所属的GitHub页面存在多条指向GitHub特定IP地址的A记录: 内容来自无奈安全网
$ host subdomain.example.com
subdomain.example.com has address 192.30.252.153
subdomain.example.com has address 192.30.252.154
$ whois 192.30.252.153 | grep "OrgName"
OrgName: GitHub, Inc.
网页访问subdomain.example.com后,我们可以发现以下404响应页面:
看到这里,大多数白帽可能会觉得有戏了。这个404页面表示,在域名对应网站的顶级根目录下没被注册部署任何网页内容,因此,我们可以尝试去注册把该子域名接管为我们个人的GitHub库所有。但是,请注意,出现这种情况,并不代表所有对应的域名都存在劫持漏洞。因为有一些域名应用可能还需要检查具体的HTTP和HTTPS响应情况,以此来判断域名控制权限,而另外有些域名就不存在劫持漏洞。
这里,假设就存在子域名劫持漏洞吧。当我们把该子域名添加进入个人 GitHub 项目之后,就能把它部署上我们自己的Web内容了,也就是说,我们就能把子域名接管为我们自己所有了。如下可以让subdomain.example.com指向任何你部署的网页内容:
二阶子域名劫持漏洞
这里所说的二阶子域名劫持漏洞,有点像过期坏链劫持(Broken Link Hijacking),这种情况下的子域名,并不属于目标网站所有,但却是用来运行目标网站的网页内容的。也就是说,如目标网站网页内容中某个资源需要从外部导入的第三方资源,举例来说,像js文件一样,那么,攻击者就可以通过JavaScript的Blob对象类型进行导入,从而声明对目标网站相关子域名的控制权限。
这种在网页页面的主机劫持可以导致存储型跨站漏洞,攻击者可以针对目标网站页面,利用这种模式来加载任意的客户端代码。我在此提出这种威胁,就是希望我们不要把想像力只限制在子域名身上,还可以延伸到代码审查和目标网站的主机映射等方面。
像下图网站中,存在导入的第三方资源http://subdomain.example.com/script.js,那么,能否存在subdomain.example.com可被劫持,从而我可以变换script.js实现对example.com的间接劫持呢?
www.wnhack.com
当然,也要说明的是,如果你想对某个子网站域名进行劫持,那么可以花点时间,去看看该网站上各个页面中的第三方导入资源是否能被劫持利用。
子域名枚举和探测
现在,我们对如何在错误配置的子域名上部署我们自己的网页内容有了大致了解,接下来,我就来介绍发现漏洞子域名的各种技术、技巧和工具。
在深入之前,我们需要区分检索( Scraping )和暴力猜解(Brute Forcing)的不同,因为这两种方法都能帮助你发现子域名,但最终结果却有所不同。检索是一种被动的侦测方式,它利用DNS Dumpster和VirusTotal等外部服务和资源,来收集属于某个特定主机的子域名。这种方式能快速检索出外部服务资源中之前加载过的子域记录,算是一种不费太多精力的子域名发现方式。如以下DNS Dumpster网站中记录的reddit.com子域名情况:
检索( Scraping )方式中不仅中以包含索引页面,还可以添加进目标网站的GIT库、内容安全策略头、源代码和漏洞跟踪消息等反馈源,只要你能想得到,检索列表是非常之多的。我就经常更新我自己的检索列表资源库,反正你应用的技术越多越奇特,那么最终你发现的结果也会与众不同。所以,从这一点来说,在做漏洞众测时,我们一定要具备创新精神。
本文来自无奈人生安全网
Sublist3r算是检索( Scraping )方式的一个简单子域名发现工具了,它利用了轻量级的Python脚本,从各种搜索引擎、SSL证书和DNS记录网站中来收集目标子域名。具体的安装和应用如下图所示: