
マルチオペレータC2フレームワークで、ネイティブのCおよびPythonエージェント、HTTP(S)チャネル、非同期タスク処理、そしてレッドチーム運用のためのリアクティブWeb UIを備えています。
Striker はシンプルな Command and Control (C2) プログラムです。


このプロジェクトは現在活発に開発中です。ほとんどの機能は実験的であり、今後さらに追加される予定です。破壊的な変更が発生する可能性があります。
A) エージェント
B) バックエンド / チームサーバー
C) ユーザーインターフェース
リポジトリをクローンします。
$ git clone https://github.com/4g3nt47/Striker.git
$ cd Striker
コードベースは4つの独立したセクションに分かれています。
これはオペレーターとエージェントの両方に対するすべてのサーバーサイドロジックを処理します。以下のもので作られた NodeJS アプリケーションです。
express - REST API 用。socket.io - Web ソケット通信用。mongoose - MongoDB への接続用。multer - ファイルアップロード処理用。bcrypt - ユーザーパスワードのハッシュ化用。ソースコードは backend/ ディレクトリにあります。サーバーをセットアップするには:
Striker はバックエンドデータベースとして MongoDB を使用し、すべての重要なデータを保存します。Debian ベースのディストリビューションではこのガイドに従ってローカルにインストールするか、MongoDB Atlas(データベース・アズ・ア・サービスプラットフォーム)で無料のものを作成できます。
$ cd backend
$ npm install
$ mkdir static
このフォルダを使用して、サーバー上で静的ファイルをホストできます。また、後述する .env ファイル内で UPLOAD_LOCATION が設定されている場所である必要がありますが、必須ではありません。このディレクトリ内のファイルは /static/ パスで公開アクセス可能になります。
.env ファイルを作成します。注:< と > で囲まれた値はプレースホルダーです。適切な値(<> を含む)に置き換えてください。ランダムな文字列が必要なフィールドについては、以下を使用して簡単に生成できます。
$ head -c 100 /dev/urandom | sha256sum
DB_URL=<MongoDB接続URL>
HOST=<リッスンするホスト (デフォルト: 127.0.0.1)>
PORT=<リッスンするポート (デフォルト: 3000)>
SECRET=<セッションクッキーの署名とセッションデータの暗号化に使用するランダム文字列>
ORIGIN_URL=<フロントエンドをホストするサーバーの完全なURL。CORS設定に使用>
REGISTRATION_KEY=<サインアップ時の認証に使用するランダム文字列>
MAX_UPLOAD_SIZE=<最大ファイルアップロードサイズ(バイト)>
UPLOAD_LOCATION=<アップロードファイルを保存するディレクトリ (デフォルト: static)>
SSL_KEY=<SSLキーファイル(オプション)>
SSL_CERT=<SSL証明書ファイル(オプション)>
SSL_KEY と SSL_CERT はオプションであることに注意してください。どちらかが定義されていない場合、プレーンな HTTP サーバーが作成されます。これにより、同じホスト上で SSL 対応のリバースプロキシの背後でサーバーを実行する際の不要なオーバーヘッドを回避できます。
$ node index.js
[12:45:30 PM] バックエンドデータベースに接続中...
[12:45:31 PM] HTTPサーバーを起動中...
[12:45:31 PM] サーバーがポート 3000 で起動しました
これはオペレーターが使用する Web UI です。Svelte で書かれたシングルページ Web アプリケーションで、ソースコードは frontend/ ディレクトリにあります。
フロントエンドをセットアップするには:
$ cd frontend
$ npm install
VITE_STRIKER_API を上記で設定した C2 サーバーの完全な URL に設定した .env ファイルを作成します。VITE_STRIKER_API=https://c2.striker.local
$ npm run build
上記のコマンドはすべてを dist/ ディレクトリ内の静的 Web アプリケーションにコンパイルします。すべてのファイルを Web サーバーの Web ルートに移動するか、python の基本的な HTTP サーバーなどでホストすることもできます。
$ cd dist
$ python3 -m http.server 8000
Register ボタンをクリックします。backend/.env の REGISTRATION_KEY を参照)を入力します。これにより標準ユーザーアカウントが作成されます。一部の機能にアクセスするには管理者アカウントが必要です。最初の管理者アカウントは手動で作成する必要があります。その後、Web UI の Users タブで他のアカウントを昇格または降格できます。
最初の管理者アカウントを作成するには:
users コレクションを更新し、対象ユーザーの admin フィールドを true に設定します。これを行うにはいくつかの方法があります。CLI で mongo が利用可能な場合は、次のように実行できます。
$ mongo <MongoDB接続URL>
> db.users.updateOne({username: "<ユーザー名>"}, {$set: {admin: true}})
成功すると次の応答が返ります。
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
これでログインできます :)
A) ダムパイプリダイレクション
Striker 用に書かれたダムパイプリダイレクタは redirector/redirector.py にあります。明らかに、これはプレーンな HTTP トラフィック、または SSL 検証が無効になっている場合の HTTPS でのみ動作します(C エージェントで INSECURE_SSL マクロを有効にすることで可能)。
次の例では、すべてのインターフェースでポート 443 をリッスンし、ポート 443 の c2.example.org に転送します。
$ cd redirector
$ ./redirector.py 0.0.0.0:443 c2.example.org:443
[*] リダイレクタを 0.0.0.0:443 で開始...
[+] 接続を待機中...
B) Nginx リバースプロキシをリダイレクタとして使用
$ sudo apt install nginx
/etc/nginx/sites-available/striker)。プレースホルダー:
<ドメイン名> - サーバーの完全修飾ドメイン名。SSL 証明書のものと一致する必要があります。<ssl-cert> - 使用する SSL 証明書ファイル。<ssl-key> - 使用する SSL キーファイル。<c2-server> - リクエストを転送する C2 サーバーの完全な URL。警告:client_max_body_size は backend/.env ファイルの MAX_UPLOAD_SIZE で定義されたサイズと同じかそれ以上に設定しないと、大きなファイルのアップロードが失敗します。
server {
listen 443 ssl;
server_name <ドメイン名>;
ssl_certificate <ssl-cert>;
ssl_certificate_key <ssl-key>;
client_max_body_size 100M;
access_log /var/log/nginx/striker.log;
location / {
proxy_pass <c2-server>;
proxy_redirect off;
proxy_ssl_verify off;
proxy_read_timeout 90;
proxy_http_version 1.0;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
$ sudo ln -s /etc/nginx/sites-available/striker /etc/nginx/sites-enabled/striker
$ sudo service nginx restart
これでリダイレクタがポート 443 で起動します。次のコマンドでテストできます(FQDN が striker.local の場合)。
$ curl https://striker.local
正常に動作すれば、バックエンドが使用する 404 応答が返ります。
{"error":"Invalid route!"}
A) C エージェント
これらは Striker が使用するインプラントです。主要なエージェントは C で書かれており、agent/C/ にあります。Linux と Windows の両方のホストをサポートしています。Linux エージェントは外部で libcurl に依存しており、ほとんどのシステムにインストールされています。
Windows エージェントには外部依存関係はありません。通信には wininet を使用しており、すべての Windows ホストで利用可能だと思います。
64 ビットホストの場合、以下で 64 ビット用にビルドします。
$ cd agent/C
$ mkdir bin
$ make
64 ビット環境で 32 ビット用にビルドする場合:
$ sudo apt install gcc-multilib
$ make arch=32
上記はすべてを bin/ ディレクトリにコンパイルします。動作するインプラントを生成するには、次の2つのファイルのみ必要です。
bin/stub - 動作するインプラントのテンプレートとして使用されるエージェントスタブ。bin/builder - エージェントスタブをパッチして動作するインプラントを生成するために使用するもの。ビルダーは次の引数を受け付けます。
$ ./bin/builder
[-] 使用法: ./bin/builder <url> <auth_key> <delay> <stub> <outfile>
ここで:
<url> - 報告先のサーバー。理想的にはリダイレクタですが、サーバーへの直接 URL でも動作します。<auth_key> - C2 に接続する際に使用する認証キー。Web UI の auth keys タブで作成できます。<delay> - コールバック間の遅延(秒)。少なくとも 2 以上に設定する必要があります。ノイズのレベルに応じて調整します。<stub> - 読み取るスタブファイル。この場合は bin/stub。<outfile> - 新しいインプラントの出力ファイル名。例:
$ ./bin/builder https://localhost:3000 979a9d5ace15653f8ffa9704611612fc 5 bin/stub bin/striker
[*] 文字列を難読化...
[+] 69 個の文字列を難読化しました :)
[*] マーカーのオフセットを検出...
[+] オフセット:
URL: 0x0000a2e0
OBFS Key: 0x0000a280
Auth Key: 0x0000a2a0
Delay: 0x0000a260
[*] パッチ適用...
[+] 操作が完了しました!
これには MinGW が必要です。以下で 32 ビットおよび 64 ビットの Windows 開発環境をインストールします。
$ sudo apt install mingw-w64
64 ビット用にビルド:
$ cd agent/C
$ mdkir bin
$ make target=win
32 ビット用にコンパイル:
$ make target=win arch=32
これによりすべてが bin/ ディレクトリにコンパイルされ、ビルダーとスタブがそれぞれ bin\stub.exe および bin\builder.exe として生成されます。
B) Python エージェント
Striker には自己完結型の Python エージェントも付属しています(Python 2.7.16 および 3.7.3 でテスト済み)。これは agent/python/ にあります。このエージェントでは最も基本的な機能のみが実装されています。C エージェントを実行できないが Python がインストールされているホストに便利です。
このディレクトリには2つのファイルがあります。
stub.py - ビルダーに渡すペイロードスタブ。builder.py - インプラントを生成するために使用するもの。使用例:
$ ./builder.py
[-] 使用法: builder.py <url> <auth_key> <delay> <stub> <outfile>
# 以下は `output.py` として動作するペイロードを生成します
$ ./builder.py http://localhost:3000 979a9d5ace15653f8ffa9704611612fc 2 stub.py output.py
[*] エージェントスタブを読み込み中...
[*] 設定を書き込み中...
[+] エージェントのビルドに成功しました: output.py
# 実行
$ python3 output.py
上記の手順に従った後、Striker は使用可能な状態になります。使用ガイドをご覧ください。楽しんで、ハッピーハッキング!
このプロジェクトが気に入ったら、コーヒーをコードに変えるのを手伝ってください!