Este documento pretende ser una guía para el buen uso y defensa de los sistemas. El autor no tiene responsabilidades sobre el mal uso de esta información.
El principal objetivo de este documento es averiguar como funciona un rootkit con el fin de poder defendernos de ellos.
Rootkit viene a traducirse como 'herramienta raíz', pero el significado es 'herramienta del root' que es la cuenta del administrador en un sistema Unix/Linux.
Tras conseguir entrar a un sistema, ya sea a traves de ataques de passwords con fuerza bruta o usando exploits u otros medios para conseguir permisos de root, se instala un rootkit para seguir teniendo el control de la máquina sin ser detectado. De esta manera el objetivo de los rootkits es poder volver a entrar a un sistema que ya ha sido comprometido anteriormente y todo ello sin dejar ningún rastro.
Un rootkit contienen varias herramientas dependido del tipo de programa, pero la función principal es atacar el sistema y los equipos cercanos sin ser detectado. Generalmente los rootkits contienen sniffers (capturar tramas de la red con información interesante), limpia logs (para pasar inadvertido), reemplaza programas del sistema como por ej. ps, top, kill, netstat ... (con el fin de que el administrador no detecte la intrusión), troyanos (para volver a entrar al sistema fácilmente), etc...
Suena muy suculento y facil de controlar un sistema con un rootkit, pero antes de poder controlarlo hay que instalar el rootkit y para eso hay que encontrar un fallo de seguridad y tener éxito comprometiendo la máquina. Tarea no sencilla en un sistema bien administrado.
Los rootkits son programas extremadamente faciles de usar y eso los hacen muy peligrosos. Porque gente con poca experiencia en la programación de SO's (Sistemas Operativos), tiene la capacidad de controlar secretamente un equipo usando técnicas muy avanzadas. Otro problema es que hay rootkits para todos los SO's, desde Linux, Solaris, BSD y Windows (aunque este documento solo es aplicable para equipos Unix/Linux).
Existen a grosso modo dos tipos de rootkits: los que reemplazan/cambian programas y otros más modernos y peligrosos que manipulan directamente el kernel.
Los dos grupos lo que hacen es tener una lista de funciones que el atacante quiere esconder (ficheros, procedimientos, servidores, ...) , y el objetivo de los rootkits es que llamando a los programas normales de administración estas funciones pasen desapercibidas. El modo de conseguirlo depende del tipo de rootkit, los del primer grupo reemplazan a los programas más importantes. Los nuevos programas parece que funcionan igual que lo hacían antes, pero en realidad se les añade operaciones para esconder parte de lo que sucede realmente en el equipo.
El segundo grupo, los más modernos y peligrosos que manipulan directamente el kernel, lo que hacen es reemplazar llamadas a sistemas convenientemente para que escondan la realidad de la misma manera que lo hace el otro grupo de rootkits. De este segundo grupo tenemos rootkits como Adore, Knark o Heroin que son LKM (linux kernel module). Son módulos que una vez cargados con el programa insmod sustituyen las llamadas a sistemas, de esta manera se consigue cambiar el comportamiento del sistema sin tener que cambiar los programas. Pero estos necesitan que el kernel esté compilado para que se puedan cargar módulos dinámicamente.
Pero estan apareciendo unos nuevos rootkits que son todavía mucho más peligrosos, ya que pueden modificar el comportamiento del kernel sin el uso de LKM's, de esta manera incluso teniendo el kernel compilado de manera estática (sin uso de módulos) es vulnerable. Por ejemplo el llamado Kernel Intrusion System (KIS), disponible actualmente en Linux y BSD, reescribe directamente la imagen del kernel que se encuentra en la RAM, por ejemplo en Linux reescribe /dev/kmem. De esta manera cambia el output de los programas sin necesidad de reescribirlos y sin tener que cargar ningún módulo.
Existe para cada tipo de rootkit una estrategia a seguir, es decir que unas técnicas de detección servirán para unos rootkits y para otros no. Además los nuevos rootkits intentan hacerlos para que sean invisibles incluso para las técnicas de detección.
Un tipo de herramienta para evitar que se modifiquen los programas del sistema, son aquellos programas que comprueban la integridad del sistema mediante firmas digitales (p.ej. Tripwire). Este tipo de programas hace firmas digitales de los programas más importantes del sistema y cualquier modificación de estos programas generará una firma distinta, de esta manera se detecta la intrusión. Pero las firmas digitales deben estar en un lugar de solo lectura, ya que si se modifican los programas y también se modifican las firmas de estos no se puede averiguar si ha habido cambio alguno.
Otro grupo de programas comparan la información que hay en la memoria RAM con la suministrada con las herramientas de administración del sistema (p.ej. check-ps), si la información es diferente las herramientas del sistema seguramente estén infectados.
Una forma sencilla de averiguar si existen servicios no instalados voluntariamente es comprobar los puertos abiertos. Pero para esconderse algunos rootkits modifican la herramienta de netstat, por eso si se usa esta herramienta se ve que los puertos abiertos son los configurados por el administrador, pero si se mira los puertos abiertos desde fuera a través de un escaner de puertos podemos detectar si hay algún servicio no deseado. Comparando el resultado de la orden de netstat ('$netstat -anlt') y del escaner de puertos nmap ('nmap 127.0.0.1 -p 1-65535') podemos detectar alguna diferencia en el correcto funcionamiento del sistema que implicará seguramente la presencia de servicios no deseados.
Para la mayoria de rootkits es fácil detectar si se sabe cómo buscarlos y qué buscar. Por ejemplo si se hace un escaneo de puertos y se descubre que existe el puerto TCP 47017 abierto seguramente el t0rnkit se esté ejecutando, o por ejemplo otros rootkits modifican los programas del sistema y dejan como resultado unos programas con un tamaño característico. Por eso existen programas que automatizan la búsqueda de rootkits como es el caso de la herramienta chkrootkit.
Pero existen nuevos rootkits que son dificiles de detectar incluso usando estas técnicas, es el caso del KIS que aunque tenga un servicio escuchando para hacer un login remoto, no puede descubrirse incluso haciendo un intenso escaneo de puertos ya que la puerta trasera esta escuchando pero solo se activa si se envia un paquete TCP especifico a la backdoor's IP, al no modificar ningún programa no puede detectarse mediante las firmas digitales. Y al no usar LKM's no puede detectarse haciendo una búsqueda de los módulos extraños. Por eso y porque tiene la versatilidad de uso de nuevos plug-ins para su expansión es una herramienta muy peligrosa y muy dificil de detectar, por eso la mejor solución es la acción preventiva.
Sin duda la mejor opción es la prevención: tener un sistema actualizado, desactivar demonios innecesarios, instalar firewall, instalar un NIDS e implementar una buena política de seguridad es básico. Pero además de eso aquí se lista algunas sugerencias para una mejor prevención:
Compilar el kernel de manera estática, es decir desactivar el soporte LKM (Linux Kernel Modules), asi no pueden instalarse rootkits que sean módulos.
Otra opción es hacer una imagen limpia del equipo, por ejemplo tras instalarlo o mientras todavía podamos asegurar que está limpio, se puede hacer mediante una herramienta de backup, ghost por ejemplo. Y cuando detectemos que algo no está funcionando correctamente mediante los IDS's instalados u otras alarmas, se restaura el equipo tal como estaba anteriormente. Antes de restaurar el equipo es muy recomendable hacer una autopsia para averiguar el alcance del ataque.
Configurando el demonio syslogd para que se envíen los logs hacia una máquina remota se consigue que si existe algún ataque y se controla la máquina borrar los logs sea mucho más difícil. De esta manera si existen ataques en nuestras máquinas será más difícil borrar las huellas.
Una muy buena política es usar LIDS (Linux Introduction Detection System). LIDS es muy bueno porque bloquea operaciones básicas al mismo root, como apertura de nuevos puertos, añadir módulos, modificar ficheros, borrado total de ficheros, etc ... De esta manera incluso teniendo éxito con el uso de un exploit y consiguiendo derechos de root no toda la máquina está a disposición del atacante. Pero a la hora de administrar la máquina puede desactivarse momentaneamente las políticas de seguridad del LIDS a través de un password. A pesar de esta buena herramienta de seguridad integrada en el propio kernel, LIDS no previene de ataques de escritura sobre la copia del kernel en memoria.
Espero que esta breve introducción ayude a la gente a conocer un poco más las herramientas que los 'black hats' (sombreros negros) o 'bad guys' (chicos malos) usan, y que mi intención es evitar. La administración de un sistema implica una responsabilidad proactiva sobre el sistema y la mejor solución es prevenir. Como siempre lo mejor es tener actualizado los sistemas y mirar periódicamente qué hacen los sistemas que estén a nuestro cargo.
Cualquier comentario, sugerencia o pregunta será bien recibida.
Carlos Morales, 19 Octubre del 2003