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

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