TrollDump
- Inyecta DLL administrada x64 en procesos administrados/no administrados x64 (el proceso debe tener GUI porque obtenemos su manejador de ventana) usando SetWindowsHook
- Aquí, como TROLL, inyectamos en la ventana oculta de taskmgr para hacer un volcado de lsass no detectado (ver sección Caso de prueba abajo)
- La DLL inyectora y la DLL inyectada son la misma DLL, por lo que no se requiere DLL adicional
- El nivel de integridad del proceso objetivo debe ser igual o inferior al del proceso inyector
Créditos (actualización/reescritura del proyecto)
Proyecto original: https://github.com/enkomio/ManagedInjector
- código adaptado para inyectar en binarios de 64 bits ---> el proyecto original solo permite inyección de DLL en binarios de 32 bits
- se eliminó la lógica IPC porque era abrumadora
- se creó código repetitivo para ejecutar tu payload directamente en la función RunOnRemoteProcess() en lugar de la forma complicada anterior
- el proyecto sigue usando DLLExport para que una DLL .NET exporte funciones
- Nota: esto no es una dependencia del proyecto, sino más bien un postprocesamiento. DLLExport modificará tu DLL .NET final para exportar una función.
- Puedes hacer la exportación de funciones manualmente si quieres https://blog.xpnsec.com/rundll32-your-dotnet/
Compilación
- Descargar el proyecto y compilar la solución como X64, Release
- No se necesitan dependencias externas
Uso
> Requires High Integrity depending on use case
> [System.Reflection.Assembly]::LoadFrom("C:\Users\public\TrollDump.dll")
> [TrollDump.ForFun]::Main("C:\windows\system32\taskmgr.exe")
- En esta POC, hacemos un volcado de lsass; puedes ejecutar cualquier "lógica de función exportada por DLL" que quieras modificando la función RunOnRemoteProcess() y recompilando.
- Como se mencionó antes, el código sirve como plantilla para la inyección de DLL; lo que elijas hacer después se puede escribir convenientemente en código administrado de C#.
Caso de prueba
- Win 2019 build 17763.737 con los últimos parches de Windefender
- tanto inyección de DLL como volcado de lsass
- Otros AV (sin nombre)
- la inyección de DLL funciona bien
- obviamente, si el volcado de lsass funciona o no depende de si el AV permite que taskmgr vuelque lsass
- No probado en ningún EDR -> sospecho que la inyección de DLL debería seguir funcionando en EDR específicos
OPSEC
- La DLL necesita estar en disco, por lo que debería estar ofuscada
- La DLL solo debe usarse para hacer la inyección; el payload real nunca debe estar incrustado en la DLL y debe cargarse de forma reflectiva
- Obviamente, inyectar CLR en un proceso no administrado es sospechoso, ¡pero oye!
- SetWindowsHook, aunque es una técnica clásica, casi siempre se asocia con keylogging, no con nuestro caso de uso
- Puedes ser muy creativo con el proceso GUI que quieras inyectar (si se ejecuta como sistema, también puedes inyectar en dwm.exe)
Lista de deseos: el proyecto se hizo durante el fin de semana y no tengo tiempo/intención de perseguir lo siguiente:
- Inyectar en procesos sin GUI
- actualmente para SetWindowsHook usa WH_CALLWNDPROC; puedes modificarlo para usar WH_GETMESSAGE, pero el proceso objetivo debe estar ejecutando un bucle de mensajes (GetMessage())
- si puedes encontrar un binario sin GUI que implemente un bucle de mensajes (sospecho que es poco probable), entonces también puedes inyectar en binarios sin GUI
- es común que los procesos GUI ejecuten GetMessage()
- Totalmente reflectivo y sin necesidad de soltarlo en disco
- Basado en SetWindowsHook, parece que la DLL debe estar en disco
- Intenté usar delegados de C# para pasar un puntero a función que se ejecutara en lugar de la función exportada de la DLL y eso no funcionó (esta es la técnica clásica de keylogger en C# para procesos locales, pero estamos haciendo proceso remoto)
- puedes intentarlo incorporando otras técnicas, creo que es factible
- Taskmgr se generará automáticamente como Alta Integridad incluso si nuestro proceso actual es Medio (así que técnicamente si inyectamos DLL en él, es un bypass de UAC)
- La inyección parece funcionar bien según los resultados de retorno de la API de Windows
- Sin embargo, taskmgr no llama a la función exportada
Descargo de responsabilidad
¡Solo debe usarse con fines educativos!