
Scanner di callstack che identifica IOCs di agenti C2 unpacked o iniettati analizzando il comportamento idle dei thread, la memoria non backed, il module stomping, APC, timer e lo spoofing dell'indirizzo di ritorno.
Questo progetto è (principalmente) uno scanner di callstack che cerca di identificare IOC che indicano un agente C2 spacchettato o iniettato.
Tutti i controlli si basano sull'osservazione che gli agenti C2 attendono tra le loro callback, causando l'idle del thread del beacon, e questo strumento mira ad analizzare cosa potrebbe aver causato l'idle del thread.
Ciò include IOC tradizionali, come memoria non supportata o module stomping, ma tenta anche di rilevare molteplici implementazioni di sleepmask che utilizzano APC o Timer. Quest'ultima operazione viene eseguita sia analizzando il callstack che enumerando i timer e le loro esatte callback dallo userland.
(Quasi) nessuno di questi IOC può essere considerato un vero positivo al 100%; ad esempio, la rilevazione di module stomping è molto soggetta a falsi positivi. Tuttavia, i risultati potrebbero sollevare sospetti sul comportamento di un processo.
I binari DotNet e a 32Bit vengono ignorati.

Una pagina r(w)x privata in un callstack potrebbe indicare un beacon che è stato spacchettato o iniettato in fase di esecuzione.
Molte sleepmask modificano i permessi della pagina del beacon rendendola non eseguibile. Ciò porta a una pagina non eseguibile sospetta nel callstack.
Spesso i beacon evitano pagine di memoria private caricando e sovrascrivendo un modulo legittimo dal disco.
Grazie al meccanismo di copy on write, le immagini manipolate possono essere identificate controllando il campo VirtualAttributes.SharedOriginal di MEMORY_WORKING_SET_EX_INFORMATION. Se una qualsiasi pagina nel callstack non è privata e SharedOriginal == 0, viene considerata un IOC.
Probabilmente questa è la rilevazione più soggetta a falsi positivi. :'(
Molte implementazioni di sleepmask accodano una serie di APC a Ntdll!NtContinue, una delle quali attiva l'esecuzione di Ntdll!WaitForSingleObject. Pertanto, se Ntdll!KiUserApcDispatcher viene trovato nel callstack di una funzione bloccante, questo strumento lo considera un IOC.
Analogamente all'uso sospetto delle APC, questo strumento verifica anche la presenza di ntdll!RtlpTpTimerCallback nel callstack di una funzione bloccante per rilevare sleepmask basate su timer.
Per quanto ne so, i timer sono implementati sopra i ThreadPool. Come ha dimostrato Alon Leviev, questi possono essere enumerati usando NtQueryInformationWorkerFactory con WorkerFactoryBasicInformation.
La struttura WORKER_FACTORY_BASIC_INFORMATION contiene un FULL_TP_POOL che a sua volta si collega a una lista doppiamente linkata TimerQueue. Attraversando questa lista di PFULL_TP_TIMER è possibile accedere a ogni callback registrata. Se una qualsiasi callback viene trovata puntare a un insieme di chiamate API sospette, come ntdll!ntcontinue, può essere considerata un forte IOC.

Originariamente il module proxying è stato introdotto come metodo per bypassare callstack sospetti. Sebbene il bypass funzioni, introduce un altro forte IOC, poiché NTAPI viene utilizzata per chiamare WINAPI. Questo è insolito, dato che WINAPI è un'astrazione di NTAPI. Pertanto, se si osserva un callstack in cui viene trovata una sequenza ntdll.dll->kernel32.dll->ntdll.dll che termina chiamando una funzione bloccante, può essere considerato un IOC.
La maggior parte delle implementazioni di Return Address Spoofing che conosco utilizza una tecnica in cui la funzione chiamata restituisce un gadget jmp [Nonvolatile-Register]. Questo progetto semplicemente itera ogni indirizzo di ritorno nei callstack e cerca pattern che indicano il ritorno a un gadget jmp.

_ _ _____ ______
| | | | / ___| | ___ \
| |_| | \ `--. | |_/ /
| _ | `--. \ | ___ \
| | | | /\__/ / | |_/ /
\_| |_/ \____/ \____/
Hunt-Sleeping-Beacons | @thefLinkk
-p / --pid {PID}
--dotnet | Imposta per includere anche i processi dotnet. (Soggetto a falsi positivi)
--commandline | Abilita l'output della riga di comando per i processi sospetti
-h / --help | Stampa questo messaggio?