
Una PoC de una nueva técnica de inyección de procesos “sin hilos” que funciona utilizando el concepto de DLL Notification Callbacks en procesos locales y remotos.
DllNotificationInjection es una POC de una nueva técnica de inyección de procesos "sin hilos" que funciona utilizando el concepto de Callbacks de Notificación de DLL en procesos locales y remotos.
Una publicación de blog complementaria con más detalles está disponible aquí:
https://shorsec.io/blog/dll-notification-injection/
DllNotificationInjection funciona creando una nueva LDR_DLL_NOTIFICATION_ENTRY en el proceso remoto. La inserta manualmente en la LdrpDllNotificationList remota parcheando el List.Flink del encabezado de la lista y el List.Blink de la primera entrada (ahora segunda) de la lista.
Nuestra nueva LDR_DLL_NOTIFICATION_ENTRY apuntará a un shellcode trampolín personalizado (construido con el proyecto ShellcodeTemplate de @C5pider) que restaurará nuestros cambios y ejecutará un shellcode malicioso en un nuevo hilo usando TpWorkCallback.
Después de registrar manualmente nuestra nueva entrada en el proceso remoto, solo necesitamos esperar a que el proceso remoto active nuestro Callback de Notificación de DLL cargando o descargando alguna DLL. Obviamente esto no ocurre regularmente en todos los procesos, por lo que se requiere trabajo previo para encontrar candidatos adecuados para esta técnica de inyección. De mi breve búsqueda, parece que RuntimeBroker.exe y explorer.exe son candidatos adecuados para esto, aunque te animo a encontrar otros también.
Esto es una POC. Para que sea seguro desde el punto de vista de OPSEC y evite productos AV/EDR, se necesitan algunas modificaciones. Por ejemplo, usé RWX al asignar memoria para los shellcodes — no seas perezoso (como yo) y cámbialos. También se podría reemplazar OpenProcess, ReadProcessMemory y WriteProcessMemory con algunas API de nivel inferior y usar Indirect Syscalls o (autobombo descarado) HWSyscalls. Quizás cifrar los shellcodes o incluso ir más allá y modificar el shellcode trampolín para adaptarlo a tus necesidades, o al menos cambiar los valores hash predeterminados en el proyecto ShellcodeTemplate de @C5pider que se utilizó para crear el shellcode trampolín.