
このプロジェクトは、sleepとPython言語の間の「ブリッジ」です。標準のGUIクライアントを必要とせずに、Pythonを介してCobalt Strikeチームサーバーを制御できます。注: このプロジェクトは非常にベータ版です。テストのためのプレイグラウンドを提供することを目的としており、公式にサポートされている機能ではありません。これは将来、コア製品に追加されるかもしれません。
このプロジェクトは、sleep言語とPython言語の間の「ブリッジ」です。標準のGUIクライアントを必要とせずに、PythonからCobalt Strikeチームサーバーを制御できます。
注記: このプロジェクトはまだベータ版です。目標はテストのためのプレイグラウンドを提供することであり、公式にサポートされている機能ではありません。おそらくこれは、将来的にコア製品に追加される可能性があります。
このプロジェクトは、@BinaryFaultline氏と@Mcgigglez16氏がプロジェクト https://github.com/emcghee/PayloadAutomation で行った作業に触発されました。お二人に特別な感謝を捧げます!!
このブリッジの中核は、ヘッドレスなCobalt StrikeクライアントのPython実装です。これは、agscript が提供するAggressor Scriptコンソールをエンジンとして使用することで実現されています。agscript はCobalt Strike (https://www.cobaltstrike.com/aggressor-script/index.html) とのヘッドレスな対話を可能にします。この「ブリッジ」は、sleepy.py 内のPythonヘルパー関数を使用して、agscriptコンソールが期待する必要なsleepコマンドを生成することで機能します。sleep関数を書く代わりに、striker.py がsleepを抽象化するヘルパー関数を提供し、Pythonの使用を可能にします。
PayloadAutomationプロジェクトに触発されたため、このプロジェクトは同じコードの多くから始まりましたが、agscriptラッパーとして機能するために必要なコンポーネントだけを使用するように簡素化したいと考えました。
このプロジェクトの例が最も理解しやすいかもしれませんが、それは example.py スクリプトです。
#!/usr/local/bin/python3
## Import the bridge
from sleep_python_bridge.striker import CSConnector
from argparse import ArgumentParser
from pprint import pp, pprint
###################
## Argparse
def parseArguments():
parser = ArgumentParser()
parser.add_argument('host', help='The teamserver host.')
parser.add_argument('port', help='The teamserver port.')
parser.add_argument('username', help='The desired username.')
parser.add_argument('password', help='The teamserver password.')
parser.add_argument('path', help="Directory to CobaltStrike")
args = parser.parse_args()
return args
## Let's go
def main(args):
cs_host = args.host
cs_port = args.port
cs_user = args.username
cs_pass = args.password
cs_directory = args.path
## Connect to server
print(f"[*] Connecting to teamserver: {cs_host}")
with CSConnector(
cs_host=cs_host,
cs_port=cs_port,
cs_user=cs_user,
cs_pass=cs_pass,
cs_directory=cs_directory) as cs:
# Perform some actions
#
# Get beacon metadata - i.e., x beacons() from the script console
beacons = cs.get_beacons()
print("BEACONS")
pprint(beacons)
# Get list of listners - i.e., x listeners_stageless() from the script console
listeners = cs.get_listeners_stageless()
print("LISTENERS")
pprint(listeners)
if __name__ == "__main__":
args = parseArguments()
main(args)
スクリプトを呼び出します
python3 example.py 127.0.0.1 50050 example password /path/to/cobaltstrike

ビーコンログは、チームサーバーの実行中に利用できるほか、チームサーバーに保存されたビーコンログファイルからも利用できます。データは常に存在しますが、希望する形式で表示されるとは限りません。これは、HTMLデータグリッドを使用してビーコンログをすばやく表示するログトラッカーの例です。
beaconlogtracker.py は、チームサーバーに接続し、実行中のビーコンログを30秒ごとに抽出して <code>beaconlogs.json` に保存し、検索可能でソート可能なHTMLデータグリッドに表示するスクリプトです。
ビーコンログは常に logs ディレクトリに保存されますが、これは別のビューアを使用してメモリ内ログを追跡する代替手段です。チームサーバーが再起動されるとメモリ内ログは失われるため、チームサーバー上の logs ディレクトリに保存されているログを参照する必要があります。このスクリプトは、メモリ内ログをファイル beaconlogs.json に同期し続けます。これにより、Cobalt Strikeが再起動された場合でも、logs ディレクトリを調べることなく、すべてのデータをすばやく簡単に視覚化できます。
チームサーバーに接続して30秒ごとにログを同期するようにスクリプトを起動します。
使用方法:
python3 beaconlogtracker.py 127.0.0.1 50050 logtracker password /path/to/cobaltstrike
これにより、beaconlogs.json は保存済みおよび実行中のビーコンログと同期されます。30秒ごとに同期されます。
output/html ディレクトリからWebサーバーを起動します。
python3 -m http.server 8000
http://localhost:8000/beaconlogs.html に接続します。

レッドチームオペレーターからよく要求される機能は、Cobalt Strike GUIを必要とせずにペイロードをプログラムで作成できることです。参照プロジェクトはペイロードジェネレータでこれを実現しました。これは素晴らしいですが、特有の課題があります。Aggressorは、ペイロードの構築方法に影響を与えるいくつかのフックを提供します。これらのフックは、さまざまなキット(アーティファクトキット、スリープマスクキット、UDRLキットなど)で使用されます。通常は、GUIを介してaggressorスクリプトをロードすることで使用されます。このプロジェクトは、外部スクリプトのロードを可能にするように拡張されました。これがないと、これらのペイロードフックを使用するのは困難です。このコードは、カスタム難読化を追加したり、カスタムローダーに埋め込んだり、その他の変更を行ったりするために、ペイロードを外部関数に渡すように簡単に拡張できます。
ペイロードジェネレータスクリプトは、チームサーバーに接続し、追加のスクリプトをロードして、ペイロードを作成します。
python3 payloadgenerator.py 127.0.0.1 50050 payloads password /path/to/cobaltstrike を実行します。この例では、アーティファクトキットとスリープマスクキットが有効になっているArsenalキットを追加する手順を示します。
cp -r /path/to/arsenal_kit/dist/* /path/to/sleep_python_bridge/payload_scriptspython3 payloadgenerator.py 127.0.0.1 50050 payloads password /path/to/cobaltstrike を実行します。通常、GUIを使用する場合、外部スクリプトは println aggressor関数を使用してScript Consoleに情報を出力できます。これはフィードバックやデバッグに役立ちます。payloadgenerator.py を使用する場合、println の出力は失われ、利用可能な唯一のオプションは elog 関数です。elog を使用する場合、Event Logの情報を表示するにはGUIが必要です。
「外部キットあり」の使用例の続きとして、/path/to/sleep_python_bridge/payload_scripts/arsenal_kit.cna ファイルを更新し、2箇所の println を elog に変更しましょう。この変更により、ArsenalキットのすべてのロギングがGUIのEvent Logで利用できるようになります。
外部スクリプトのロードは、ペイロードフック(アーティファクト、スリープマスク、UDRLキットなど)を含むペイロード変更スクリプトを除いて、常に必要というわけではありません。Cobalt Strike GUIからスクリプトをロードした場合、ペイロードはGUI経由のこれらのスクリプトを尊重しますが、agscriptクライアントからは尊重されません(これらは異なるクライアントです)。スクリプトとサポートファイルを payload_scripts ディレクトリに追加する必要があります。
payloadgenerator.py は、payload_scripts ディレクトリの最上位にある .cna スクリプトを自動的にロードします。サブディレクトリにある .cna スクリプトはロードされません。
Arsenal Kitを使用したディレクトリ構造の例。
$ ls -1R ./payload_scripts
./payload_scripts:
arsenal_kit.cna
artifact
sleepmask
./payload_scripts/artifact:
artifact32big.dll
artifact32big.exe
artifact32.dll
artifact32.exe
artifact32svcbig.exe
artifact32svc.exe
artifact64big.exe
artifact64big.x64.dll
artifact64.exe
artifact64svcbig.exe
artifact64svc.exe
artifact64.x64.dll
artifact.cna
./payload_scripts/sleepmask:
sleepmask.cna
sleepmask_pivot.x64.o
sleepmask_pivot.x86.o
sleepmask.x64.o
sleepmask.x86.o
@mgeeky氏による最近のアップデートのおかげで、payloadgenerator.py スクリプトは、4.8で追加された新しい artifact_payload 関数パラメータをサポートする追加引数をサポートするようになりました。これらの引数により、生成されるペイロードをより細かく制御できるようになりました。
$ python3 payloadgenerator.py --help
------------------------
Beacon Payload Generator
------------------------
usage: payloadgenerator.py [-h] [-o path] [-l name] [-a arch] [-t types] [-e exit] [-c method] host port username password path
positional arguments:
host The teamserver host.
port The teamserver port.
username The desired username.
password The teamserver password.
path Directory to CobaltStrike
optional arguments:
-h, --help show this help message and exit
optional parameters:
-o path, --payload-path path
Where to save generated payloads. Default: output/payloads/
-l name, --listener name
Specify listener name to get payloads for. Default: payloads for all listeners will be produced
-a arch, --arch arch Specify payload architecture. Choices: x86, x64. Default: payloads for both are generated
-t types, --payload-types types
Comma separated list of payload types to generate keyed by file extensions. Choices: exe,dll,svc.exe,bin,ps1,py,vbs or use 'all' to compile all at once.
Default: exe,dll,bin
-e exit, --exit exit Payload exit method. Choices: thread, process. Default: process
-c method, --call-method method
System call method. Choices: indirect, direct, none. Default: <empty> (backwards compatible with Cobalt pre 4.8)
$python3 payloadgenerator.py 127.0.0.1 50050 payloads password /path/to/cobaltstrike -o /share/payloads/ -c indirect -a x64
------------------------
Beacon Payload Generator
------------------------
[*] Connecting to teamserver: 127.0.0.1
Loading cna scripts from ./payload_scripts
Scripts
-------
arsenal_kit.cna
console.cna
[*] Creating stageless payloads for listener: http1
[*] Creating http1.x64.exe
[*] Creating http1.x64.dll
[*] Creating http1.x64.bin
$python3 payloadgenerator.py 127.0.0.1 50050 payloads password /path/to/cobaltstrike -o /share/payloads/ -c indirect -a x64 -t exe
------------------------
Beacon Payload Generator
------------------------
[*] Connecting to teamserver: 127.0.0.1
Loading cna scripts from ./payload_scripts
Scripts
-------
arsenal_kit.cna
console.cna
[*] Creating stageless payloads for listener: http1
[*] Creating http1.x64.exe
$python3 payloadgenerator.py 127.0.0.1 50050 payloads password /path/to/cobaltstrike -o /share/payloads/
------------------------
Beacon Payload Generator
------------------------
[*] Connecting to teamserver: 127.0.0.1
Loading cna scripts from ./payload_scripts
Scripts
-------
arsenal_kit.cna
console.cna
[*] Creating stageless payloads for listener: http1
[*] Creating http1.x86.exe
[*] Creating http1.x86.dll
[*] Creating http1.x86.bin
[*] Creating http1.x64.exe
[*] Creating http1.x64.dll
[*] Creating http1.x64.bin

これは、ビーコンを有向グラフで表示するベータ版のコードです。
このスクリプトは、ファイル output/data/beacons.json を更新します。
Webサーバーを起動し、http://localhost:8000/beacons.html を開きます。
使用方法:
python3 beacongrapher.py 127.0.0.1 50050 grapher password /path/to/cobaltstrike
これにより、JavaScriptグラファーが使用する beacons.json ファイルが作成されます。
output/html ディレクトリからWebサーバーを起動します。
python3 -m http.server 8000
| 項目 | 説明 |
|---|
| sleep_python_bridge | PythonがCobalt Strikeとインターフェースできるようにするライブラリ |
| output/html | HTMLデータビューア用のパス |
| output/html/data | データビューアが使用するJSONデータ用のパス |
| output/payloads | 保存されたペイロード用のパス(ペイロードジェネレータで使用) |
| payload_scripts | payloadgenerator.py によってロードされる外部スクリプト用のパス |
| beaconlogtracker.py | HTMLデータグリッドを使用してビーコンログを表示するビーコンログトラッカーの実装 |
| payloadgenerator.py | 各リスナー用のペイロードを作成するビーコンペイロードジェネレータの実装 |
| beacongrapher.py | HTML JavaScript有向グラフを使用してビーコンを追跡するビーコングラフトラッカーの実装 |