Análisis de malware
Inyección remota de código, más…
1 de septiembre de por Ninja de seguridad
En la primera parte de este artículo , aprendimos sobre dos técnicas de inyección, como la inyección remota de DLL y la inyección de proceso hueco. En este artículo, aprenderemos sobre la inyección remota de código y una técnica híbrida de inyección remota de DLL e inyección remota de código conocida como inyección reflectante de DLL.
Inyección remota de código
En la inyección remota de código, el proceso malicioso M escribe código en la sección de memoria del proceso legítimo L y lo ejecuta. El código puede ser shellcode o un archivo PE. La inyección remota de código funciona de la siguiente manera:
¡Conviértete en un ingeniero inverso certificado!
Obtenga capacitación práctica en vivo sobre análisis de malware desde cualquier lugar y conviértase en un analista certificado de ingeniería inversa. Comienza a aprender
- Dado que el proceso malicioso ‘M’ necesita escribir en el proceso legítimo ‘L’, debería tener los derechos adecuados para hacerlo. Entonces, el primer proceso M habilita el privilegio de depuración (SE_DEBUG_PRIVILEGE).
- Luego, el proceso M abre un identificador para procesar L usando OpenProcess.
- Luego, el proceso M asigna memoria usando VirtualAlloc en el proceso L con protección PAGE_EXECUTE_READWRITE.
- El proceso M luego transfiere un bloque de código al proceso L usando WriteProcessMemory
- Luego, el Proceso M llama a CreateRemoteThread para crear un hilo y apunta su dirección inicial en el Proceso L donde reside el bloque de código desplazado.
Podemos detectar la inyección remota de código utilizando el complemento de Volatility llamado malfind. Malfind funciona identificando las secciones de memoria que tienen protecciones PAGE_EXECUTE_READWRITE y tienen código que no está respaldado en el disco. Además, va un paso más allá y muestra el código completo en esa página de memoria. Veamos algunos ejemplos de imágenes de Stuxnet disponibles públicamente.
Como podemos ver arriba, esa sección de memoria tiene PAGE_EXECUTE_READWRITE y no está respaldada por disco (no se muestra en el resultado, pero es una condición previa necesaria para que Malfind proporcione resultados). También eche un vistazo al volcado hexadecimal en la sección; tiene el encabezado MZ estándar que corresponde a los archivos PE. A continuación se muestra el código completo desensamblado.
0x1000000 4d DIC EBP
0x1000001 5a POPEDX
0x1000002 90 NOP
0x1000003 0003 AÑADIR [EBX], AL
0x1000005 0000 AÑADIR [EAX], AL
0x1000007 000400 AÑADIR [EAX+EAX], AL
0x100000a 0000 AÑADIR [EAX], AL
0x100000c ff base de datos 0xff
0x100000d ff00 INC DWORD [EAX]
0x100000f 00b800000000 AÑADIR [EAX+0x0], BH
0x1000015 0000 AÑADIR [EAX], AL
0x1000017 004000 AÑADIR [EAX+0x0], AL
0x100001a 0000 AÑADIR [EAX], AL
0x100001c 0000 AÑADIR [EAX], AL
0x100001e 0000 AÑADIR [EAX], AL
0x10000000 AÑADIR [EAX], AL
0x1000022 0000 AÑADIR [EAX], AL
0x1000024 0000 AÑADIR [EAX], AL
0x1000026 0000 AÑADIR [EAX], AL
0x1000028 0000 AÑADIR [EAX], AL
0x100002a 0000 AÑADIR [EAX], AL
0x100002c 0000 AÑADIR [EAX], AL
0x100002e 0000 AÑADIR [EAX], AL
0x1000030 0000 AÑADIR [EAX], AL
0x1000032 0000 AÑADIR [EAX], AL
0x1000034 0000 AÑADIR [EAX], AL
0x1000036 0000 AÑADIR [EAX], AL
0x1000038 0000 AÑADIR [EAX], AL
0x100003a 0000 AÑADIR [EAX], AL
0x100003c d000 ROL BYTE [EAX], 0x1
0x100003e 0000 AÑADIR [EAX], AL
Malfind no solo busca el encabezado MZ al principio, sino que también busca código potencial inyectado. Por ejemplo, mire el volcado hexadecimal a continuación, no tiene el encabezado MZ al principio pero aún así tiene código inyectado.
Si conoce bien mi artículo anterior sobre esto, entonces debería haber reconocido que el código inyectado anterior llama a la API que se utiliza para Process Hollowing. A continuación se muestra el código completo desensamblado.
0x680000 90 NOP
0x680001 06 EMPUJE ES
0x680002 6800c60768 EMPUJE DWORD 0x6807c600
0x680007 002400 AÑADIR [EAX+EAX], AH
0x68000a 6800a50400 EMPUJE DWORD 0x4a500
0x68000f 00f2 AÑADIR DL, DH
0x680011 0468 AÑADIR AL, 0x68
0x680013 004806 AÑADIR [EAX+0x6], CL
0x680016 0000 AÑADIR [EAX], AL
0x680018 c9 SALIR
0x680019 0468 AÑADIR AL, 0x68
0x68001b 0029 AÑADIR [ECX], CH
0x68001d 0000 AÑADIR [EAX], AL
0x68001f 0000 AÑADIR [EAX], AL
0x680021 006f00 AÑADIR [EDI+0x0], CH
0x680024 e813000000 LLAMADA 0x68003c
0x680029 5a POPEDX
0x68002a 774d JA 0x680079
0x68002c 61 POPA
0x68002d 7056 JO 0x680085
0x68002f 6965774f665365 IMUL ESP, [EBP+0x77], 0x6553664f
0x680036 6374696f ARPL [ECX+EBP*2+0x6f], SI
0x68003a 6e SALIDAS DX, BYTE [ESI]
0x68003b 005a51 AÑADIR [EDX+0x51], BL
0x68003e 81 base de datos 0x81
0x68003f c1 base de datos 0xc1
A veces, es posible que tenga algún código hexadecimal y desensamblado que parezca legítimo, y puede haber falsos positivos por malfind, pero muy bien puede ser una técnica conocida como limpieza de código empleada por un autor malicioso. Asegúrese de mirar el código de la sección de memoria adyacente del proceso usando el complemento Volatility Volshell.
Inyección de DLL reflectante
Esta es una combinación de inyección remota de DLL e inyección remota de código de manera que la DLL se transfiere/inyecta en el proceso legítimo en lugar del código, pero luego la DLL se ejecuta/carga por sí sola en lugar de una llamada a LoadLibrary (que hemos visto en Remote Inyección de DLL. ¿Recuerda?) Lo que significa que la DLL ya no necesita almacenarse en el disco y también necesita Windows Loader para cargarse. Espero que puedas marcar la diferencia de esto con la inyección remota de DLL. En la inyección remota de DLL, acabamos de pasar la ruta de la DLL como argumento y la DLL residía en algún lugar del disco, mientras que en la inyección reflexiva de DLL estamos moviendo toda la DLL a la memoria del proceso de destino, pero como no estamos usando LoadLibrary, entonces cómo ejecutar la DLL cargada en la memoria del proceso de destino. Resulta que necesitamos encontrar el punto de entrada a la DLL calculando el desplazamiento más la dirección base de la imagen de destino. Hay un buen proyecto de Stephen Fewer sobre esto.aquí .
Entonces, en ambas partes de estos artículos hemos visto cuatro tipos de inyección de código: inyección reflectante de DLL, inyección remota de DLL, inyección remota de código y vaciado de procesos.
¡Conviértete en un ingeniero inverso certificado!
Obtenga capacitación práctica en vivo sobre análisis de malware desde cualquier lugar y conviértase en un analista certificado de ingeniería inversa. Comienza a aprender
Referencias
https://github.com/stephenfewer/ReflectiveDLLInjection/tree/master/inject