子域名接管
子域名接管漏洞可以被攻击者用来创建可信的钓鱼方案、恶意软件分发、CSP 绕过、读取父域 Cookie 等。对于企业来说,子域名有更高的可能性直接绕过邮件过滤器,因此钓鱼攻击的成功率大大增加。
子域名接管意思是攻击者对目标域的一个子域有了完全的控制权,通常在以下情况出现
1:在 DNS 记录中,一个子域 ( blog.raven-medicine.com) 的 CNAME 所指向另一个域 (medicine-blog.net),但是 medicine-blog.net 在某个时间点过期了并且可以给任何人注册。此时,blog.raven-medicine.com 的 这条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)