0x01 何为子域名接管
子域名接管是注册不存在的域名以获得对另一个域的控制权的过程。此过程最常见的情况如下:
域名(例如,sub.example.com)将CNAME记录用于另一个域(例如,sub.example.com CNAME anotherdomain.com)。在某个时间点,anotherdomain.com到期并可供任何人注册。
由于未从example.com DNS区域删除CNAME记录,因此注册anotherdomain.com的任何人都可以完全控制sub.example.com,直到存在DNS记录。子域名接管的影响可能非常重要。使用子域名接管,攻击者可以从合法域发送网络钓鱼电子邮件,执行跨站点脚本(XSS)或破坏与域关联的品牌声誉。
子域名接管不仅限于CNAME记录。NS,MX甚至A记录也会受到影响。
image.png
0x02 常规域名
使用CNAME记录的DNS授权对用户完全透明,它发生在DNS解析期间的后台。下图说明了具有CNAME记录的域名的Web浏览器的行为。
image.png
0x03 子域名接管漏洞批量检测脚本
#!/usr/bin/env python
# _*_ coding: utf-8 _*_
import sys
version = sys.version_info
if version < (3, 0):
print('The current version is not supported, you need to use python3')
sys.exit()
import dns.resolver
import tldextract
import requests
import datetime
from threading import Semaphore
import threading
import queue
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
CurrentTime=datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
CurrentTime=str(CurrentTime).replace(' ','-').replace(':','-')
q=queue.Queue()
Multithread=10#线程数
Suddomain='domain_url.txt' #整理好的子域名文件
count=0
def outinfo(strinfo,status=0):#输出不换行
global count
count=count+1
if status==1:
print('\n'+strinfo)
else:
sys.stdout.write("\r" + str(strinfo)+' '+str(count))
sys.stdout.flush()
def filewrite(text,lock):#运行的log记录实时写入文件。
lock.acquire()
outfile=open('Result-' + CurrentTime + '.txt', 'a', encoding='utf-8')
outfile.write(text+'\n')
outfile.close()
lock.release()
def Cname_query(q,lock):#查询cname地址
while not q.empty():
subdomain=q.get()
try:
subdomain=subdomain.replace('http://','').replace('https://','').replace('/','')
cname = dns.resolver.query(subdomain, 'CNAME')
for i in cname.response.answer:
for j in i.items:
res = tldextract.extract(j.to_text())#提取Cname的主域名
domain=res.domain + '.' + res.suffix
regurl = 'https://checkapi.aliyun.com/check/checkdomain?domain={}&command=&token=Y3d83b57bc8aca0f156381976a6171f4a&ua=¤cy=&site=&bid=&_csrf_token=&callback=jsonp_1569557125267_14652'.format(
domain)
try:
res2 = requests.get(regurl, timeout=5, verify=False)#查询Cname指向的域是否可注册
if 'avail":1' in str(res2.content):
outinfo(subdomain+' ***存在子域名接管漏洞,接管地址:'+domain,1)
filewrite(subdomain+' ***存在子域名接管漏洞,接管地址:'+domain,lock)#记录实时写入文件
else:
outinfo(subdomain+' 失败,不存在子域名接管漏洞')
filewrite(subdomain+' 失败,不存在子域名接管漏洞',lock)#记录实时写入文件
except Exception as e:
outinfo(e,lock)
except Exception as e:
outinfo(subdomain + ' 不存在cname')
filewrite(subdomain + ' 不存在cname', lock)#记录实时写入文件
File=open(Suddomain,'r',encoding='utf-8').read().split('\n')
lock=threading.Lock()
for Url in File:
q.put(Url)
for M in range(Multithread):
threading.Thread(target=Cname_query,args=(q,lock,)).start()
q.join()
print('程序执行完成!')
使用
把已经搜集好的子域名整理好,放置在当前目录的 “domain_url.txt”,使用Python3直接运行脚本即可,结果的结果会实时保存起来。












网友评论