
ランダム化され、lint検証済みのC2 malleableプロファイルを生成し、Cobalt Strike向けにHTTP/S、DNS、SMB、SSHビーコン設定を自動化し、カスタマイズ可能なIOCランダム化を提供します。
C2concealerは、Cobalt Strikeで使用するランダム化されたC2 malleableプロファイルを生成するコマンドラインツールです。
git clone https://github.com/RedSiege/C2concealer.git
cd C2concealer
python3 -m venv .venv
source .venv/bin/activate
pip3 install -e .
詳細はDockerの手順を参照してください。
Usage:
$ C2concealer --hostname google.com --variant 3
Flags:
(optional)
--hostname
The hostname used in HTTP client and server side settings. Default is None.
--variant
An integer defining the number of HTTP client/server variants to generate.
Recommend between 1 and 5. Max 10.
root@kali:~# C2concealer --variant 1 --hostname google.com
[i] Searching for the c2lint tool on your system (part of Cobalt Strike). Might take 10-20 seconds.
[i] Found c2lint in the /opt/cobaltstrike/c2lint directory.
Choose an SSL option:
1. Self-signed SSL cert (just input a few details)
2. LetsEncrypt SSL cert (requies a temporary A record for the relevant domain to be pointed to this machine)
3. Existing keystore
4. No SSL
[?] Option [1/2/3/4]:
ヒント: 常にSSL証明書を使用してください。できればLetsEncryptまたは同様の証明書が望ましいです。 ヒント: HTTPバリアントを使用すると、異なるビーコンでHTTPトラフィックのIOCを選択できます。少なくとも1の値を推奨します。
私たちはCobalt Strikeのドキュメントを徹底的に調査し、各プロファイル属性に適した値の範囲を定義しました。データは単純な範囲内のランダムな整数であることもあれば、Python辞書からランダムな値を選ぶ必要があることもあります。いずれにせよ、ツールの作成は有効なプロファイルを構成するデータを定義することから始めました。
次に、malleableプロファイルの各セクション(ブロック)を個別の.pyファイルに分割しました。これらのファイルには、各属性にランダムで適切な値を取得し、そのプロファイルブロックのフォーマット済み文字列を出力するロジックが含まれています。すべてのプロファイルブロックを連結し、いくつかの簡単な整合性チェックを実行した後、Cobalt Strikeのリンター(c2lint)でプロファイルを検査します。出力されるプロファイルは、あなたのエンゲージメントで動作するはずです。キャンペーンを実行する前に、プロファイル(プロセスインジェクションやスポーンを含む)をテストすることを常に推奨します。
コードを見る場合は、次の2つのファイルから始めることをお勧めします: /C2concealer/__main__.py と /C2concealer/profile.py。コメントを確認した後、/C2concealer/components フォルダ内の個々のプロファイルブロックジェネレーターを確認してください。
これは重要です。これはオープンソースツールです。ベンダーは生成されたプロファイルのシグネチャを簡単に書くことができます。ツールの実行はCobalt Strikeのmalleableプロファイル構築の優れた出発点を提供しますが、生成されたプロファイルのデータをカスタマイズするために以下の領域を掘り下げることをお勧めします。
/C2concealer/data/
さらに、プロファイル生成プロセス全体で様々な属性をカスタマイズできます。例として、ファイル /C2concealer/components/stageblock.py では、PEイメージサイズ値の範囲を変更できます(73~74行目付近)。componentsディレクトリ内のすべての異なるファイルを確認してください。
ここまで来たなら、このツールを大いに活用できるでしょう。このツールの推奨される使い方は、自動的にプロファイルを生成する骨組みコードを構築したと考えることです。あとは、各属性に対してどの値がキャンペーンに適しているかを考え、データソースを更新するのはあなたの役割です。
Malleable C2プロファイル言語の多くの可能なオプションをカバーしましたが、設定していないオプションも多数あります。Malleable Command and Controlドキュメントを参照し、プロファイルを変更することを強くお勧めします。
以下のオプションは設定されていないか、C2concealerによって静的に設定されており、変更を検討すべきです。
http-config ブロック| 未設定のオプション | 備考 |
|---|---|
set block_useragents | 非ビーコンのUAパターンをブロック |
set allow_useragents | 許可リストUAパターン (CS 4.3+) |
stage ブロックprocess-inject ブロックpost-ex ブロック| 未設定のオプション | 備考 |
|---|---|
set pipename | post-exジョブ用の名前付きパイプ |
dns-beacon ブロック| 未設定のオプション | 備考 |
|---|---|
set ns_response | drop/idle/zero NS処理。未設定の場合はデフォルトでdrop。 |
set dns_stager_prepend | ステージングペイロードにデータを前置する |
| 欠落している変換 | 備考 |
|---|---|
lznt1 | 圧縮 — どのエンコードチェーンにもない |
rc4 "key" | 暗号化 — どのエンコードチェーンにもない |
xor "key" | XOR — どのエンコードチェーンにもない |
Raphael Mudge氏に大きな感謝を捧げます。彼はmalleableプロファイル機能セットとその学習のためのドキュメントを常に改善しています。また、@killswitch-GUI氏のスクリプトにも感謝します。このスクリプトはCSチームサーバー向けのLetsEncrypt証明書生成を自動化します。最後に、作業を大幅に楽にしてくれた2つのブログ記事: @bluescreenofjeff氏の記事 (https://bluescreenofjeff.com/2017-01-24-how-to-write-malleable-c2-profiles-for-cobalt-strike/) とJoe Vest氏の記事 (https://posts.specterops.io/a-deep-dive-into-cobalt-strike-malleable-c2-6660e33b0e0b) に感謝します。
Version 1.0
Version 1.1
| 未設定のオプション | 備考 |
|---|
set allocator | VirtualAlloc にハードコード; HeapAlloc, MapViewOfFile のランダム化が欠落 |
set magic_mz_x86 / magic_mz_x64 | MZヘッダーのなりすまし |
set magic_pe | PEマーカーのなりすまし |
set rich_header | コンパイラメタデータのなりすまし |
set module_x86 / module_x64 | Module stomping |
set copy_pe_header | — |
set data_store_size | — |
set eaf_bypass | EATチェックバイパス |
set syscall_method | None/Direct/Indirect (CS 4.8+) |
set rdll_loader | PrependLoader/StompLoader |
set rdll_use_syscalls | — |
set rdll_use_driploading | — |
set rdll_dripload_delay | — |
transform-obfuscate ブロック | base64, lznt1, rc4, xor オプションが完全に欠落 |
transform-x86/x64 内の append | prepend と strrep のみ使用 |
| 未設定のオプション | 備考 |
|---|
set allocator | VirtualAllocEx にハードコード; NtMapViewOfSection のランダム化が欠落 |
set use_driploading | — |
set dripload_delay | — |
transform-x86/x64 内の append | prepend のみ使用 |
Execute: NtQueueApcThread | executeブロックに未設定 |
Execute: NtQueueApcThread-s | executeブロックに未設定 |
Execute: ObfSetThreadContext | executeブロックに未設定 |
Execute: SetThreadContext | executeブロックに未設定 |
| Execute関数のなりすまし | module!function+0x## 構文は未サポート |
uri-append | 終了ステートメント — 未実装 |