ネットワーク列挙ツールを構築する際、ドメイン構造のマッピング方法を理解することは、セキュリティ愛好家や開発者にとって基本的なスキルです。この記事では、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を指定したカスタムリゾルバをインスタンス化します。
辞書型反復処理と数値追加: wordlist(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.