Inyecci贸n reflejada de DLLs en Windows

Normalmente cuando se carga una DLL en Windows se llama a la funci贸n LoadLibrary, que toma la ruta del archivo de la DLL y la carga en la memoria. Sin embargo, existe una t茅cnica que permite a un atacante inyectar una librer铆a en un proceso remoto (v铆ctima) desde la memoria en lugar de desde disco, una forma m谩s sigilosa de ejecutar c贸digo malicioso: hablamos de la inyecci贸n reflejada de DLLs o, en ingl茅s, "reflective DLL loading".

No obstante, Windows no tiene una funci贸n como LoadLibrary para llevarlo a cabo, as铆 que para obtener la funcionalidad tendremos que escribirla nosotros mismos.

Implementando la t茅cnica

La t茅cnica m谩s com煤n para inyectar DLLs de una forma reflejada, bien documentada por el irland茅s Stephen Fewer, es doble. En primer lugar, la DLL que queremos inyectar debe estar escrita en el espacio de direcciones del proceso de destino/host. En segundo lugar, la DLL debe cargarse en ese proceso host de tal manera que se cumplan todos los requisitos de tiempo de ejecuci贸n de la librer铆a, como resolver sus importaciones o reubicarlas en una ubicaci贸n adecuada en la memoria.

Suponiendo que tenemos ejecuci贸n de c贸digo en el proceso del host y que la librer铆a que deseamos inyectar se ha escrito en una ubicaci贸n arbitraria de la memoria en el proceso del host, la inyecci贸n reflejada de DLLs funciona de la siguiente manera:

- La ejecuci贸n se pasa, ya sea a trav茅s de CreateRemoteThread(), una funci贸n de API no documentada equivalente como RtlCreateUserThread o un peque帽o shellcode bootstrap, a la funci贸n ReflectiveLoader de la librer铆a, que es una funci贸n exportada que se encuentra en la tabla de exportaci贸n de la librer铆a.
- Como la imagen de la librer铆a existir谩 actualmente en una ubicaci贸n arbitraria en la memoria, ReflectiveLoader primero calcular谩 la ubicaci贸n actual de su propia imagen en la memoria para poder analizar sus propios headers para su uso posterior.
- ReflectiveLoader luego analizar谩 la tabla de exportaci贸n de los procesos del host kernel32.dll para calcular las direcciones de las tres funciones requeridas por el cargador, a saber, LoadLibraryA, GetProcAddress y VirtualAlloc.
- ReflectiveLoader ahora asignar谩 una regi贸n continua de memoria en la que proceder谩 a cargar su propia imagen. La ubicaci贸n no es importante ya que el cargador re-ubicar谩 correctamente la imagen m谩s adelante.
- Los headers y las secciones de la librer铆a se cargar谩n en sus nuevas ubicaciones en la memoria.
- ReflectiveLoader procesar谩 la copia reci茅n cargada de la tabla de importaci贸n de su imagen, cargando las librer铆as adicionales y resolviendo sus respectivas direcciones de funci贸n importadas.
- ReflectiveLoader procesar谩 la copia reci茅n cargada de la tabla de reubicaci贸n de su imagen.
- ReflectiveLoader llamar谩 a la funci贸n de punto de entrada de su imagen reci茅n cargada, DllMain con DLL_PROCESS_ATTACH. La librer铆a ahora se habr谩 cargado con 茅xito en la memoria.
- Finalmente, ReflectiveLoader devolver谩 la ejecuci贸n al shellcode inicial que lo llam贸, o si fue llamado a trav茅s de CreateRemoteThread, el hilo terminar谩.

* Si quer茅is ver c贸digo C/C++ para implementar muchas de las funciones necesarias os aconsejo que ech茅is un vistazo al post de 0x00Sec aqu铆.

Reflective dll inject en Metasploit

Asumimos que el atacante ya ha obtenido una shell de meterpreter en el sistema v铆ctima y ahora intentar谩 realizar una inyecci贸n reflexiva de DLL en un proceso remoto, m谩s espec铆ficamente en un proceso notepad.exe con PID 6156.

El m贸dulo de post-explotaci贸n de Metasploit windows/manage/reflective_dll_inject configurado:


* Reflective_dll.x64.dll es la DLL compilada del repo de Steven Fewer en github.

Despu茅s de ejecutar el m贸dulo de post-explotaci贸n, notepad.exe ejecutar谩 el payload malicioso que proviene de una DLL reflejada que se envi贸 desde el sistema del atacante:


Tambi茅n podemos verlo en acci贸n en el siguiente v铆deo:


Otras t茅cnicas

Sin embargo, en el intento de evadir AV, los atacantes hacen todo lo posible para evitar la funci贸n de ejecuci贸n del c贸digo de inyecci贸n reflexivo com煤n, CreateRemoteThread(). Las t茅cnicas alternativas incluyen la creaci贸n de subprocesos de API nativa (ntdll) y APC de usuario (necesarios para SysWow64-> x64), etc.
En este contexto, zerosum0x0 public贸 una t茅cnica que utiliza SetThreadContext() para cambiar los registros de un threat seleccionado, y realiza un proceso de restauraci贸n con NtContinue(). Esto significa que el threat secuestrado puede seguir haciendo lo que estaba haciendo, lo que puede ser una funci贸n cr铆tica de la aplicaci贸n inyectada.


En el repo de zerosum0x0 hay una PoC para x64 que usa las funciones comunes VirtualAllocEx() y WriteVirtualMemory(). Pero en lugar de crear un nuevo subproceso remoto, usa uno ya existente y restaura el contexto original cuando termina con 茅l. Esto se puede hacer localmente (proceso actual) y de forma remota (proceso objetivo).

Detectando inyecciones reflejadas de DLLs

Malfind es el complemento de Volatility responsable de encontrar varios tipos de inyecci贸n de c贸digo y, por lo general, pueden detectarse inyecciones reflejadas de DLL con la ayuda de este complemento.

El complemento, a alto nivel, escanear谩 varias regiones de memoria descritas por Virtual Address Descriptors (VAD) y buscar谩 cualquier regi贸n con protecci贸n de memoria PAGE_EXECUTE_READWRITE y luego buscar谩 los bytes m谩gicos 4d5a (MZ en ASCII) al comienzo de esas regiones (como sab茅is, esos bytes significan el inicio de un ejecutable de Windows, es decir, exe, dll):

volatility -f /mnt/memdumps/w7-reflective-dll.bin malfind --profile Win7SP1x64


 M谩s recursos y fuentes:

- stephenfewer/ReflectiveDLLInjection
- Red Teaming Experiments - Reflective DLL Injection
- ThreadContinue - Reflective DLL Injection Using SetThreadContext() and NtContinue()
- zerosum0x0/ThreadContinue
- Reflective DLL Injection 0x00sec 
- What is Reflective DLL Injection and how can be detected?
- Detecting reflective DLL loading with Windows Defender ATP 
- Reflective Injection Detection – RID.py
- sRDI – Shellcode Reflective DLL Injection
- Reflective DLLs and You
- An Improved Reflective DLL Injection Technique
- Reflective DLL Injection with PowerShell

Comentarios

  1. la verdad quisiera aprender con un poco mas de destalles porque no entiendo ni mierda.

    ResponderEliminar

Publicar un comentario