
正規表現ベースのPython MITM DNSサーバー。DNSリバインディング攻撃に対応。
2020/04/14更新 - Python 2サポートを削除し、コードをPython3に変更しました
ラウンドロビンと改良されたオプションに対応しました!
バグ報告: @cryptos - Twitter
[email protected] - メール
Pythonの正規表現ベースのDNSサーバーです!
USAGE:
./fakedns.py [-h] -c Config path [-i interface IP address] [--rebind]
dns.conf は次のように設定してください:
[RECORD TYPE CODE] [python regular expression] [answer] [rebind answer]
answer には IP アドレスまたは文字列 self を指定できます。
self という糖衣構文は、現在のマシンのローカルIPアドレス(例: 192.168.1.100)に変換されます。
一致しない場合、DNSサーバーはローカルマシンで設定されているDNSサーバーを使ってリクエストの解決を試み、リクエストしたユーザーに代わってそのサーバーにリクエストをプロキシします。
- A
- TXT
- AAAA
- PTR
- SOA
- MX
- CNAME
- DNSリバインディングに対応
- ラウンドロビンに対応
ラウンドロビンルールが実装されています。クライアントが一致するルールをリクエストするたびに、FakeDNSはルールで指定されたIPリストの中から次のIPを返します。
IPのリストはカンマ区切りです。
例:
A robin.net 1.2.3.4,1.1.1.1,2.2.2.2
これは robin.net のラウンドロビンルールで、1.2.3.4、1.1.1.1、2.2.2.2 を指すレスポンスを返します。robin.net エントリに対してクライアントからリクエストがあるたびに、その順序で順番に返します。
注: これらのIPはレスポンス内でクライアントにリストとして含まれるわけではありません。レスポンスで返るのは依然として1つのIPだけです(これは後で変更される可能性があります)
FakeDNSはリバインディングルールをサポートしています。これは基本的に、サーバーがクライアントからのドメインへのリクエストをしきい値(デフォルトでは1リクエスト)まで受け付け、その後IPアドレスを別のものに変更するという意味です。
例:
A rebind.net 1.1.1.1 10%4.5.6.7
これは、rebind.net のAレコードが最初の10回の試行では 1.1.1.1 に解決されることを意味します。すでに10回リクエストしたクライアントからの11回目のリクエストで、FakeDNSは2番目のIPである 4.5.6.7 を返し始めます。
ここではアドレスのリストを使用でき、FakeDNSは「通常の」ルールと同様にそれらをラウンドロビンで返します。
(追加の手順なしではlocalhostのみ)
DockerでFakeDNSをテスト/開発することは、多くの成功を収めています。最新のUbuntuインストールではポート53でDNSサービスがすでに実行されているため、ネイティブで実行するよりも簡単です。
試してみたい場合は、次の手順に従えばそれほど手間をかけずに試すことができます:
FakeDnsディレクトリ内にいる場合: sudo docker run --interactive --tty --volume \pwd`:/opt/FakeDns -p 5353:53/udp python:3.8 /opt/FakeDns/fakedns.py -c /opt/FakeDns/dns.conf.example。テストするには、nslookup -port=5353 testrule.test 127.0.0.1を実行します。最初のリクエストでは1.1.1.1` が返るはずです。
または、docker-composeを使用したい場合は、単に docker-compose up を実行して、上記と同じテストを使用してください。