在搜资料的时候偶然发现了这么一种子域名劫持(Subdomain Takeover)漏洞,平时没遇到过,感觉很有趣,可以利用劫持玩出很多花样,同样,HackOne上也有很多例子:
https://hackerone.com/reports/172137
https://hackerone.com/reports/32825
https://hackerone.com/reports/38007
https://hackerone.com/reports/175070
CNAME解析是子域名劫持漏洞的关键因素,因此这里我们先简单说一下。我们知道域名解析是由DNS协议完成的,包含了多种记录类型,比如其中的A (Address) 记录是用来指定主机名(或域名)对应的IP地址记录;NS记录,解析服务器记录,用来表明由哪台服务器对该域名进行解析;而CNAME记录通常也叫别名记录,是一种将一个域名映射到另一个域名的记录。
换句话说,CNAME像是一个域名到另一个域名的解析。如下图所示,是一个域名解析的过程,第3步通过CNAME记录找到了另外的域名,第5步找到了实际的ip地址,最后在第7/8步完成了访问。
这里先假设一个场景,你申请了一个域名abc.com,那么主站的域名当然www.abc.com
之后为了快速开辟一个新的业务,你直接在阿里云上购买了相应的服务,阿里云分配了你一个二级域名shop.aliyun.com,虽然这个阿里云的二级域名是你独有的,但是你肯定仍然希望能使用自己的域名。这个时候CNAME解析就排上用场了,如下所示,这时候用户只需要访问你的shop.abc.com域名即会解析到shop.aliyun.com上。
一些代码上的手段也能实现域名跳转,但是那种浏览器跳转过去之后就不是本身的域名了,无法让用户记住自己的域名,所以一般会使用CNAME。
直到有一天你想关掉了你的这个业务,最简单的办法就是停掉aliyun的服务,省钱又方便。但是如果你只是关掉了云服务,没有删除CNAME记录,那么这个时候就有可能发生子域名劫持漏洞。因为此时攻击者就可以重新申请的你关掉服务,同样申请一个shop.aliyun.com的域名,当不知情的用户访问shop.abc.com的时候仍然会解析到shop.aliyun.com,而此时的shop.aliyun.com已经被攻击者控制了,攻击者就可以展开劫持攻击。在用户看来访问的shop.abc.com,拥有一个正常的可信的域名,基于这种信任,往往会造成更大的漏洞。
子域名劫持可以构造多种利用方式,以如下两种为例。
由于用户对shop.abc.com的访问会解析到攻击者控制的shop.aliyun.com,那么攻击者就可以构造特定的页面诱导用户操作,比如登陆表单、密码表单等,由于浏览器显示的是正常的可信的域名,就算有安全意识的用户也难以分别是否存在钓鱼。
Cookie是用户权限的凭证,一般也会拥有一个特定的作用域。但是现在很多网站使用单点登陆(SSO),那么Cookie就可能是在整个域共享的,当然也包括shop.abc.com,那么攻击者只需要诱导攻击者访问存在漏洞子域名,即可在后台接受到用户的Cookie。
一个典型的例子:https://hackerone.com/reports/172137
一种是用nslookup手动检测,这是上一个例子里的截图,可以看到ping.ubnt.com解析到了d2cnv2pop2xy4v.cloudfront.net,这是亚马逊的云服务。
另一种是使用工具,一个较好的工具aquatone,它本身是一个强大的子域名扫描工具,结合了搜索引擎、各大API接口以及爆破等多种手段,它本身还支持其他额外的功能,详情可以参见这里。检测之前首先要进行子域名探测,一些API接口需要自己配置APIKey。
探测完成后会生成两个文件,后续其他功能的调用主要依赖hosts.json文件
下图使用aquatone-takeover进行子域名劫持探测
防范子域名劫持的最直接的方法就是删除多余的DNS的相关记录,这种情况就是本方也不在使用相关云服务了;另一种方法就是保持对域名的所有权,避免被攻击者恶意申请。