最近在HackerOne上看到了几个子域名接管方面的漏洞,几个漏洞都可以轻松就对子域获得控制权,并且获得了来自企业的高额奖金。在国外看到了这篇文章,粗略翻译了下,也顺便围绕这个话题说说吧,相关漏洞案例可以去H1搜索“subdomain takeover”查看。


0x01 前言

子域名接管漏洞通常被滥用于以下几个目的:恶意软件分发、网络钓鱼/鱼叉式网络钓鱼、XSS 、身份验证绕过等等。由于某些证书颁发机构仅需要域验证,因此也可以轻松生成SSL证书。

子域名接管是注册不存在的域名以获得对另一个域的控制权的过程。此过程最常见的情况如下:

  1. 域名(例如,sub.example.com)将CNAME记录用于另一个域(例如,sub.example.com CNAME anotherdomain.com)。

  2. 在某个时间点,anotherdomain.com到期并可供任何人注册。

  3. 由于未从example.com DNS区域删除CNAME记录,因此注册anotherdomain.com的任何人都可以完全控制sub.example.com,直到存在DNS记录。

子域名接管的影响可能非常重要。使用子域名接管,攻击者可以从合法域发送网络钓鱼电子邮件,执行跨站点脚本(XSS)或破坏与域关联的品牌声誉。

子域名接管不仅限于CNAME记录。NS,MX甚至A记录也会受到影响。这篇文章主要涉及CNAME记录。但是,NS和MX记录的相关用例会在需要时也会介绍到。


0x02 常规域名

使用CNAME记录的DNS授权对用户完全透明,它发生在DNS解析期间的后台。下图说明了具有CNAME记录的域名的Web浏览器的行为。


需要注意的是,Web浏览器隐式地信任放在DNS解析器返回的任何内容上。这种信任意味着当攻击者获得对DNS记录的控制时,绕过所有Web浏览器安全策略(例如,同源策略)。这会带来相当大的安全威胁,因为子域名接管会破坏域名的真实性,攻击者可以通过多种方式利用域名的真实性。如稍后所示,TLS / SSL无法解决此问题,因为子域名接管不是常规的中间人攻击。

CNAME子域接管。CNAME子域接管的主要类型之一是叫做互联网常规域名的规范域,而不是云服务商拥有的域名的情况,如下所述。检测某些源域名是否容易受到CNAME子域名接管的过程非常简单:

给定一对源域名和规范域名,如果规范域名的基本域可供注册,则源域名容易被子域接管。


这个过程中值得注意的事情是,规范域名的基本域。这是因为规范域名可能是更高级别的域名。如果基础域可用于注册,高级域名可以很容易地在DNS区域中重新创建。

使用域名注册商(如Namecheap)可以检查基础域名的可用性。有人可能认为测试NXDOMAIN的DNS响应状态足以表明域名可用于注册。但请注意,情况并非如此,因为存在域名以NXDOMAIN响应但无法注册的情况。原因包括TLD注册商限制的顶级域名(例如.GOV,.MIL)或保留域。

NS子域名接管。子域名接管的概念可以自然地扩展到NS记录:如果至少一个NS记录的规范域名的基本域可用于注册,则源域名易受子域名接管的影响。

使用NS记录而产生子域名接管漏洞中的一个问题是源域名通常具有多个NS记录。多个NS记录用于冗余和负载平衡。在DNS解析之前随机选择名称服务器。假设域sub.example.com有两个NS记录:ns.vulnerable.com和ns.nonvulnerable.com。如果攻击者接管了ns.vulnerable.com,则从查询sub.example.com的用户的角度来看,情况如下:

  1. 由于有两个名称服务器,因此随机选择一个。这意味着查询攻击者控制的名称服务器的概率为50%。

  2. 如果用户的DNS解析程序选择ns.nonvulnerable.com(合法名称服务器),则返回正确的结果,并且可能会在6到24小时之间缓存。

  3. 如果用户的DNS解析器选择ns.vulnerable.com(攻击者拥有的名称服务器),则攻击者可能会提供错误的结果,该结果也将被缓存。比如,由于攻击者控制着名称服务器,因此她可以将此特定结果的TTL设置为一周。

MX子域名接管。与NS和CNAME子域名接管相比,MX子域名接管的影响最小。由于MX记录仅用于接收电子邮件,因此在MX记录中获得对规范域名的控制仅允许攻击者接收发往源域名的电子邮件。虽然影响不如CNAME或NS子域名接管那么重要,但MX子域名接管可能会在鱼叉式网络钓鱼攻击和知识产权窃取中发挥作用。


0x03 云提供商

云服务近年来越来越受欢迎。云的基本前提之一是从建立他们的基础设施中卸载用户。举几个例子,组织正在从内部部署设置转向诸如云存储,云中的电子商务和平台即服务等替代方案。

用户创建新的云服务后,云提供商在大多数情况下会生成一个唯一的域名,用于访问创建的资源。由于云服务客户数量众多,因此通过TLD注册商注册域名不是很方便,因此云提供商选择使用子域名。标识唯一云资源的子域通常采用name-of-customer.cloudprovider.com的格式,其中cloudprovider.com是特定云提供商拥有的基本域。

