
Un POC di una nuova tecnica di iniezione di processi “threadless” che funziona utilizzando il concetto di DLL Notification Callbacks in processi locali e remoti.
DllNotificationInection è un POC di una nuova tecnica di processo injection "senza thread" che funziona sfruttando il concetto di DLL Notification Callback in processi locali e remoti.
Un post di blog accompagnatorio con maggiori dettagli è disponibile qui:
https://shorsec.io/blog/dll-notification-injection/
DllNotificationInection funziona creando una nuova LDR_DLL_NOTIFICATION_ENTRY nel processo remoto. Lo inserisce manualmente nella LdrpDllNotificationList del processo remoto modificando il List.Flink della testa della lista e il List.Blink della prima voce (ora seconda) della lista.
La nostra nuova LDR_DLL_NOTIFICATION_ENTRY punterà a uno shellcode trampolino personalizzato (costruito con il progetto ShellcodeTemplate di @C5pider) che ripristinerà le nostre modifiche ed eseguirà uno shellcode malevolo in un nuovo thread utilizzando TpWorkCallback.
Dopo aver registrato manualmente la nostra nuova voce nel processo remoto, dobbiamo solo attendere che il processo remoto attivi la nostra DLL Notification Callback caricando o scaricando qualche DLL. Ovviamente questo non accade regolarmente in ogni processo, quindi è necessario un lavoro preliminare per trovare candidati adatti per questa tecnica di injection. Da una breve ricerca, sembra che RuntimeBroker.exe e explorer.exe siano candidati adatti, anche se ti incoraggio a trovarne altri.
Questo è un POC. Per renderlo sicuro dal punto di vista dell'OPSEC e per eludere prodotti AV/EDR, sono necessarie alcune modifiche. Ad esempio, ho usato RWX quando allocavo memoria per gli shellcode – non essere pigro (come me) e cambiali. Si potrebbe anche voler sostituire OpenProcess, ReadProcessMemory e WriteProcessMemory con API di livello inferiore e usare Indirect Syscalls o (plug spudorato) HWSyscalls. Forse crittografare gli shellcode o addirittura andare oltre e modificare lo shellcode trampolino per adattarlo alle proprie esigenze, o almeno cambiare i valori hash predefiniti nel progetto ShellcodeTemplate di @C5pider che è stato utilizzato per creare lo shellcode trampolino.