Análisis de malware
Inyección remota de DLL, más…
31 de agosto de por Ninja de seguridad
En este artículo, veremos las técnicas de inyección de código. Analizaremos la inyección remota de DLL, la inyección remota de código, la inyección reflectante de DLL y la inyección de proceso hueco. También veremos formas de detectarlos.
Primero, debemos entender cómo se ejecutan los ejecutables legítimos en Windows. Los ejecutables legítimos a menudo usaban dll del sistema como parte de su código y necesitaban recursos de hardware subyacentes. Los ejecutables en modo usuario no pueden acceder directamente al hardware; Primero deben acceder al código de nivel del kernel (que a su vez se comunica con el hardware). Desde una perspectiva de seguridad, sería bueno no permitir que los procesos en modo de usuario hablen directamente con el código a nivel de kernel, por lo que resulta que hay varias llamadas API que ocurren desde el modo de usuario al modo de kernel. Por ejemplo, tengo un proceso en modo de usuario ‘U’ que se comunicará con una DLL intermediaria como ntdll, etc. para comunicarse con un kernel que a su vez se comunicará con el hardware subyacente. (Bueno, esta es una vista desde arriba, ya que en realidad hay muchos otros componentes que encajan en cada capa para interactuar entre sí).
Ahora bien, hay varias formas en las que se puede abusar de este proceso para que se pueda ejecutar el código malicioso. Bueno, ese es el propósito; El objetivo final es asegurarse de que se ejecute el código malicioso en lugar del legítimo. Esto se llama inyección de código y existen varios tipos.
En este artículo, hablaremos sobre la inyección remota de DLL y la inyección de proceso hueco. En la parte 2 de esta serie de artículos, cubriremos la inyección remota de código y la inyección reflectante de DLL.
Inyección remota de DLL
Cada proceso necesita archivos DLL del sistema para ejecutarse. La inyección remota de DLL es la forma en que se inyecta una DLL maliciosa remota en un proceso legítimo. A continuación se muestran algunas de las llamadas que puedes ver en un ejecutable para este tipo de inyección.
A continuación se muestran las llamadas API de un proceso inyectado.
Obtener dirección Proc:
Cargar biblioteca:
Crear hilo remoto:
AllocEx virtual:
Memoria de proceso de escritura:
Con Windows 7, la inyección de DLL se controla hasta un cierto límite mediante la introducción del concepto de aislamiento de privilegios de interfaz de usuario (UIPI), que se centra en los niveles de integridad y un proceso de nivel de integridad inferior no puede escribir en la memoria de un proceso de nivel superior. Como puede ver, este no es un mecanismo completamente probado, ya que los procesos aún pueden inyectarse en procesos en el mismo nivel, o no funcionará cuando los privilegios del programa ya estén escalados.
Inyección de proceso hueco
Es una técnica mediante la cual el malware reemplazará un proceso legítimo por un proceso duplicado pero con código malicioso. Esto ayuda a que el malware se oculte entre otros procesos legítimos. El nuevo proceso malicioso se parece tanto al proceso legítimo original que incluso el nombre de la imagen, la ruta y las líneas de comando permanecen sin cambios. A continuación se detallan los pasos que se siguen habitualmente para el vaciado de procesos:
- Primero, el proceso de destino se crea en un estado suspendido usando CreateProcess con la opción CREATE_SUSPENDED. Una vez creado el proceso, su espacio de memoria se puede modificar con el identificador proporcionado. Se hará referencia a este identificador en todas las llamadas a funciones posteriores. Tenga en cuenta que en este punto el proceso malicioso se carga pero aún no se ejecuta porque se creó en un estado suspendido.
- El siguiente paso es encontrar el bloque de entorno de proceso (sección PEB) para este proceso malicioso, que se puede realizar utilizando la función auxiliar ReadRemotePEB. Una vez adquirido esto, se lee la dirección base de la imagen para localizar los encabezados NT.
- El siguiente paso es vaciar el código legítimo de la memoria en el proceso alojado. Para esto se utiliza NtUnmapViewOfSection. Debido a que es una función del kernel, el malware generalmente resuelve la función en tiempo de ejecución usando GetProcAddress.
- El siguiente paso es asignar un nuevo bloque de memoria para alojar el código malicioso. El malware generalmente crea el bloque completo PAGE_EXECUE_READWRITE para simplificar; de lo contrario, también se pueden establecer permisos para cada sección.
- Dado que se ha asignado espacio para una nueva imagen, WriteProcessMemory se utiliza para escribir el nuevo código de imagen en lugar del código de imagen original. En la estructura de encabezado opcional, la dirección base se cambiará a la de la nueva imagen de memoria. Sin embargo, si la base de la imagen nueva no coincide con la base de la imagen original, entonces será necesario cambiar la base de la imagen nueva.
- La función SetThreadContext se utiliza para establecer el contexto de este proceso.
- El último paso es simplemente reanudar el proceso usando ResumeThread.
En mi artículo anterior se incluye un análisis completo de la inyección de proceso hueco aquí .
En este artículo, hemos visto cómo funcionan la inyección remota de DLL y la inyección de proceso hueco. En la parte 2 de esta serie de artículos, cubriremos la inyección remota de código y la inyección reflectante de DLL.