
リモートシステムを相互接続するための、効率的なFTP駆動のコマンド&コントロール導管
SharpFtpC2 は、2台のリモートコンピュータ間でコマンドと応答を中継するためにFTP(S)を使用する可能性を探る、小さな実験的プロジェクトです。FTPプロトコルを即席のトンネルとして利用し、どちらもFTPサーバーに接続するクライアントとして動作するコンピュータ同士が通信できるようにします。シンプルなセッション管理スキームを用いて、リクエストと応答の交換を追跡します。
SharpFtpC2は基本的なセッション管理システムを採用しています。非常に初歩的ではありますが、通信の同期と関連付けを維持する役割を果たしており、リモートシステム間のやりとりに不可欠です。
注目すべき点として、このプロジェクトは git、svn、または類似のプロトコルといったバージョン管理システムを利用することで、簡単に移植できます。
ネットワーク通信の細部に興味がある方、あるいは単にC#や.NET Coreで遊んでみたい方にとって、SharpFtpC2は興味深い出発点になるかもしれません。磨き上げられた宝石は期待しないでください。しかし、もしかしたらいじってみることで何か面白いことを学べるかもしれません。
SharpFtpC2は、2台のリモートコンピュータ間の通信チャネルとしてFTP(S)を利用することを教育的に探求するために作られた実験的プロジェクトです。このプロジェクトは、ネットワーク通信、C#、アドバーサリーシミュレーション、レッドチーム、マルウェアに興味のある個人向けの学習リソースとして設計されていることを理解することが重要です。作成者として、追加機能のリクエストや、このプロジェクトをいかなる形の兵器化や悪意ある目的に使用しないようお願いします。核となる意図は教育であり、ユーザーは責任を持って倫理的に関わることが期待されています。
SharpFtpC2は、Unprotect Project、特にそのNetwork Evasionカテゴリに貢献したいという思いから生まれました。
FTPを「トンネル」として使用するというアイデアには深いルーツがあります。実際、2005年頃、私がまだプログラミングの世界に足を踏み入れたばかりの頃の楽しい思い出を呼び起こします。当時、私は BlasterWar という名で知られる非常に創造的なフランス人と出会いました。彼は BlasterX というプロジェクトを考案していました。このプロジェクトは、時とともに失われてしまいましたが、当時としてはかなり前衛的なものでした。
BlasterWarのプロジェクトにおける独創性は、エージェントが制御デバイスまたはハッキングデバイスに接続を確立する必要がある従来のリバース接続に代わる手段を提供することにありました。
代わりに、BlasterWarは代替媒体としてFTP(File Transfer Protocol)を選択し、その周りに包括的なリモートアクセスツールを構築しました。このツールには、スクリーンキャプチャ、キーロギング、システム管理などの機能が含まれており、すべてFTPトンネルを通じて送信されました。当時、FTPは広く普及しており、多くのウェブサイトが一般に無料のFTPサーバーを提供していました。これにより、ポートフォワーディングを伴うリバース接続や直接接続に代わる理想的な選択肢となりました。さらに、ハッカーのマシンのIPアドレスが直接露出しないため、コマンド&コントロール(C2)に追加の難読化レイヤーを提供しました。
今日では、FTPをトンネルとして利用することは新しい概念ではなく、いくつかのC2フレームワークがこのプロトコルを採用しています。しかし、この方法でFTPを使用することにはリスクが伴います。特に、FTPがネットワーク上でプレーンテキストで資格情報を送信すること、そして両者がこれらの資格情報を所有する必要があることから、さまざまな攻撃に対して脆弱です。FTPサーバーはSSL/TLS暗号化を統合したFTPSを採用することでセキュリティ問題に対処してきましたが、この適応はすべての固有のリスクに対する万能薬にはなっていません。
少しの創意工夫と既存のプロトコルからインスピレーションを得ることで、既存のリスクの大部分に対処することが可能です。
このプロジェクトをコンパイルするには、2つのコンポーネントが必要です:Visual Studio と、コントローラー用の依存関係である CommandLineUtils です。
このプロジェクトは .NET Core を使用しているため、コード変更をすることなく、さまざまなプラットフォーム向けに簡単にコンパイルできます。ただし、ターゲットプラットフォームに合わせた特定の機能を実装する必要があるかもしれません。
このプロジェクトのテストを迅速に開始するには、stilliard/pure-ftpd イメージを使用したDockerを利用することをお勧めします。このイメージはさまざまなオプションをサポートしており、簡単に独自のFTPサーバーをセットアップできます。
docker pull stilliard/pure-ftpd
docker run -d --name ftpd_server -p 21:21 -p 30000-30009:30000-30009 -e "PUBLICHOST: 127.0.0.1" -e "ADDED_FLAGS=-E -A -X -x" -e FTP_USER_NAME=dark -e FTP_USER_PASS=toor -e FTP_USER_HOME=/home/dark stilliard/pure-ftpd
docker run -d --name ftpd_server -p 21:21 -p 30000-30009:30000-30009 -e "PUBLICHOST: 127.0.0.1" -e "ADDED_FLAGS=-E -A -X -x --tls=2" -e FTP_USER_NAME=dark -e FTP_USER_PASS=toor -e FTP_USER_HOME=/home/dark -e "TLS_CN=localhost" -e "TLS_ORG=maislaf" -e "TLS_C=FR" stilliard/pure-ftpd
必要に応じて設定を自由に調整してください。ただし、このテスト用FTPサーバーをローカルネットワークや公開ネットワークに公開しないことを強くお勧めします。このコンテナの露出をホストマシンに限定する方が賢明です。
ADDED_FLAGS オプションを使用すると、pure-ftpd サーバーを微調整できます。すべてのフラグの説明はこちらにあります。
特定のフラグでは、C2プロトコルの動作に変更が必要になる場合があります。例えば、-K オプションを使用してすべてのファイルを保持すると、FTP経由でのファイル削除機能が無効になります。現在のC2プロトコルはこの機能を利用しているため、ファイルの名前変更や移動などの代替アプローチを検討する必要があります。
エージェントとC2間のすべての通信の整合性と機密性を確保するために、暗号化が通信プロトコルにシームレスに組み込まれており、RSAとAES-GCM 256ビットアルゴリズムの両方を採用しています。この機能の主な目的は、侵害されたFTPサーバーが悪意のあるコマンドを配信する可能性を阻止することです。暗号化を使用することで、エージェントの公開鍵にアクセスしなければコマンドインジェクションは不可能になります。同様に、C2の公開鍵を所持していなければ、偽のエージェント応答を注入することもできません。
独自の鍵ペア(エージェント用とC2用の各1ペア)を生成しやすくするために、RSAKeyHelper というサードパーティツールを同梱しています。アプリケーションを実行するたびに、新しく生成された公開鍵と秘密鍵のペアが表示され、暗号化を使用する場合にプログラム内で利用できます。

すべてが意図したとおりに動作することを確認するために、同じツール内に文字列暗号化をテストできる機能も統合しています。

バージョン「3.0 Final」のリリースは、このプロジェクトの集大成を示しています。これ以上機能を追加する予定はありません。このPoCの目的は、FTP(S)を利用した信頼性が高く安全なC2の作成を実証することでした。独自の機能を備えたバージョンを開発することをお勧めします。演習として、長時間のタスク中にアプリケーションがハングするのを防ぐために、マルチスレッドタスクを実装することを検討してもよいでしょう。
ただし、潜在的なバグや最適化の機会に対処するためのプロジェクトサポートは引き続き提供します。
(エージェントのリスト)

(アクティブ(コンテキスト)エージェントにコマンドを実行)

(危険なアクションのユーザー確認を含むエージェントコンソールデバッグウィンドウ)
