Guía Completa sobre Rootkits y Técnicas de Inyección DLL

– ¿Qué es un rootkit?

Bueno, yo creo que si estáis leyendo esto es porque sabéis qué es un rootkit y os interesa programar uno, pero para los despistados haré unas aclaraciones.

Un rootkit, a grandes rasgos, es una herramienta que permite ocultar al administrador de un sistema información del mismo, ya sean los procesos que están corriendo en su ordenador, conexiones establecidas, archivos… Imaginaos el potencial que tiene una herramienta de este tipo; podemos tomar el control total de un sistema sin que el usuario se entere siquiera. Podemos tener guardados en un servidor (al que hemos accedido mediante técnicas que no se tratarán aquí) 50GB de archivos sin que el administrador se entere. El límite está donde esté el límite de nuestra imaginación.

Para los que quieran más información sobre los rootkits y sus tipos, que consulten la Wikipedia.

2008 E0N Productions

– ¿Cómo podemos hacer todo esto?

Aquí el manual ya empieza a tomar un poco de seriedad y, una vez se exponga la técnica que usaremos, entraremos con lo importante: crear nuestro rootkit.

El primer concepto que hay que tener claro es que, para poder modificar el comportamiento de un archivo, tenemos que estar en su espacio de memoria, para lo que usaremos, por comodidad, la inyección DLL, ya que podríamos hacer una inyección sin DLL, pero es mucho más incómodo (tranquilos, cuando llegue el momento pondré un ejemplo de cada y veréis a lo que me refiero).

Una vez nos encontremos en el espacio de memoria del ejecutable objetivo, ya podremos modificarlo y el API hooking será nuestra herramienta. Gracias a ella, conseguiremos modificar el comportamiento del programa al realizar llamadas a APIs. Por poner un ejemplo, podemos hacer que el administrador de tareas no muestre los procesos que empiecen por determinada cadena o que el explorer.exe no muestre las carpetas con X nombre.

Si ahora la técnica a seguir no está muy clara, no os preocupéis, seguid leyendo y veréis cómo todo empieza a encajar.

LA INYECCIÓN DLL:

Introducción:

Algunos se preguntarán: ¿para qué queremos inyectar una DLL? La respuesta es simple. Gracias al API hooking, haremos que cada vez que un proceso cualquiera llame a determinada API, en realidad llame a una función que nosotros queramos, y para poder hacer esto necesitamos encontrarnos en el espacio de memoria de dicho proceso, porque nosotros no podemos hacer un jmp e irnos al espacio de memoria del svchost, por ejemplo.

Como reseña final, decir que la inyección de DLLs da mucho más juego que modificar la memoria de un proceso, como por ejemplo, saltarse el firewall (muy útil para troyanos) o hacer un proceso inmortal, por poner un par de ejemplos. Esto no se tratará en este manual, pero una vez hayáis aprendido a inyectar DLLs y comprendido bien el mecanismo, solo es cuestión de echarle un poco de imaginación 😉

Métodos de inyección:

Entre los métodos de inyección podríamos distinguir dos grandes bloques: los que usan DLL y los que no. Nosotros, por comodidad, usaremos una técnica que requiere DLL.

Esta técnica tiene la gran ventaja de que podemos programar la DLL como si se tratase de un ejecutable normal y corriente, mientras que si intentamos inyectar sin DLL, el código se complicaría bastante. Como desventaja frente al otro método, decir que requiere de la DLL, pero podéis bindear la DLL al ejecutable, aunque eso no entra entre lo que yo quiero enseñaros en este tutorial. Si tenéis curiosidad por cómo hacerlo, en el número tres de la e-zine inSecurity, yo mismo publiqué un tutorial para crear joiners en VB6, aunque si solo programáis en C o en cualquier otro lenguaje, no os costará mucho adaptarlo.

Inyección mediante CreateRemoteThread:

Este es uno de los métodos más simples de inyección DLL y de los más documentados por la red, por lo tanto, de los más detectados por antivirus y firewalls. Pero como este manual es puramente educativo, eso no supondrá ningún problema… de todas formas, si a alguien esto le supone un problema, siempre puede echar un ojo al manual de inyecciones DLL de MazarD y esquivar el firewall y el antivirus (o echarle un poco de imaginación y dejar este mismo método indetectable, que no es muy difícil =P).

El objetivo de este método es simple: crear en un proceso remoto un hilo y que este hilo llame al API LoadLibraryA para cargar nuestra DLL. Una vez la cargue, saltará automáticamente el DllMain de nuestra DLL y ya podemos hacer que ese proceso haga por nosotros lo que queramos.

Para implementar este método, necesitamos tener ciertos conocimientos previos sobre algunas APIs que ahora mismo os voy a describir.

2008 E0N Productions

1 APIs necesarias:

Para implementar esta inyección, en total usaremos siete APIs. A continuación, os las describo con detalle, aunque si queréis una información más detallada (en inglés), podéis obtenerla en la MSDN de Microsoft.

OpenProcess:

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.