Среда моделирования противника на основе плейбуков, которая компилирует пути атак, определённые в JSON, в позиционно-независимые полезные нагрузки шеллкода для проверки продвинутых средств обнаружения и AI-агентов расследования.

SynthAPT — это фреймворк для симуляции противника, основанный на плейбуках, предназначенный для воспроизведения сложных путей атак. Он разработан для проверки расширенных детекций и агентов расследования на основе ИИ. Основная идея заключается в том, что поведение вредоносного ПО может быть выражено в JSON и скомпилировано в функциональное вредоносное ПО, что позволяет быстро разрабатывать реалистичные сценарии с использованием LLM.

Основной имплант представляет собой шеллкод-нагрузку, управляемую интерпретатором плейбуков. Плейбук предопределяет полный путь атаки, и имплант следует ему, перемещаясь по среде через внедрение процессов, боковое перемещение и т.д. Каждый имплант запускается как независимый поток с собственной системой команд, поэтому многоэтапные атаки (например, начальный доступ → повышение привилегий → боковое перемещение → эксфильтрация) выражаются в виде графа взаимодействующих имплантов, все из которых определены заранее в плейбуке. Это имеет три основных преимущества:

Если вы не хотите использовать релиз, вы можете скомпилировать его следующим образом:
Сборка с помощью cargo make:```bash
cargo make build
./target/release/synthapt
Это скомпилирует shellcode и редактор.
Запуск SynthAPT без команд поместит вас в редактор. Вы можете предоставить Claude API key и просматривать изменения по мере ввода запросов.```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-плейбук. Скомпилируйте его в полезную нагрузку с помощью команды компиляции:```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)
Сохранить результат последней операции в переменную.
| Field | Type | |
|-------|------|-|
| var | u16 | **обязательно** |```json
{ "op": "store_result", "var": 0 }
Возвращает текущие байты shellcode с опционально вставленными идентификатором задачи и/или магическим значением.
| Field | Type | |
|---|---|---|
| task | u8 | необязательно |
| magic | u32 hex string or number | необязательно |
| { "op": "get_shellcode" } | ||
| { "op": "get_shellcode", "task": 5, "magic": "0x18181818" } |
---
### sleep (0x03)
Сон на указанное количество миллисекунд.
| Field | Type | |
|-------|------|-|
| 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)
Записать байты в файл.
| Поле | Тип | |
|-------|------|-|
| path | string | **обязательно** |
| content | bytes | *необязательно* (пустой файл, если опущено) |```json
{ "op": "write_file", "path": "c:\\temp\\out.txt", "content": "hello" }
{ "op": "write_file", "path": "%0", "content": "$1" }
Вывести код состояния переменной (0 = успех, не 0 = ошибка).
| Поле | Тип | |
|---|---|---|
| var | u16 | обязательно |
| { "op": "check_error", "var": 0 } |
---
### условный (0x09)
Переход к разным индексам задач в зависимости от состояния переменной.
| Поле | Тип | |
|------|-----|-|
| mode | `"data"` или `"error"` | **обязательно** |
| var1 | u16 | **обязательно** |
| var2 | u16 | *необязательно* (сравнение двух переменных вместо одиночной проверки) |
| true | u16 | **обязательно** (индекс задачи, если условие истинно) |
| false | u16 | **обязательно** (индекс задачи, если условие ложно) |
`true_target` и `false_target` принимаются как псевдонимы для `true` и `false`.
Режимы с одной переменной:
- `"data"` — истинно, если var1 имеет непустые данные
- `"error"` — истинно, если статус var1 равен 0 (успех)
Режимы с двумя переменными (при наличии 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 }