Marco de simulación de adversarios basado en playbooks que compila rutas de ataque definidas en JSON en payloads de shellcode independientes de posición para validar detecciones avanzadas y agentes de investigación basados en IA.

SynthAPT es un marco de simulación de adversarios basado en playbooks para replicar rutas de ataque complejas. Está diseñado para validar detecciones avanzadas y agentes de investigación basados en IA. La idea central es que el comportamiento del malware puede expresarse en JSON y compilarse en malware funcional, permitiendo el desarrollo rápido de escenarios realistas utilizando LLMs.

El implante central es una carga útil de shellcode controlada por un intérprete de playbook. Un playbook predefine toda la ruta de ataque y el implante la sigue, moviéndose por el entorno mediante inyección de procesos, movimiento lateral, etc. Cada implante se genera como un hilo independiente con su propio conjunto de instrucciones, por lo que los ataques de múltiples etapas (por ejemplo, acceso inicial → escalada de privilegios → movimiento lateral → exfiltración) se expresan como un gráfico de implantes cooperantes, todos definidos de antemano en el playbook. Esto tiene tres ventajas principales:

Si no desea usar la versión precompilada, puede compilarlo de la siguiente manera:
Construir con cargo make:```bash
cargo make build
./target/release/synthapt
Esto compilará el shellcode y el editor.
Ejecutar SynthAPT sin ningún comando te llevará al editor. Puedes proporcionar una clave API de Claude y ver los cambios a medida que indicas.```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
Si quieres usar otro LLM o una suscripción, puedes ejecutar `synthapt export-skill` y usarlo con cualquier configuración de codificación que tengas.
Debería generar un playbook JSON. Compílalo en un payload con el comando 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
Las constantes se pueden definir como cadenas, objetos hexadecimales u objetos base64:```json "constants": [ "c:\windows\temp\file.txt", { "hex": "deadbeef" }, { "base64": "SGVsbG8=" } ]
---
### end (0x00)
Fin del conjunto de tareas. Añadido automáticamente por el compilador – no es necesario que lo agregues.
---
### store_result (0x01)
Almacena el último resultado de la operación en una variable.
| Campo | Tipo | |
|-------|------|-|
| var | u16 | **obligatorio** |```json
{ "op": "store_result", "var": 0 }
Devuelve los bytes de shellcode actuales con un ID de tarea opcional y/o un valor mágico insertado.
| Campo | Tipo | |
|---|---|---|
| task | u8 | opcional |
| magic | u32 cadena hexadecimal o número | opcional |
| { "op": "get_shellcode" } | ||
| { "op": "get_shellcode", "task": 5, "magic": "0x18181818" } |
### sleep (0x03)
Espera durante el número especificado de milisegundos.
| Campo | Tipo | |
|-------|------|-|
| ms | u32 | **requerido** |```json
{ "op": "sleep", "ms": 5000 }
Ejecuta un comando a través de cmd.exe.
| Campo | Tipo | |
|---|---|---|
| command | string | requerido |
| { "op": "run_command", "command": "whoami /all" } |
---
### get_cwd (0x05)
Obtener el directorio de trabajo actual. Sin argumentos.```json
{ "op": "get_cwd" }
Lee un archivo y devuelve su contenido.
| Campo | Tipo | |
|---|---|---|
| path | string | obligatorio |
| { "op": "read_file", "path": "c:\users\public\data.txt" } | ||
| { "op": "read_file", "path": "%0" } |
---
### write_file (0x07)
Escribir bytes en un archivo.
| Campo | Tipo | |
|-------|------|-|
| path | string | **requerido** |
| content | bytes | *opcional* (archivo vacío si se omite) |```json
{ "op": "write_file", "path": "c:\\temp\\out.txt", "content": "hello" }
{ "op": "write_file", "path": "%0", "content": "$1" }
Imprime el código de estado de una variable (0 = éxito, distinto de cero = error).
| Campo | Tipo | |
|---|---|---|
| var | u16 | requerido |
| { "op": "check_error", "var": 0 } |
---
### condicional (0x09)
Salta a diferentes índices de tarea según el estado de la variable.
| Field | Type | |
|-------|------|-|
| mode | `"data"` o `"error"` | **requerido** |
| var1 | u16 | **requerido** |
| var2 | u16 | *opcional* (compara dos variables en lugar de una única verificación) |
| true | u16 | **requerido** (índice de tarea si la condición es verdadera) |
| false | u16 | **requerido** (índice de tarea si la condición es falsa) |
`true_target` y `false_target` se aceptan como alias de `true` y `false`.
Modos de una variable:
- `"data"` — verdadero si var1 tiene datos no vacíos
- `"error"` — verdadero si el estado de var1 es 0 (éxito)