
Ein POC einer neuen „threadless“-Prozess-Injektionstechnik, die das Konzept von DLL-Notification-Callbacks in lokalen und entfernten Prozessen nutzt.
DllNotificationInection ist ein Proof-of-Concept einer neuen „threadless“-Prozessinjektionstechnik, die durch Nutzung von DLL Notification Callbacks in lokalen und entfernten Prozessen funktioniert.
Ein begleitender Blogbeitrag mit weiteren Details ist hier verfügbar:
https://shorsec.io/blog/dll-notification-injection/
DllNotificationInection funktioniert, indem ein neuer LDR_DLL_NOTIFICATION_ENTRY im entfernten Prozess erstellt wird. Es fügt ihn manuell in die entfernte LdrpDllNotificationList ein, indem es den List.Flink des Listenkopfes und den List.Blink des ersten (nun zweiten) Eintrags der Liste patcht.
Unser neuer LDR_DLL_NOTIFICATION_ENTRY wird auf einen benutzerdefinierten Trampolin-Shellcode verweisen (erstellt mit @C5pider's ShellcodeTemplate-Projekt), der unsere Änderungen rückgängig macht und einen schädlichen Shellcode in einem neuen Thread unter Verwendung von TpWorkCallback ausführt.
Nachdem wir unseren neuen Eintrag manuell im entfernten Prozess registriert haben, müssen wir nur darauf warten, dass der entfernte Prozess unseren DLL Notification Callback auslöst, indem er eine DLL lädt oder entlädt. Dies geschieht offensichtlich nicht regelmäßig in jedem Prozess, daher sind vorherige Arbeiten zur Findung geeigneter Kandidaten für diese Injektionstechnik notwendig. Nach meiner kurzen Suche scheinen RuntimeBroker.exe und explorer.exe geeignete Kandidaten dafür zu sein, obwohl ich Sie ermutige, auch andere zu finden.
Dies ist ein POC. Damit dies OPSEC-sicher ist und AV/EDR-Produkte umgeht, sind einige Änderungen erforderlich. Zum Beispiel habe ich RWX verwendet, als ich Speicher für die Shellcodes allozierte – seien Sie nicht faul (wie ich) und ändern Sie diese. Man könnte auch OpenProcess, ReadProcessMemory und WriteProcessMemory durch einige APIs auf niedrigerer Ebene ersetzen und Indirect Syscalls oder (schamlose Eigenwerbung) HWSyscalls verwenden. Vielleicht die Shellcodes verschlüsseln oder noch einen Schritt weiter gehen und den Trampolin-Shellcode an Ihre Bedürfnisse anpassen, oder zumindest die Standard-Hash-Werte in @C5pider's ShellcodeTemplate-Projekt ändern, das zur Erstellung des Trampolin-Shellcodes verwendet wurde.