Skip to main content

子域名接管

子域名接管漏洞可以被攻击者用来创建可信的钓鱼方案、恶意软件分发、CSP 绕过、读取父域 Cookie 等。对于企业来说,子域名有更高的可能性直接绕过邮件过滤器,因此钓鱼攻击的成功率大大增加。

子域名接管意思是攻击者对目标域的一个子域有了完全的控制权,通常在以下情况出现

1:在 DNS 记录中,一个子域 ( blog.raven-medicine.comwww.azuresky.live) 的 CNAME 所指向另一个域 (medicine-blog.dlersec.azureedge.net),但是 medicine-blog.dlersec.azureedge.net 在某个时间点过期了并且可以重新开放给任何人注册。此时,blog.raven-medicine.comwww.azuresky.live   这条CNAME尚未移除。

2:在 DNS 记录中,一个子域 ( blog.raven-medicine.com) 的 CNAME 所指向一个虚拟主机,比如可以是某个主机提供商上部署的(blog.bestwebsites.net),但这个时候这个虚拟主机还没有被部署或者已经移除了。那么攻击者可以在该平台注册名为 blog 的虚拟主机

一个简单的验证方法如下:

┌──(root㉿kali)-[~/Desktop]
└─# host -t cname app-cloud.dev.example.com
app-cloud.dev.example.com is an alias for app-cloud-dev-eus.azurewebsites.net.
                                                                                                                                                  
┌──(root㉿kali)-[~/Desktop]
└─# host app-cloud-dev-eus.azurewebsites.net      
Host app-cloud-dev-eus.azurewebsites.net not found: 3(NXDOMAIN)

根据此验证方法,我们写一个脚本来批量验证子域名是否可以被接管。

import sys
import subprocess
import dns.resolver

if len(sys.argv)!=2:
        print("Usage: python3 subdomain.py target.txt")
file=sys.argv[1]
target=[]
vuln=[]

with open(file,"r") as fp:
        for line in fp:
                try:
                        target.append(line.strip())
                except:
                        #print(line)
                        print('Error')
print("Read "+str(len(target))+" subdomains")

for sub in target:
        try:    
                cname = str(dns.resolver.resolve(sub, 'cname')[0])
                cname=cname[0:len(cname)-1]
                try:
                        host=dns.resolver.resolve(cname, 'A')
                except:
                        print(sub+" is vulnerable to subdomain takeover")
                        vuln.append(sub)
                        pass
        except:
                pass
        
print("\n\nThe following subdomains are vulnerable to subdomain take over")
for i in vuln:
        print(i)

image.png

但该脚本的判断可能受 DNS 服务器、网络连通性 (获取 CNAME 超时)影响。此外,根据各主机平台的策略,实际接管难度也有所不同。我们可以使用更加专业的工具 https://github.com/EdOverflow/can-i-take-over-xyz 来枚举可接管的子域名。