如果组织注册的云服务是公开的(例如,电子商务商店),则组织可能希望将其作为其域的一部分存在。这背后的主要原因是品牌推广:shop.organization.com看起来比organization.ecommerceprovider.com好。在这种情况下,组织有两种选择:

如果使用CNAME记录方法,子域名接管的可能性就会发挥作用。即使云提供商拥有规范域名的基本域,仍然可以进行子域接管,如下面所述。


0x04 Amazon CloudFront

Amazon CloudFront是Amazon Web Services(AWS)中的内容交付网络(CDN)。CDN将Web内容的副本分发到位于不同地理位置(称为存在点)的服务器。当用户向CDN发出请求时,基于访问者位置选择最近的存在点以降低延迟。组织使用CDN,主要用于分发视频,音频和图像等媒体文件。CDN的其他优点包括拒绝服务攻击保护,减少带宽以及高流量峰值时的负载平衡。

CloudFront使用Amazon S3作为Web内容的主要来源。Amazon S3是AWS提供的另一项服务。它是一种云存储服务(S3是Simple Storage Service的缩写),它允许用户将文件上传到所谓的存储桶中,这是S3中逻辑组的名称。

CloudFront使用分发的概念。每个分发都是指向特定Amazon S3存储桶的链接,用于提供对象(文件)。创建新的CloudFront分配时,会生成唯一的子域以提供访问权限。此子域的格式为SUBDOMAIN.cloudfront.net。所述SUBDOMAIN部分由CloudFront的产生,并且不能由用户来指定。

除了随机生成的子域外,CloudFront还可以指定用于访问分发的备用域名。这可以通过从备用域名到CloudFront生成的子域创建CNAME记录来实现。虽然亚马逊没有提供有关内部CloudFront概念的文档,但可以从其行为中扣除高级体系结构。根据地理位置,对cloudfront.net的任何子域的DNS查询会导致相同的A记录(在同一区域中)。这表明CloudFront正在后端使用虚拟主机设置。HTTP请求到达后,CloudFront的边缘服务器根据HTTP 主机头确定正确的分发。文档也支持这一理论,因为它表明:如果备用域名已存在于另一个CloudFront分配中,则无法将备用域名添加到CloudFront分配,即使您的AWS账户拥有其他分配。将多个备用域指向一个分发是正确的,但是,在多个分发中具有相同的备用域名则不是。


因此,为了正确处理备用域名,CloudFront需要事先知道备用域名附加到哪个分发。换句话说,配置CNAME记录是不够的,需要在分发设置中明确设置备用域名。


CloudFront中备用域名的问题类似于常规域部分中解释的问题。我们假设sub.example.com的CNAME记录设置为d1231731281.cloudfront.net。如果没有在任何CloudFront分配中注册的sub.example.com作为备用域名,则可以进行子域名接管。任何人都可以创建新的发布,并在其设置中将sub.example.com设置为备用域名。但请注意,新创建的CloudFront子域不需要与CNAME记录中指定的子域匹配(d1231731281.cloudfront.net))。由于CloudFront使用虚拟主机设置,因此使用HTTP主机头而非DNS记录确定正确的分发。

下图显示了HTTP请求到备用域名后出现的错误消息,该域名具有到CloudFront的DNS CNAME记录,但未在任何CloudFront分配中注册。

此错误消息可以明确表示子域名接管的可能性。然而,需要考虑两个例外情况:

0x05 其他

如CloudFront中所示,即使在没有可用于注册的基本域的云服务上,也可以进行子域接管。但是,由于云服务提供了指定备用域名(CNAME记录)的方法,因此仍然存在子域接管的可能性。本节简要概述了与CloudFront(虚拟主机架构)非常相似的其他云服务。



0x06 互联网范围的扫描

Sonar项目可用于显示互联网上子域名接管的普遍程度。由于Project Sonar已经包含已解析的CNAME记录,因此通过Internet自动扫描子域接管非常简单。本节介绍其结果。

CNAME记录链。在某些情况下,CNAME记录可能会形成CNAME记录链。让我们域sub.example.com具有CNAME记录sub.example1.com。如果反过来,sub.example1.com有一个到sub.example2.com的CNAME记录,则会形成一个三向链:

sub.example.com -> sub.example1.com -> sub.example2.com

在这种情况下,当链(example2.com)中的最后一个域的基本域可用于注册时,sub.example1.com和sub.example.com都会受到影响。幸运的是,Project Sonar隐含地包含链中的所有CNAME引用。对于上面给出的链,即使从sub.example.com到sub.example2.com没有直接的CNAME记录,Project Sonar也包含此记录。因此,不需要对自动化工具进行直接更改以支持Project Sonar中的CNAME记录链。

扫描云提供商域,发现12,888个源域名易受子域名接管(2017年11月)。

云提供商分发如下:

翻译自:https://0xpatrik.com/subdomain-takeover-basics

原文作者:@Patrik    /  翻译:@仓鼠

注明:翻译时进行了适当删减与更改,转载请注明,感谢。


源链接

Hacking more

...