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.

  • Dado que mi 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.
  • Después de este proceso, M asigna algo de memoria en el proceso L usando VirtualAllocEx
  • Ahora, en la inyección remota de DLL, se inyecta una DLL, lo que significa que la DLL inyectada debe estar presente en algún lugar del disco. Entonces, para que se inyecte la DLL, el proceso M debe informar al proceso L dónde está esa DLL. Después de que el proceso M asigne memoria en el proceso L, el proceso M escriba en la memoria del proceso L usando WriteProcessMemory la ruta completa donde se encuentra la DLL.
  • Ahora, para cargar esta DLL, se debe llamar a LoadLibrary. LoadLibrary se encuentra en Kernel32.dll y kernel32.dll se encuentra en la misma dirección en la misma máquina. Para llamar a loadlibrary debemos conocer su dirección, lo que significa que debemos conocer la dirección kernel32.dll, lo cual se realiza mediante la llamada a la función GetModuleHandle().
  • Una vez que Kernel32.dll se encuentra en la memoria, GetProcAddress() se usa con el parámetro LoadLibrary para conocer la dirección de LoadLibrary en Kernel32.dll.
  • Después de todo esto, el proceso M llamará a CreateRemoteThread() en el proceso L con el parámetro como dirección de LoadLibrary.
  • 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:

    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.