在构建网络枚举工具时,理解域名结构如何映射是任何安全爱好者或开发人员的核心技能。在这篇文章中,我们将介绍一个使用 dnspython 库编写的简单递归 DNS 探索脚本。
先决条件要在本地或 Termux 等移动终端环境中运行此脚本,您需要安装 dnspython 包:
pip install dnspython
脚本代码
以下是用于基于字典的子域枚举和反向 DNS 查找的完整脚本:
import dns
import dns.resolver
import socket
domains = {}
subs = "dns_search.txt"
res = dns.resolver.Resolver()
res.nameservers = ["8.8.8.8"]
res.port = 53
domain = "google.com"
nums = True
def ReverseDNS(ip):
try:
result = socket.gethostbyaddr(ip)
return [result[0]]+result[1]
except socket.herror:
return []
def DNSRequest(domain):
ips = []
try:
result = res.resolve(domain)
if result:
addresses = [a.to_text() for a in result]
if domain in domains:
domains[domain] = list(set(domains[domain]+addresses))
else:
domains[domain] = addresses
for a in addresses:
rd = ReverseDNS(a)
for d in rd:
if d not in domains:
domains[d] = [a]
DNSRequest(d)
else:
domains[d] = [a]
except (dns.resolver.NXDOMAIN,dns.exception.Timeout):
return []
return ips
def HostSearch(domain,dictionary,nums):
successes = []
for word in dictionary:
d = word+"."+domain
DNSRequest(d)
if nums:
for i in range (0,10):
s = word+str(i)+"."+domain
DNSRequest(s)
dictionary = []
with open(subs,"r") as f:
dictionary = f.read().splitlines()
HostSearch(domain,dictionary,nums)
for domain in domains:
print("%s:%s" % (domain, domains[domain]))
工作原理
自定义解析器配置:脚本实例化一个自定义解析器,明确指向 Google 的公共 DNS 名称服务器(8.8.8.8),端口为 53。
字典迭代与数字附加:它读取一个单词列表(dns_search.txt),将每个单词与目标域名组合。如果 nums = True,则还会附加 0 到 9 的数字以最大化覆盖范围。
递归反向查找:当解析出有效的 A 记录后,脚本会对解析出的 IP 地址执行反向 DNS 查找(PTR),并将发现的任何主机名反馈到探索循环中。
0 Comments
Log in to join the conversation.No comments yet. Be the first to share your thoughts.