
Threadpool을 통해 Nt API 호출을 프록시하기 위한 Crystal Palace 라이브러리입니다. call gadgets용으로 업데이트되었습니다.
이것은 https://github.com/AlmondOffSec/LibTPLoadLib 을 일반화한 것으로, 임의 개수(실제로는 최대 11개이지만 충분히 쓸 만한)의 인자를 가진 API를 프록시하기 위한 것입니다. Crystal Palace 공유 라이브러리로 제공됩니다. API는 @rasta-mouse의 LibTP와 호환되도록 만들어져 spec 파일을 통해 쉽게 전환할 수 있습니다. 최신 Crystal Palace 기능을 선보이기 위한 후크가 제공됩니다.
경고 ⚠️ : 이 프로젝트는 그대로 사용할 수 없습니다. call 가젯을 찾을 수 있는 모듈은 제공하지 않습니다. 직접 찾아야 합니다. 자세한 내용은 블로그 게시물을 읽어보세요.
참고 : 11개의 인자(그중 7개는 스택에 배치됨)를 전달할 수 있기 때문에 call 가젯은 스택 프레임이 충분히 큰 함수 내에 위치해야 합니다. 최소 0x68 크기의 add rsp를 찾으세요.
경고 ⚠️ : 이 기법의 내부 동작 방식 때문에 프록시된 함수의 반환 값을 가져올 수 없습니다. NTAPI를 프록시하는 것이 일반적으로 더 실용적입니다. NTAPI의 반환 값은 "단지" NTSTATUS뿐이기 때문입니다. 그래도 함수가 실제로 성공했는지 알기 어렵게 만듭니다 🙃.
대상에서 사용 가능한 모듈에서 작동하는 가젯을 찾습니다. src/tp_gadget.c에서 호출과 함수의 이름을 패치하여 해당 주소를 가져오도록 합니다. 필요하다면 어셈블리 스텁을 패치합니다( 값, 가젯이 호출할 레지스터).
LoadLibraryAGetCallGadgetAddresssub rsp프로젝트를 컴파일합니다: make. 출력물은 Crystal Palace 공유 라이브러리 libtp_gadget.x64.zip입니다.
예제 COFF를 컴파일합니다(wininet.dll을 로드한 다음 로컬로 할당하고 셸코드를 실행하는 것뿐입니다): make -C example_print. 출력물은 COFF 파일 example_print.x64.o입니다.
링커가 DFR에서 우리의 후크를 사용하도록 지시하는 Crystal Palace spec 파일을 생성합니다: Tradecraft Garden의 Simple PIC spec 파일을 사용하고 mergelib "../libtcg.x64.zip"과 export 사이에 다음 줄을 추가합니다:
mergelib "../libtcg.x64.zip"
attach "KERNEL32$LoadLibraryA" "H_LoadLibraryA"
optout "ProxyNtApi" "H_LoadLibraryA"
attach "NTDLL$NtOpenProcess" "H_NtOpenProcess"
attach "NTDLL$NtAllocateVirtualMemory" "H_NtAllocateVirtualMemory"
attach "NTDLL$NtWriteVirtualMemory" "H_NtWriteVirtualMemory"
attach "NTDLL$NtProtectVirtualMemory" "H_NtProtectVirtualMemory"
attach "NTDLL$NtFreeVirtualMemory" "H_NtFreeVirtualMemory"
attach "NTDLL$NtClose" "H_NtClose"
attach "NTDLL$NtCreateThreadEx" "H_NtCreateThreadEx"
attach "NTDLL$NtOpenThread" "H_NtOpenThread"
attach "NTDLL$NtSuspendThread" "H_NtSuspendThread"
attach "NTDLL$NtResumeThread" "H_NtResumeThread"
attach "NTDLL$NtGetContextThread" "H_NtGetContextThread"
attach "NTDLL$NtSetContextThread" "H_NtSetContextThread"
attach "NTDLL$NtWaitForSingleObject" "H_NtWaitForSingleObject"
Crystal Palace를 사용하여 전체를 링크해 PIC 셸코드를 만듭니다: path/to/crystalpalace/link simplepic_modified/loader.spec example_print/example_print.x64.o out.bin.
아무 로더를 사용하여 셸코드를 실행합니다.