
로컬 및 원격 프로세스에서 DLL 알림 콜백의 개념을 활용하는 새로운 'threadless' 프로세스 인젝션 기술의 POC입니다.
DllNotificationInjection은 로컬 및 원격 프로세스에서 DLL 알림 콜백(DLL Notification Callbacks)의 개념을 활용하는 새로운 "스레드리스(threadless)" 프로세스 인젝션 기법의 PoC입니다.
더 자세한 내용을 담은 블로그 게시글은 여기에서 확인할 수 있습니다:
https://shorsec.io/blog/dll-notification-injection/
DllNotificationInjection은 원격 프로세스에 새로운 LDR_DLL_NOTIFICATION_ENTRY를 생성하여 작동합니다. 리스트 헤드의 List.Flink와 리스트의 첫 번째 항목(현재는 두 번째)의 List.Blink를 패치하여 수동으로 원격 LdrpDllNotificationList에 삽입합니다.
새로운 LDR_DLL_NOTIFICATION_ENTRY는 커스텀 트램펄린 셸코드( @C5pider의 ShellcodeTemplate 프로젝트로 제작)를 가리키며, 이 셸코드는 변경 사항을 복원하고 TpWorkCallback을 사용하여 새 스레드에서 악성 셸코드를 실행합니다.
원격 프로세스에 새 항목을 수동으로 등록한 후에는 원격 프로세스가 DLL을 로드하거나 언로드하여 DLL 알림 콜백을 트리거하기를 기다리면 됩니다. 이는 모든 프로세스에서 정기적으로 발생하는 것은 아니므로, 이 인젝션 기법에 적합한 후보를 미리 찾는 작업이 필요합니다. 제가 간단히 조사한 바에 따르면 RuntimeBroker.exe와 explorer.exe가 적합한 후보로 보이지만, 다른 프로세스도 직접 찾아보시길 권장합니다.
이는 PoC입니다. OPSEC에 안전하고 AV/EDR 제품을 우회하려면 몇 가지 수정이 필요합니다. 예를 들어, 셸코드용 메모리를 할당할 때 RWX를 사용했습니다. 게으르지 말고(저처럼) 이를 변경하세요. 또한 OpenProcess, ReadProcessMemory 및 WriteProcessMemory를 더 낮은 수준의 API로 대체하고 간접 시스템 콜(Indirect Syscalls) 또는 (뻔뻔한 플러그) HWSyscalls를 사용하는 것을 고려할 수 있습니다. 셸코드를 암호화하거나, 트램펄린 셸코드를 수정하여 필요에 맞게 조정하는 추가 작업을 수행하거나, 적어도 트램펄린 셸코드를 생성하는 데 사용된 @C5pider의 ShellcodeTemplate 프로젝트의 기본 해시 값을 변경하는 것이 좋습니다.