
emp3r0r v4.7.1
자가 치유 Gossip Mesh C2: 지원 피어 발견, 크로스 플랫폼 BOF 실행, 스크립트 가능 에이전트.
emp3r0r
자기 복구 가십 메시 C2 (Gossip Mesh C2) — 보조 피어 탐색, 크로스 플랫폼 BOF 실행, 스크립트 가능 에이전트 지원.
emp3r0r이란 무엇인가?
emp3r0r은 Linux 및 Windows 대상 환경을 위해 설계된 고급 제로 트러스트 침투 후(post-exploitation) 프레임워크이자 명령 및 제어(C2) 시스템입니다. 고보안 환경에서 작동하도록 처음부터 구축된 emp3r0r은 자율 가십 메시 네트워킹, 파일리스 메모리 전용 실행, 크로스 플랫폼 BOF 로딩, 에이전트 간 파일 전송, 인메모리 스크립트 가능 에이전트를 결합하여 뛰어난 은닉성, 운영 제어 및 운영 보안(OPSEC)을 제공합니다.
주요 특징 및 고유 기능
🐍 스크립트 가능 에이전트 (내장 Starlark 엔진 및 Win32 API 프록시)
emp3r0r 에이전트는 내장 Starlark 스크립팅 엔진(순수 Go로 구현된 Python 방언)을 갖추고 있습니다. 스크립트는 대상에 Python, Bash 또는 PowerShell이 설치되어 있지 않아도 메모리에서 파일리스로 실행됩니다.
- 호스트 의존성 제로: 명령 인터프리터(
/bin/sh,powershell.exe)를 생성하거나 설치된 런타임에 의존하지 않고 독립 실행형 스크립트를 실행합니다. - 내장 에이전트 Go API: 파일 시스템 작업(
read_file,write_file,list_dir,mkdir,remove,exists), HTTP 네트워킹(http_get,http_post), 명령 실행(exec_cmd), 해싱(crypto_hash)을 위한 함수가 노출됩니다. - 동적 Win32 API 프록시: Windows 대상에서 Starlark 스크립트는 네이티브 C 코드를 컴파일하지 않고도 시스템 DLL을 동적으로 로드하고 스크립트 코드에서 직접 네이티브 Win32 API(
win_call,win_alloc,win_free,win_read_mem)를 실행할 수 있습니다. - 모듈식 통합: Starlark 스크립트는 JSON 매니페스트(
config.json)로 정의되어 CLI 매개변수 파싱 및 배포가 원활합니다.
중요한 이유: 기존 C2 스크립트 모듈은 호스트 인터프리터나 프로세스 생성을 필요로 하여 디스크 또는 명령줄 실행 흔적을 남깁니다. emp3r0r의 스크립트 가능 에이전트는 네이티브 시스템 상호작용과 함께 복잡한 로직을 완전히 메모리에서 실행합니다.
🔐 TOFU 암호화 ID 고정
emp3r0r은 에이전트 등록 시 엄격한 UUID 및 공개 키 고정과 함께 최초 사용 신뢰(TOFU) 를 적용합니다.
- 불변 바인딩: 등록되면 에이전트의 UUID는 암호화 공개 키에 고정됩니다. 변경된 자격 증명으로 재등록하면 가장(impersonation) 시도로 거부됩니다.
- 통제된 재설정: 등록 해제는
forget_agent를 통한 명시적 운영자 승인이 필요합니다.
중요한 이유: 세션 하이재킹, 에이전트 복제, 운영 환경 전반의 조용한 ID 드리프트를 방지합니다.
🔒 완전 순방향 비밀성 (PFS)
모든 C2 및 피어 통신은 HKDF 파생 세션 키와 함께 ECDH 키 교환을 적용합니다.
- 임시 키: 각 세션은 고유한 암호화 키를 생성합니다.
- 분리된 보안: 장기 키 또는 개별 에이전트가 손상되어도 과거 또는 병렬 통신은 손상되지 않습니다.
중요한 이유: 가로챈 네트워크 캡처의 사후 복호화를 방지합니다.
🕸️ 자율 P2P 가십 메시 네트워크
이그레스 제한 또는 격리된 네트워크 세그먼트의 에이전트는 자율적으로 피어를 발견하고 가십 기반(Memberlist) 메시 네트워크를 통해 트래픽을 터널링합니다.
- 플러그형 피어 전송: 위장 mTLS 1.3(임시 인증서 사용) 및 KCP(신뢰할 수 있는 UDP) 지원.
- 종단 간 암호화: 모든 에이전트 간 메시 홉은 AES-GCM 암호화로 래핑됩니다.
- 낮은 네트워크 풋프린트: 에이전트 간 직접 릴레이는 불필요한 브로드캐스트 노이즈와 중앙 집중식 C2 연결 병목 지점을 제거합니다.
중요한 이유: 분할된 네트워크 간 피벗은 지속적인 운영자 개입이나 정적 프록시 설정 없이 자율적으로 발생합니다.
📂 P2P 파일 시스템
P2P 릴레이 전송(mTLS/KCP)을 통한 에이전트 간 직접 파일 공유로 내부 네트워크 전반의 파일 전달을 가속화합니다.
- 암호화된 P2P 터널: mTLS/KCP를 사용하여 피어 간 전송을 터널링하여 이그레스 제한을 우회하고 중앙 C2 대역폭 병목을 줄입니다.
- 스마트 인메모리 파일 캐싱: 파일은 암호화된 블롭으로 에이전트 메모리에 캐시되며, 다른 에이전트가 요청 시 다운로드할 수 있도록 원활하게 제공될 수 있습니다. 파일을 요청할 때 에이전트는 로컬 memfs를 먼저 확인한 다음 다른 피어, 마지막으로 C2를 확인합니다.
- 자동 C2 릴레이 폴백: 대상 피어에 요청된 파일이 없으면 요청 시 C2 서버에서 동적으로 가져와 스트리밍합니다.
중요한 이유: 에이전트 간 직접 파일 공유는 전송 속도를 극대화하고 네트워크 병목 지점을 우회하며 직접 C2 트래픽 가시성을 줄입니다.
📡 다중 프로토콜 리스너 및 플러그형 스테이저
초기 접근 및 페이로드 전달을 위한 유연한 Stage 0 다운로더 스테이저 및 프로토콜 리스너.
- 다중 프로토콜 리스너: 신뢰할 수 있는 시퀀스-확인 프레이밍과 사용자 지정 HTTP 프로필을 갖춘 내장 및 독립 실행형 HTTP, TCP, UDP 리스너. 독립 실행형 리스너는 선택적 TLS(
-tls)를 지원하며, 인증서/키 쌍이 제공되지 않으면 자체 서명 인증서를 자동 생성합니다. - 독립 실행형 C 다운로더 스테이저: libc에 의존하지 않는 직접 Linux syscall로 구축되어 기호 오류 없이 다양한 배포판에서 호환됩니다.
- 암호화된 스테이지 전달: 리스너는 운영자가 제공한 비밀에서 파생된 키로 RC4를 사용하여 스테이징된 페이로드를 암호화합니다. 스테이저는 반사 로딩 전에 메모리에서 복호화합니다.
- 플러그형 스테이저 전송: 운영자가 사용자 지정 C 전송 모듈(
transport_<name>.c)을 추가할 수 있는 모듈식 전송 시스템. 내장 독립 실행형 옵션에는 원시 syscall을 통한 HTTP, TCP, UDP와 동적 라이브러리 전송(예: 런타임 기호 해석을 통한libcurl)이 포함됩니다.- 이점: 핵심 스테이저 로직을 변경하지 않고 네이티브
libcurl또는 사용자 지정 프로토콜 구현과 같은 합법적인 시스템 채널로 트래픽을 원활하게 혼합하여 이그레스 필터링 및 네트워크 탐지를 우회합니다.
- 이점: 핵심 스테이저 로직을 변경하지 않고 네이티브
- 플러그형 자체 압축 해제 패커: 확장 가능한 스텁 및 패커 모듈 인터페이스(
pack_<name>.py+unpack_stub_<name>.c). 운영자는 자동 런타임 헤더 패칭과 함께 사용자 지정 패킹/난독화 알고리즘(내장 옵션에는 RC4 스트림 암호화 및 탐욕적 LZSS 압축 포함)을 작성할 수 있습니다.- 이점: 고유 키 또는 알고리즘으로 Stage 0 페이로드를 암호화/압축하여 정적 AV/EDR YARA 규칙 및 시그니처 매칭을 깨뜨리고, 읽기/쓰기 메모리로 자체 압축 해제한 후 실행 전에 읽기/실행으로 전환합니다.
- 초소형 페이로드 크기: emp3r0r 에이전트 바이너리는 압축 없이 약 20MB이지만, 이 스테이저는 2KB입니다. emp3r0r 리스너에서 가져오는 sRDI 유사 페이로드는 약 8MB입니다(ELF 공유 객체 형식의 에이전트 바이너리에서 압축됨).
- 유연한 형식: 원시 위치 독립 셸코드(
.bin), 자체 압축 해제 패킹 셸코드(packed), 독립 실행형 ELF 실행 파일 또는 공유 객체(.so)로 컴파일됩니다. - 인메모리 강화: 스테이지 메모리를 읽기/쓰기로 할당하고, 페이로드 난독화를 해제한 후 반사 로딩 전에 읽기/실행을 적용합니다. 자체 압축 해제기는 RWX(읽기/쓰기 → 압축 해제 → 읽기/실행)를 매핑하지 않으며, 변경 가능한 스테이저 상태는 쓰기 가능한 코드가 아닌 전용 읽기/쓰기 페이지에 있습니다.
🧩 네이티브 크로스 플랫폼 BOF 및 PICO 지원 (COFF, ELF 및 PICO)
Windows 및 Linux 대상 모두에서 인메모리 바이너리 모듈 실행:
- Windows COFF 로더: 형식화된 매개변수 패킹(
int,short,cstr,wstr,binary)으로 Windows BOF 바이너리를 파일리스로 실행합니다. - Linux ELF 객체 로더: Linux에서 ELF 재배치 가능 객체 파일(
.o)을 에이전트 메모리에 직접 로드합니다. - Crystal-Kit PICO 모듈 및 스택 스푸핑: 고급 회피를 위한 SilentMoonwalk 콜스택 동기화 해제 스푸퍼가 포함된 통합 PICO(위치 독립 코드 객체) 로더 및 패커.
- 번들 BOF 제품군: Kerbeus-BOF, Remote-OPs 및 상황 인식(SA) 모듈 컬렉션에 대한 내장 지원.
중요한 이유: 콜스택 스푸핑과 함께 프로세스 내에서 컴파일된 C 모듈을 실행하여 프로세스 생성 오버헤드를 제거하고 명령줄 및 콜스택 모니터링을 우회합니다.
🔑 온디맨드 Windows 토큰 조작
Windows의 에이전트는 간접 NT syscall을 사용하여 완전히 프로세스 내에서 실행 중인 프로세스의 액세스 토큰을 탈취, 캐시 및 가장할 수 있습니다.
- 탈취 및 캐시:
steal_token --pid <PID>는NtOpenProcess+NtDuplicateToken을 통해 프로세스 토큰을 복제하고 SID별로 메모리에 저장합니다. 선택적으로--token <sid>로 가장을 연결하여 한 탈취 신원에서 다른 신원으로 승격할 수 있습니다. - 열거:
list_tokens는DOMAIN\User (SID)이름으로 모든 캐시된 토큰을 표시합니다. - 범용 가장: 모든 모듈(Go, Starlark, COFF/BOF)에서 SID(
--token <sid>)로 캐시된 토큰을 참조합니다. 민감한 작업 주변에 스레드 수준 가장(NtSetInformationThread)이 적용됩니다. - 토큰 인식 Starlark: 내장 함수(
read_file,write_file,exec_cmd, Win32 API 프록시 등)는 토큰이 설정되면 syscall별로 자동으로 가장하며,exec_cmd는CreateProcessWithTokenW를 통해 탈취된 신원으로 자식 프로세스를 생성할 수 있습니다.
중요한 이유: 외부 도구, 디스크 아티팩트, 프로세스 생성 노이즈가 없습니다. 토큰 탈취 및 재사용은 간접 syscall을 사용하여 완전히 프로세스 내에서 발생하며, 탈취된 토큰은 모든 내장 모듈에서 즉시 사용할 수 있습니다.
🎭 플러그형 C2 전송, uTLS JA3 회피 및 CBOR 프로토콜
- 플러그형 C2 모드: 가변 HTTP 프로필을 갖춘 유연한 비콘(
http_poll) 및 HTTP/2를 통한 스트리밍(h2conn). - JA3 시그니처 무작위화: uTLS를 사용하여 TLS Client Hello 지문을 무작위화하여 정적 네트워크 시그니처를 무력화합니다.
- 바이너리 와이어 프로토콜: 모든 제어 데이터 및 와이어 직렬화에 CBOR(간결한 바이너리 객체 표현)을 사용하여 JSON 대비 네트워크 페이로드 크기를 30-40% 줄입니다.
💾 암호화된 메모리 우선 저장
- 인메모리 암호화 가상 파일 시스템: 모든 에이전트 파일 작업은 인메모리 AES-GCM 가상 파일 시스템을 사용합니다. 대용량 데이터는 식별 가능한 헤더나 확장자 없이 자동으로 암호화된 디스크 저장소로 유출됩니다.
- P2P 기반 스마트 캐싱: P2P 지원 에이전트는 C2에서 가져온 파일을 memfs에 캐시한 다음 다른 피어에서 사용할 수 있도록 제공하여 빠른 에이전트 간 연결을 활용하면서 C2 트래픽 풋프린트를 최소화합니다.
빠른 시작
1. C2 서버 설치
emp3r0r을 빌드하려면 호스트에 Docker 또는 Podman이 필요합니다. 로컬 Go 툴체인은 필요하지 않습니다.
# 저장소 클론
git clone --depth=1 https://github.com/jm33-m0/emp3r0r.git && cd emp3r0r
# 컨테이너 내에서 빌드하고 로컬에 설치
./install.py
설치 프로그램은 일회용 컨테이너 내에서 핵심 바이너리를 컴파일하고, 사전 컴파일된 emp3r0r-operator-kit.tar.zst를 생성하며, 필요한 Linux 기능(setcap)을 구성하고 시스템 런타임 디렉터리를 설정합니다.
옵션:
./install.py [--debug] [--disable-garble] [--prefix /usr/local] [--skip-build] \
[--lightweight] [--targets linux/amd64,windows/amd64]
--lightweight를 사용하여 linux/amd64 및 windows/amd64 exe/dll 대상만 빌드하거나(x86-64 전용 배포에 가장 빠름), --targets OS/ARCH,...를 사용하여 특정 페이로드 유형 세트를 컴파일합니다.
C2 서버 실행:
emp3r0r server --c2-hosts 1.2.3.4 --http-port 12345 --operator-port 13377
참고: 표준 sudo 대신 root 사용자로 설치한 경우, 설치 프로그램이 권한을 제대로 설정할 수 없어 현재 사용자가 emp3r0r을 실행하지 못할 수 있습니다. 운영자 머신에도 동일하게 적용됩니다.
2. 운영자 머신 설정
생성된 emp3r0r-operator-kit.tar.zst를 운영자 머신으로 전송하고 설치 프로그램을 실행합니다:
tar --zstd -xpf emp3r0r-operator-kit.tar.zst
cd ./emp3r0r-operator-kit && ./install.py
서버가 출력한 WireGuard 터널 자격 증명을 사용하여 운영자 클라이언트를 C2 서버에 연결합니다:
emp3r0r client --c2-port 13377 \
--server-wg-key '<SERVER_WG_KEY>' \
--server-wg-ip '<SERVER_WG_IP>' \
--operator-wg-ip '<OPERATOR_WG_IP>' \
--operator-wg-key '<OPERATOR_WG_KEY>' \
--c2-host 1.2.3.4
3. 에이전트 페이로드 생성
emp3r0r 운영자 인터페이스 내에서 generate 명령을 사용하여 페이로드를 생성합니다.
직접 C2 에이전트:
generate --type linux_executable --arch amd64 --cc your.domain.com
메시 게이트웨이 에이전트:
generate --type linux_executable --arch amd64 --cc your.domain.com \
--p2p --direct-c2 --p2p-transport mtls
메시 중간 피어:
generate --type linux_executable --arch amd64 --cc your.domain.com \
--p2p --p2p-transport mtls --peers 1.2.3.4
문서 및 리소스
- 📝 보안 정책: SECURITY.md
- 📜 변경 로그: CHANGELOG.md
- 🛠️ 모듈 개발 가이드: core/modules/module_development_guide.md
개발 지원
emp3r0r이 보안 연구 및 테스트에 유용했다면, GitHub Sponsors를 통해 지속적인 개발을 지원해 주시기 바랍니다.