
언패킹되거나 인젝션된 C2 에이전트의 IOC를 식별하는 콜스택 스캐너로, 스레드 유휴 동작, 백업되지 않은 메모리, 모듈 스톰핑, APC, 타이머 및 반환 주소 스푸핑을 분석합니다.
이 프로젝트는 (대부분) 언패킹되거나 인젝션된 C2 에이전트를 나타내는 IOC를 식별하려는 콜스택 스캐너입니다.
모든 검사는 C2 에이전트가 콜백 사이에 대기하면서 비컨 스레드를 유휴 상태로 만든다는 관찰에 기반하며, 이 도구는 잠재적으로 스레드를 유휴 상태로 만든 원인을 분석하는 것을 목표로 합니다.
여기에는 언백된 메모리나 스톰프된 모듈과 같은 전통적인 IOC가 포함되지만, APC 또는 타이머를 사용하는 슬립마스크의 여러 구현을 감지하려고 시도합니다. 후자는 콜스택 분석과 사용자 영역에서 타이머 및 정확한 콜백을 열거하는 두 가지 방식으로 수행됩니다.
(거의) 그 어떤 IOC도 100% 진양성(true positive)으로 간주될 수 없으며, 예를 들어 모듈 스톰핑 탐지는 거짓양성(false positive)이 매우 발생하기 쉽습니다. 그럼에도 결과는 프로세스의 행동에 대한 의심을 불러일으킬 수 있습니다.
DotNet 및 32비트 바이너리는 무시됩니다.

콜스택의 프라이빗 r(w)x 페이지는 런타임에 언패킹되거나 인젝션된 비컨을 나타낼 수 있습니다.
여러 슬립마스크가 비컨 페이지의 페이지 권한을 실행 불가능으로 변경합니다. 이로 인해 콜스택에 의심스러운 실행 불가능 페이지가 나타납니다.
종종 비컨은 디스크에서 합법적인 모듈을 로드하고 덮어씀으로써 프라이빗 메모리 페이지를 피합니다.
copy on write 메커니즘 덕분에 조작된 이미지는 MEMORY_WORKING_SET_EX_INFORMATION의 VirtualAttributes.SharedOriginal 필드를 확인하여 식별할 수 있습니다. 콜스택의 어떤 페이지가 프라이빗이 아니고 SharedOriginal == 0이면 IOC로 간주됩니다.
이것은 아마도 거짓양성(false positive)이 가장 발생하기 쉬운 탐지일 것입니다. :'(
슬립마스크의 여러 구현은 Ntdll!NtContinue에 일련의 APC를 대기열에 추가하며, 그 중 하나가 Ntdll!WaitForSingleObject의 실행을 트리거합니다. 따라서 블로킹 함수에 대한 콜스택에서 Ntdll!KiUserApcDispatcher를 찾을 수 있으면 이 도구는 이를 IOC로 간주합니다.
APC의 의심스러운 사용과 유사하게, 이 도구는 타이머 기반 슬립마스크를 감지하기 위해 블로킹 함수에 대한 콜스택에서 ntdll!RtlpTpTimerCallback을 확인합니다.
제 이해로는 타이머는 ThreadPools 위에 구현됩니다. Alon Leviev가 시연한 바와 같이 이들은 WorkerFactoryBasicInformation과 함께 NtQueryInformationWorkerFactory를 사용하여 열거할 수 있습니다.
WORKER_FACTORY_BASIC_INFORMATION 구조체는 FULL_TP_POOL을 내장하며, 이는 다시 TimerQueue 이중 연결 리스트로 연결됩니다. PFULL_TP_TIMER 목록을 탐색하면 각 등록된 콜백에 접근할 수 있습니다. ntdll!ntcontinue와 같은 의심스러운 API 호출 집합을 가리키는 콜백이 발견되면 강력한 IOC로 간주될 수 있습니다.

원래 모듈 프록시는 의심스러운 콜스택을 우회하는 방법으로 도입되었습니다.
우회가 작동하지만, NTAPI를 사용하여 WINAPI를 호출하기 때문에 또 다른 강력한 IOC가 발생합니다. WINAPI는 NTAPI의 추상화이기 때문에 이는 이상합니다. 따라서 ntdll.dll->kernel32.dll->ntdll.dll 순서가 블로킹 함수를 호출하는 것으로 끝나는 콜스택이 관찰되면 IOC로 간주될 수 있습니다.
제가 알고 있는 대부분의 반환 주소 스푸핑 구현은 호출된 함수가 jmp [Nonvolatile-Register] 가젯으로 반환되는 기술을 사용합니다. 이 프로젝트는 단순히 콜스택의 모든 반환 주소를 반복하고 jmp 가젯으로의 반환을 나타내는 패턴을 검색합니다.

_ _ _____ ______
| | | | / ___| | ___ \
| |_| | \ `--. | |_/ /
| _ | `--. \ | ___ \
| | | | /\__/ / | |_/ /
\_| |_/ \____/ \____/
Hunt-Sleeping-Beacons | @thefLinkk
-p / --pid {PID}
--dotnet | dotnet 프로세스도 포함하도록 설정합니다. (거짓양성 발생 가능)
--commandline | 의심스러운 프로세스의 cmdline 출력을 활성화합니다.
-h / --help | 이 메시지를 출력합니까?