
Crystal Palace로 구축된 Cobalt Strike용 PoC UDRL로, Raphael Mudge의 페이지 스트리밍 기법과 모듈형 콜 게이트(Draugr)를 결합합니다.
Eden 로더는 Crystal Palace로 빌드된 Cobalt Strike용 PoC UDRL로, Raphael Mudge의 페이지 스트리밍 기법과 모듈형 콜게이트(현재 Sleepmask-VS Draugr callgate BOF의 PIC 버전)를 결합합니다.
Eden 로더의 목표는 다음과 같습니다:
Eden 로더에 대한 자세한 내용은 관련 블로그를 참조하십시오.
참고: Eden의 목적은 Crystal Palace를 사용하여 서로 다른 '실행 단위'(즉, capabilities)를 결합해 커스텀 로더를 만드는 아이디어를 입증하는 것입니다. 완전한 기능을 갖춘 '회피형' 로더를 의도하지 않으며, 따라서 설계상 여러 기본 OPSEC 기능이 부족합니다. 예를 들어, RWX 메모리를 사용하고 Beacon의 힙 메모리를 추적/마스킹하지 않습니다(따라서 이와 같은 YARA 시그니처에 취약합니다).
참고: 이 빠른 시작 가이드는 Crystal Palace를 다운로드/빌드하고 개발 환경 구성을 위해 다음 단계를 완료했다고 가정합니다.
stage {
set sleep_mask "false";
}
WSL 터미널을 열고 Eden 로더를 빌드하십시오: make clean; make.crystalpalace.jar을 Cobalt Strike 클라이언트 디렉터리에 복사하십시오.eden.cna을 Cobalt Strike 클라이언트에 로드하십시오.[14:55:55] [*] Generating Payload: HTTP -- Type: HTTP -- Arch: x64 -- Exit Function: Thread -- System Call: None -- HTTP Library: wininet
[14:55:56] [EDEN] Parsing C:\Users\wb\Desktop\eden\eden.spec...
[14:55:56] [EDEN] Applying eden ldr spec...
[14:55:56] [EDEN] Payload Size: 387060 bytes
[14:55:56] [*] Using user modified reflective DLL! DLLName=resources/beacon.x64.rl0k.dll Arch=x64
참고: Eden은 HTTP(S), DNS 및 Pivot Beacons를 지원합니다.
릴리스 당시 Crystal Palace의 한 가지 제약은 현재 mingw로 빌드된 오브젝트 파일만 지원한다는 것입니다. MSVC 또는 Clang으로 빌드된 COFF를 사용하려고 하면 일반적으로 재배치(relocation) 오류가 발생합니다. mingw는 pdb 파일을 직접 지원하지 않으므로 복잡한 Windows 트레이드크래프트를 작성할 때 디버깅이 어려워 답답할 수 있습니다. 그러나 Makefile에 -g 옵션을 추가하면 실행 파일 빌드에 디버그 정보를 포함할 수 있습니다. 이를 통해 WinDbg에서 코드를 단계별로 실행할 수 있습니다. 이 프로세스에 대한 자세한 내용은 Rastamouse의 다음 블로그를 읽는 것이 좋습니다.
이 저장소는 기본적으로 위 접근 방식을 사용하여 Draugr(draugr.x64.exe) 및 페이지 스트리밍 코드(guardexec.x64.exe)의 디버그 빌드를 생성합니다. Draugr 디버그 빌드는 종속성이 없으므로 바로 빌드됩니다. 그러나 페이지 스트리밍/IAT 후크 코드를 단계별로 실행/디버깅하려면 아래 단계를 따라야 합니다:
1. 로더 없이 Beacon 내보내기:
debug/export_beacon_with_no_ldr.cna를 CS 클라이언트에 로드하고 stageless raw x64 (HTTP) Beacon을 /eden/debug/ 디렉터리로 내보내십시오. 그러면 리플렉티브 로더 없이 Beacon DLL이 내보내지며, 이를 사용하여 guardexec 엔트리 포인트를 모킹할 수 있습니다.$ xxd -i ./beacon_x64.bin > debug_beacon.h2. Crystal Palace에서 Draugr PIC 스텁 내보내기:
$ ./piclink /<path>/eden/debug/draugr.spec x64 /<path>/eden/debug/draugr.bin을 통해 Crystal Palace를 실행해야 합니다. 그러면 Crystal Palace가 guardexec 엔트리 포인트 모킹에 사용할 수 있는 Draugr PIC 스텁 만 출력합니다.$ xxd -i ./draugr.bin > debug_druagr.h3. WinDbg에서 디버깅 시작
make clean;makeWinDbg를 열고 실행 파일 실행(/eden/bin/draugr.exe 또는 /eden/bin/guardexec.exe)을 선택하십시오Open source file을 선택하고 관련 .c 파일을 선택하십시오(예: 페이지 스트리밍 코드를 디버깅하는 경우 guardexec.c).참고: Crystal Palace가 암호화된 DLL 및 해당 키와 같은 항목에 대해 디버그 페이로드를 내보내도록 할 명확한 방법이 없으므로 로더용 디버그 실행 파일은 없습니다. 따라서 모킹된 '암호화된' PIC 버퍼를 전달하는 것은 간단하지 않습니다.
Eden 로더는 주로 서로 다른 **'capabilities'**를 결합하여 새로운 로더를 만드는 Crystal Palace의 강력함을 입증하기 위한 것입니다. 이 아이디어는 이 저장소에서 구현된 것보다 훨씬 더 발전시킬 수 있습니다(예: COFF 모듈(가드레일, 콜게이트, 슬립 난독화 등)을 통해 완전히 커스터마이즈 가능한 '정적' PIC 로더).
Eden 로더는 Beacon의 수명 주기의 모든 호출을 스푸핑할 수 있도록 명시적으로 PIC 버전의 Draugr을 사용합니다(예: 리플렉티브 로딩 프로세스 중 사용되는 VirtualAlloc / LoadLibrary 호출). 경우에 따라 이는 과할 수 있습니다(예: EDR이 백업되지 않은 LoadLibrary 호출 등을 신경 쓰지 않는 경우). 이 경우 훨씬 더 간단한 Draugr의 PICO(=='BOF') 버전을 사용하도록 수정할 수 있습니다.
Eden 로더는 의도적으로 'Callgate'를 로더에서 분리하려고 합니다. 이는 모듈성을 위한 설계로, BeaconGate/콜게이트 BOF를 교체할 수 있다는 아이디어입니다. 따라서 Draugr 콜게이트 코드는 모두 자체 오브젝트 파일에 포함되어 있습니다. 이를 다른 'capability'로 교체하면 Eden의 TTP를 크게 변경할 수 있습니다.
Eden 로더는 의도적으로 Crystal Palace의 최신 기능을 사용하지 않습니다. 예를 들어, mergelib는 Crystal Palace의 공유 라이브러리인 LibTCG와 함께 사용할 수 있습니다. 그러나 이는 코드 디버깅 기능을 잃게 된다는 것을 의미합니다.
페이지 스트림 기법은 특정 명령에 대해 Beacon 성능에 영향을 줄 수 있습니다(예: 기본적으로 4개의 가시 페이지가 구성된 경우 프로세스 인젝션에 **약 1분(!)**이 소요됩니다). guardexec.h에서 #define MAXVISIBLE을 늘리면 대부분의 문제를 해결할 수 있습니다(Eden의 기본값은 6). 일반적인 참고로, 페이지 스트리밍은 프로세스 인젝션 기법(특히 타이밍에 의존하는 경우)에 문제를 일으킬 수 있습니다.
https://aff-wg.org/2025/03/13/the-security-conversation/
Eden 로더는 Crystal Palace (https://tradecraftgarden.org/crystalpalace.html)로 빌드되었으며 다음 프로젝트를 사용합니다:
마지막으로, 개발 중에 도움이 된 Crystal Palace에 대한 블로그를 작성해 주신 @rastamouse에게 감사를 전합니다.