HackerOne:子域名收购指南

2019-01-16 7,242

前言

在前几天,我推送了《深入解析子域名接管(Subdomain Takeover)漏洞》这篇文章,受到了很多关注,今天继续这个话题,翻译了另外一篇文章,帮助了解更多子域名接管方面的内容。

子域名接管的基本前提是指向当前未使用的特定服务的主机,攻击者可以通过在第三方服务上设置帐户来使用该服务在易受攻击的子域上提供内容。作为黑客和安全分析师,我每天都会处理这类问题。我今天的目标是创建一个理解,查找,利用和报告子域错误配置的总体指南。本文假设读者对此有基本的了解域名系统(DNS)并知道如何设置子域。


0x01 子域名接管简介

如果您之前从未进行过子域接管或希望获得新的介绍,我已经设计了一个示例场景来帮助解释基础知识。对于这种情况,让我们假设这example.com是目标,并且运行的团队example.com有一个bug赏金计划。在枚举所有属于的子域时example.com- 我们将在稍后面探讨这一过程 - 黑客偶然发现subdomain.example.com,指向GitHub页面的子域。我们可以通过查看子域的DNS记录来确定这一点; 在此示例中,subdomain.example.com有多个A记录指向GitHub的自定义页面的专用IP地址。

$ 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错误页面。

image.png


大多数黑客的在这一点上开始感觉困惑。此404页面表示顶级目录下没有提供任何内容,我们应该尝试将此子域添加到我们的个人GitHub存储库。请注意,这并不表示可以在所有应用程序上进行接管。某些应用程序类型要求您检查HTTP和HTTPS响应以进行接管,而其它应用程序类型可能根本不易受攻击。

在我们的GitHub项目添加自定义子域后,我们可以看到存储库的内容已提供subdomain.example.com- 表示我们已成功声明子域。出于演示目的,索引页面现在显示青蛙的图片。

image.png


0x02 二阶子域接管

二阶子域接管,我喜欢称之为“断链劫持”,是易受攻击的子域,不一定属于目标,而是用于在目标网站上提供内容。这意味着一个资源正在目标页面上被导入,例如,通过一连串的JavaScript,黑客可以声称该资源是从哪个子域导入的。劫持页面某处使用的主机最终会导致存储跨站点脚本,因为对手可以在目标页面上加载任意客户端代码。我之所以想在本指南中列出这个问题,是为了强调这样一个事实:作为黑客,我不想只局限于目标主机上的子域。您可以通过检查源代码并映射出目标所依赖的所有主机来轻松扩展范围。

image.png

这也是为什么,如果你设法劫持一个子域名,那么投入时间来查看是否有任何页面从你的子域导入资产是值得的。


0x03 子域枚举和发现

现在我们已经高度概述了在错误配置的子域上提供内容所需的内容,下一步是掌握用于查找易受攻击的子域的各种技术,技巧和工具。

在潜入之前,我们必须首先区分检索和暴力破解,因为这两个过程都可以帮助您发现子域,但可能会有不同的结果。检索是一种被动侦察技术,其中使用外部服务和来源来收集属于特定主机的子域。某些服务(例如DNS、 Dumpster和VirusTotal)索引过去已被爬网的子域,允许您快速收集和排序结果,而无需花费太多精力。

属于reddit.comDNS Dumpster的子域的结果。

不仅包括使用索引页面,还记得检查目标的GIT存储库、内容安全策略头、源代码、问题跟踪程序等。来源的列表是无穷无尽的,不断发现增加发现结果的新方法。通常你会发现你的技术越奇特,你就越有可能最终发现别人没有发现的东西;所以要有创意,并在实践中对照漏洞披露计划测试你的想法。

Ahmed Aboul-Ela的Sublist3r可以说是最简单的子域刮削工具。这个轻量级Python脚本从众多搜索引擎,SSL证书和DNS Dumpster等网站收集子域。我个人计算机上的设置过程非常简单:

$ git clone https://github.com/aboul3la/Sublist3r.git
$ cd Sublist3r 
$ sudo pip install -r requirements.txt

image.png

当暴力破解子域时,黑客会遍历一个词表,并根据响应可以确定主机是否有效。请注意,始终检查目标是否启用了通配符非常重要,否则最终会出现大量误报。通配符只是意味着所有子域都会返回一个会导致结果出现偏差的响应。您可以通过请求目标很可能尚未设置的看似随机的主机名来轻松检测通配符。

$ host randomifje8z193hf8jafvh7g4q79gh274.example.com

