
변조된 시스템 콜을 사용한 원격 PE 인젝션용 Ghostly-Hollowing 구현
[!NOTE] 원본 저장소는 이전에 DeceptIQ의 창립자 @Rad9800에 대한 저작자 표시가 누락된 잘못된 라이선스를 사용하고 있었습니다. 그의 TamperingSyscalls 저장소는 MIT 라이선스로 게시되어 있습니다. 그의 작업은 이미 강의 모듈(하드웨어 중단점을 통한 변조된 Syscall)과 공개 제3자 라이선스 페이지에 명시되어 있었습니다.
누락을 인지한 즉시, 우리는 원본 저장소를 신속히 수정하고 Rad에게 같은 날 연락하여 실수에 대해 사과했습니다. 의도치 않은 실수를 바로잡기 위해 최선을 다했음에도 불구하고 그는 답장하지 않았고 추가 연락을 차단했으며, 5개월 후 DMCA 삭제 통지를 받아 원본 저장소가 삭제되었습니다.
불행히도, 악의적인 확대 조치로 인해 문제를 해결할 실질적인 경로가 없었으므로, 올바른 라이선스와 저작자 표시를 적용하여 저장소를 재업로드했습니다.
이 구현은 Maldev Academy 강의에 최근 업데이트된 두 가지 기술을 사용합니다:
하드웨어 중단점을 통한 변조된 Syscall: 사용자랜드 후크를 우회하는 동시에 호출된 syscall의 인자를 스푸핑하는 데 사용됩니다.
Ghostly Hollowing: 프로세스 할로잉(Process Hollowing)과 프로세스 고스팅(Process Ghosting) 사이의 하이브리드 기술입니다.
구현에서 호출되는 모든 syscall은 TAMPER_SYSCALL 매크로를 통해 호출됩니다. 이 매크로는 StoreTamperedSyscallParms 함수를 호출하여 다음을 수행합니다:
NtQuerySecurityObject syscall 스텁 내에서 syscall 명령의 주소를 확인하고 해당 주소에 하드웨어 중단점을 설정합니다 (즉, 디코이 syscall).TAMPER_SYSCALL 매크로를 호출하면 TAMPER_SYSCALL은 호출된 syscall의 처음 네 개 인자를 NULL 값으로 스푸핑합니다. 그런 다음 NtQuerySecurityObject syscall을 호출하여 앞서 설치된 중단점을 트리거합니다.
발생한 예외는 디코이 syscall(NtQuerySecurityObject)의 SSN을 실제 호출된 syscall(예: ZwAllocateVirtualMemory의 SSN)로 교체하여 처리합니다. 그런 다음 스푸핑된 인자를 실제 인자로 교체합니다. 이러한 단계는 ExceptionHandlerCallbackRoutine VEH 함수에서 실행됩니다.
PE 페이로드 가져오기: 이 구현은 디스크에서 PE 페이로드(mimikatz.exe)를 가져옵니다. 이상적인 상황에서는 페이로드를 암호화하여 리소스 섹션에 저장해야 합니다.
디스크에 빈 파일 만들기: $env:TMP 디렉터리에 임시 파일(.tmp)을 만듭니다. 이 파일은 나중에 PE 페이로드로 덮어쓰여집니다.
임시 파일에서 고스트 섹션 만들기: 삭제 보류 중인 .tmp 파일에서 ZwCreateSection을 호출하여 섹션을 만든 다음 파일 핸들을 닫고 디스크에서 파일을 삭제하여 고스트 섹션을 만듭니다.
원격 프로세스 만들기: CreateProcess WinAPI를 사용하여 원격 프로세스를 만들고 고스트 섹션을 해당 프로세스에 매핑합니다.
ImageBaseAddress 패치: PEB 구조체의 ImageBaseAddress 요소를 매핑된 고스트 섹션을 가리키도록 패치하고, 스레드 하이재킹을 통해 PE 페이로드의 진입점을 실행합니다.
hasherezade님께서 Ghostly Hollowing과 그녀의 다른 흥미로운 인젝션 기술들을 공개해 주신 것에 큰 감사를 드립니다.