mirror of
https://github.com/shmilylty/OneForAll.git
synced 2026-08-26 12:57:50 +08:00
拆分出执行域传送函数
This commit is contained in:
@@ -1,10 +1,11 @@
|
|||||||
"""
|
"""
|
||||||
查询域名的NS记录(域名服务器记录,记录该域名由哪台域名服务器解析),
|
查询域名的NS记录(域名服务器记录,记录该域名由哪台域名服务器解析),检查查出的域名服务器是否开启
|
||||||
检查查出的域名服务器是否开启DNS域传送,如果开启且没做访问控制和身份验证便加以利用获取域名的所有记录
|
DNS域传送,如果开启且没做访问控制和身份验证便加以利用获取域名的所有记录
|
||||||
|
|
||||||
DNS域传送(DNS zone transfer)指的是一台备用域名服务器使用来自主域名服务器的数据刷新自己的域数据库,
|
DNS域传送(DNS zone transfer)指的是一台备用域名服务器使用来自主域名服务器的数据刷新自己的域
|
||||||
目的是为了做冗余备份,防止主域名服务器出现故障时 dns 解析不可用。
|
数据库,目的是为了做冗余备份,防止主域名服务器出现故障时 dns 解析不可用。
|
||||||
当主服务器开启DNS域传送同时又对来请求的备用服务器未作访问控制和身份验证便可以利用此漏洞获取某个域的所有记录。
|
当主服务器开启DNS域传送同时又对来请求的备用服务器未作访问控制和身份验证便可以利用此漏洞获取某个
|
||||||
|
域的所有记录。
|
||||||
"""
|
"""
|
||||||
import dns.resolver
|
import dns.resolver
|
||||||
import dns.zone
|
import dns.zone
|
||||||
@@ -23,9 +24,34 @@ class CheckAXFR(Module):
|
|||||||
self.domain = self.register(domain)
|
self.domain = self.register(domain)
|
||||||
self.module = 'Check'
|
self.module = 'Check'
|
||||||
self.source = 'AXFRCheck'
|
self.source = 'AXFRCheck'
|
||||||
self.nsservers = []
|
|
||||||
self.results = []
|
self.results = []
|
||||||
|
|
||||||
|
def axfr(self, server):
|
||||||
|
"""
|
||||||
|
执行域传送
|
||||||
|
|
||||||
|
:param server: 域名服务器
|
||||||
|
"""
|
||||||
|
logger.log('DEBUG', f'尝试对{self.domain}的域名服务器{server}进行域传送')
|
||||||
|
try:
|
||||||
|
xfr = dns.query.xfr(server, self.domain)
|
||||||
|
zone = dns.zone.from_xfr(xfr)
|
||||||
|
except Exception as e:
|
||||||
|
logger.log('DEBUG', str(e))
|
||||||
|
logger.log('DEBUG', f'对{self.domain}的域名服务器{server}进行域传送失败')
|
||||||
|
return
|
||||||
|
names = zone.nodes.keys()
|
||||||
|
for name in names:
|
||||||
|
full_domain = str(name) + '.' + self.domain
|
||||||
|
subdomain = utils.match_subdomain(self.domain, full_domain)
|
||||||
|
self.subdomains = self.subdomains.union(subdomain)
|
||||||
|
record = zone[name].to_text(name)
|
||||||
|
self.results.append(record)
|
||||||
|
if self.results:
|
||||||
|
logger.log('DEBUG', f'发现{self.domain}在{server}上的域传送记录')
|
||||||
|
logger.log('DEBUG', '\n'.join(self.results))
|
||||||
|
self.results = []
|
||||||
|
|
||||||
def check(self):
|
def check(self):
|
||||||
"""
|
"""
|
||||||
正则匹配响应头中的内容安全策略字段以发现子域名
|
正则匹配响应头中的内容安全策略字段以发现子域名
|
||||||
@@ -36,30 +62,12 @@ class CheckAXFR(Module):
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.log('ERROR', e)
|
logger.log('ERROR', e)
|
||||||
return
|
return
|
||||||
self.nsservers = [str(answer) for answer in answers]
|
nsservers = [str(answer) for answer in answers]
|
||||||
if not len(self.nsservers):
|
if not len(nsservers):
|
||||||
logger.log('ALERT', f'没有找到{self.domain}的NS域名服务器记录')
|
logger.log('ALERT', f'没有找到{self.domain}的NS域名服务器记录')
|
||||||
return
|
return
|
||||||
for nsserver in self.nsservers:
|
for nsserver in nsservers:
|
||||||
logger.log('DEBUG', f'正在尝试对{self.domain}的域名服务器{nsserver}进行域传送')
|
self.axfr(nsserver)
|
||||||
try:
|
|
||||||
xfr = dns.query.xfr(nsserver, self.domain)
|
|
||||||
zone = dns.zone.from_xfr(xfr)
|
|
||||||
except Exception as e:
|
|
||||||
logger.log('DEBUG', str(e))
|
|
||||||
logger.log('DEBUG', f'对{self.domain}的域名服务器{nsserver}进行域传送失败')
|
|
||||||
continue
|
|
||||||
else:
|
|
||||||
names = zone.nodes.keys()
|
|
||||||
for name in names:
|
|
||||||
subdomain = utils.match_subdomain(self.domain, str(name) + '.' + self.domain)
|
|
||||||
self.subdomains = self.subdomains.union(subdomain)
|
|
||||||
record = zone[name].to_text(name)
|
|
||||||
self.results.append(record)
|
|
||||||
if self.results:
|
|
||||||
logger.log('DEBUG', f'发现{self.domain}在{nsserver}上的域传送记录')
|
|
||||||
logger.log('DEBUG', '\n'.join(self.results))
|
|
||||||
self.results = []
|
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
"""
|
"""
|
||||||
@@ -85,3 +93,4 @@ def do(domain): # 统一入口名字 方便多线程调用
|
|||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
do('ZoneTransfer.me')
|
do('ZoneTransfer.me')
|
||||||
|
do('example.com')
|
||||||
|
|||||||
Reference in New Issue
Block a user