如果您计划强制子域名,我强烈建议您查看Jason Haddix的单词列表。Jason解决了将子域发现工具中的列表合并到一个扩展列表中的麻烦。为了在爆破子域名的同时获得最佳结果,我建议您创建自己的个人词汇表,其中包含您过去遇到过的或通常与您感兴趣的服务相关联的词汇。例如,我经常发现自己正在寻找包含关键字“jira”和“git”因为我有时会发现易受攻击的Atlassian Jira和GIT实例。


0x04 指纹识别

在寻找子域时,为了增加你的结果,不管你是在检索还是爆破,你都可以使用一种叫做指纹的技术。指纹识别允许你为你的目标创建一个自定义的单词列表,并且可以显示属于目标的资产,这些资产是你用普通单词列表找不到的。


0x05 值得注意的工具

子域收购有各种各样的工具。这一部分包含一些迄今为止还没有提到的值得注意的内容。


Altdns

为了递归爆破子域,可以使用Shubham Shah的Altdns(https://github.com/infosec-au/altdns)脚本。在通过Altdns对目标进行指纹识别后运行自定义单词列表可能会非常有益。我喜欢使用Altdns生成单词列表,然后运行其他工具。


Commonspeak

另一个由Shubham 提供的工具,Commonspeak是一个使用Google的BigQuery生成单词列表的工具。目标是生成反映当前趋势的单词列表,这在技术快速发展的时代尤为重要。如果您想更好地了解此工具的工作原理以及从哪里收集关键字,请务必阅读https://pentester.io/commonspeak-bigquery-wordlists/。

SubFinder

SubFinder是一款将检索和爆破结合在一起的工具。我发现自己使用SubFinder而不是Sublist3r作为我的通用子域发现工具。为了获得更好的结果,请确保包含SubFinder用于查找子域的各种服务的API密钥。

Massdns

Massdns是一个超快的子域枚举工具。使用一些工具需要四分之一小时,Massdns可以在一分钟内完成。请注意,如果您计划运行Massdns,请确保为其提供有效解析器列表。看看https://public-dns.info/nameservers.txt,如果你不更新你的解析器列表,你最终会得到很多误报。

$ ./scripts/subbrute.py列出/ names.txt example.com | ./bin/massdns -r lists / resolvers.txt -t A -o S -w results.txt


0x06 自动化您的工作流程

在寻找子域名接管时,自动化是关键。顶级赏金猎人不断监测目标的变化,并不断关注他们可以找到的每个子域。对于本指南,我认为没有必要专注于监控设置。相反,我想坚持简单的技巧,可以节省您的时间,并可以轻松实现自动化。

我喜欢自动化的第一个任务是从主机列表中过滤掉实时子域。在搜索子域时,某些结果将过时且无法再访问; 因此,我们需要确定哪些主机是活的。请记住,正如我们稍后将看到的,仅仅是因为主机没有解决,并不一定意味着它不能被劫持。使用该host命令可以轻松完成此任务,不再处于活动状态的子域将返回错误。

while read subdomain; do
if host "$subdomain" > /dev/null; then
# If host is live, print it into
# a file called "live.txt".
echo "$subdomain" >> live.txt
fi
done < subdomain-list.txt

因此,如果我们把迄今为止所有的东西放在一起,我们最终会有以下工作流程。


下一步是概述各个子域。有两种选择:第一种是在所有子域中运行屏幕截图脚本; 第二个需要将页面内容存储在文本文件中。

为了拍摄截图,我的首选工具目前是EyeWitness。此工具生成一个HTML文档,其中包含主机列表中的所有屏幕截图,响应正文和标题。

$ ./EyeWitness -f live.txt -d out --headless

对于某些情况,EyeWitness可能有点过于沉重,您可能只想通过简单的GET请求将页面内容存储到子域的顶级目录中。对于像这样的情况,我使用Tom Hudson的meg。meg同时发送请求,然后将输出存储到纯文本文件中。这使得它成为一种非常有效和轻量级的解决方案,可以通过子域进行筛选,并允许您使用grep查找关键字。

$ meg -d 10 -c 200 / live.txt


0x07 特殊情况

我们需要注意一个特殊情况,FransRosén在他的演讲“ 使用云提供商进行DNS劫持 - 无需验证 ”中强调了这一点。每当您遇到死DNS记录时,不要只是假设您不能劫持该子域。正如Frans所指出的那样,该host命令可能会返回错误,但是运行dig会显示死记录。


0x08 探索

现在你控制了属于目标的子域,接下来你能做什么?当使用错误配置的子域确定可能的攻击场景时,理解子域如何与基本名称和目标的核心服务交互是至关重要的。


Cookies

subdomain.example.com可以修改作用域的cookie example.com。这一点很重要,因为这可能会让您在基本名称上劫持受害者的会话。

image.png

从output.jsbin.com,我们可以为jsbin.com设置cookie。

如果基本名称容易受到会话固定并使用HTTPOnly cookie,则可以设置cookie,然后当用户重新启动浏览器时,恶意cookie将优先于新生成的cookie,因为cookie按年龄排序。


跨域资源共享

跨域资源共享( CORS )是一种允许主机跨源共享页面内容的技术。应用程序创建了一个包含一组规则的范围,这些规则允许主机提取包括已验证数据在内的数据。一些应用程序允许子域提出跨域HTTP请求,假设子域是可信实体。当你劫持子域时,寻找CORS头——Burp Suite Pro的扫描程序通常会拾取它们——并查看应用程序是否将子域列入白名单。这可能允许您从主应用程序上经过身份验证的用户那里窃取数据。


Oauth白名单

与CORS类似,Oauth流程也有一个白名单机制,开发人员可以指定应该接受哪些回调URI。这里的危险再次出现在子域名被列入白名单的情况下,因此您可以在Oauth流程中将用户重定向到您的子域名,从而可能泄露他们的Oauth令牌。


内容安全策略

内容安全策略( CSP )是应用程序信任的另一个主机列表,但是这里的目标是限制哪些主机可以在应用程序的上下文中执行客户端代码。如果想最大限度地减少跨站点脚本的影响,这个标头特别有用。如果您的子域包含在白名单中,您可以使用子域绕过策略,在应用程序上执行恶意客户端代码。

$ curl -sI https://hackerone.com | grep -i "content-security-policy"
content-security-policy: default-src 'none'; base-uri 'self'; block-all-mixed-content; child-src www.youtube-nocookie.co
m; connect-src 'self' www.google-analytics.com errors.hackerone.net; font-src 'self'; form-action 'self'; frame-ancestor
s 'none'; img-src 'self' data: cover-photos.hackerone-user-content.com hackathon-photos.hackerone-user-content.com profi
le-photos.hackerone-user-content.com hackerone-us-west-2-production-attachments.s3-us-west-2.amazonaws.com; media-src 's
elf' hackerone-us-west-2-production-attachments.s3-us-west-2.amazonaws.com; script-src 'self' www.google-analytics.com;
style-src 'self' 'unsafe-inline'; report-uri https://errors.hackerone.net/api/30/csp-report/?sentry_key=61c1e2f50d21487c
97a071737701f598


点击劫持(Clickjacking)
 

如“ Cure53浏览器安全白皮书 ”中所述,Internet Explorer,Edge和Safari支持标题中的ALLOW-FROM指令X-Frame-Options,这意味着如果您的子域列入白名单,则可以构建目标页面,从而执行点击劫持攻击。


密码管理员

这不一定会包含在报告中,但是值得注意的是,一些密码管理器会自动填写属于主应用程序的子域的登录表单。


拦截电子邮件

Rojan Rijal 演示了他如何通过在SendGrid上声称属于uber.com的子域来拦截电子邮件。


0x09 报告子域名接管漏洞

在您尝试报告子域名接管之前,请确保您实际上能够在子域名上提供内容。但是,无论你做什么,都不要在索引页面上发布任何内容,即使它是如前所示的青蛙的无害图片。最佳做法是在HTML注释中包含隐藏消息的隐藏路径上提供HTML文件。这应该足以在最初联系该计划时证明您的发现。只有在团队授予您许可后,您才应尝试升级问题并实际证明漏洞的整体影响。但在大多数情况下,团队应该已经意识到影响,并且您的报告应该包含有关子域名接管的可利用性的信息。

作者注:我只见过一个关于子域名接管的重复报告,所以虽然仍有可能,但这种情况发生在你身上的可能性相当小。在寻找子域名接管时,请记住练习并应用本文中列出的技巧。



原文:@EdOverflow

原文地址:https://www.hackerone.com/blog/Guide-Subdomain-Takeovers

翻译:@仓鼠(发表在仓鼠有话说)

转载请注明来源,请尊重作者成果以及翻译成果,在翻译的过程中,进行了适当删减与修改,部分词汇由于国内外差异可能造成有所区别,整体不影响阅读,感谢阅读与分享。

本文作者:仓鼠

本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/95304.html

Tags:
评论  (0)
快来写下你的想法吧!

仓鼠

文章数:2 积分: 10

黑灰产分析与对抗,威胁情报,业务安全。 公众号:仓鼠有话说

安全问答社区

安全问答社区

脉搏官方公众号

脉搏公众号