24 junio 2008

Detectando la presencia de rootkits con Unhide

Por mucho que nos esforcemos en defender nuestras redes informáticas, en el momento que estas crecen, tanto en sistemas como en servicios, el riesgo de ser “visitados” por algún inquieto personaje asiduo a las listas de bugtraq armado con el último exploit publico.

Este tipo de personajes nada entiende de “horas valle”, sistemas de QA para aplicar parches en sistemas críticos y ese tipo de cosas tan poco obvias para quien no ha tenido que lidiar con ellas.

Por mucho que apliquemos el catenaccio a nuestra política de seguridad, siempre hay servicios y aplicaciones que exponer al exterior y que en algún momento de su ciclo de vida, serán victimas de alguna vulnerabilidad. Ante esa eventualidad resulta interesante disponer de un procedimiento para realizar auditorías forenses de forma mas o menos automatizada.

Una buena práctica resulta emplear herramientas de tipo Tripwire cuya misión es asegurar la integridad de los ficheros en el sistema. Tripwire es una herramienta comercial (con algunas versiones libres) pero existen alternativas totalmente libres (código fuente, sin coste) como por ejemplo Afick.

Aprovechando que acabo de publicar la ultima version de Unhide, en este Post me gustaría compartir con vosotros una pequeña descripción de como funciona.

Unhide es una herramienta destinada a identificar anomalías en sistemas Unix / Linux, lo hace identificando procesos y puertos tcp / udp ocultos, que suele ser síntoma inequívoco de la presencia de un rootkit en nuestro sistema.

A diferencia de otras soluciones más al estilo anti-virus, Unhide no emplea firmas y se basa en los conceptos del tipo “detección de anomalías” contrastando diferentes fuentes de información y buscando inconsistencias entre ellas.
El software se divide en tres herramientas :

unhide : Para sistemas Unix genéricos (solaris, *BSD, linux antiguos)

Esta herramienta realiza dos tipos de “checks” en el sistema:

  • /bin/ps contra /proc : se basa en comparar la salida del comando /bin/ps contra las entradas del directorio /proc. Si encuentra una entrada en /proc y no encuentra su correspondiente proceso en /bin/ps marca esa PID como “pid oculta”
  • /bin/ps contra syscalls: el objetivo de este test es intentar deducir si existe algún proceso oculto interrogando directamente al Kernel mediante syscalls y comparando su salida contra /bin/ps


unhide-linux26 : Para sistemas Linux kernel 2.6

Esta versión de unhide para sistemas linux modernos añade, ademas, otro método de detección consistente en “bruteforcear” el espacio de PIDs del sistema a base de múltiples forks() y comparar contra /bin/ps. Si el sistema, durante el proceso de forks(), no ha dado alguna PID que no aparece listada en /bin/ps es síntoma de que algo no marcha correctamente

unhide-tcp : Herramienta para detectar puertos TCP / UDP ocultos

Esta herramienta localiza puertos TCP o UDP que no aparecen listados en el comando netstat intentando realizar un bind() sobre el espacio de puertos disponibles en el sistema y compararlo contra netstat. Si un puerto en el que no se ha podido hacer bind() no aparece en netstat, ese puerto es cuanto menos, sospechoso

Para usar Unhide puedes descargarlo de la web y compilarlo de la siguiente forma (para compilar únicamente hace falta un gcc normalito) :

#gcc unhide-linux26.c -o unhide-linux26

#gcc unhide-tcp.c -o unhide-tcp


O bien, si eres usuario de Debian Sid / Lenny o Ubuntu puedes instalarlo directamente con apt-get

Para iniciar el scaneo de puertos ocultos únicamente debemos ejecutarlo de la siguiente forma:
#./unhide-tcp


Y para ejecutar los diversos checks de la herramienta unhide-linux26:

#./unhide-linux26 proc
#./unhide-linux26 sys
#./unhide-linux26 brute

Lo interesante sería ejecutar periódicamente la suite de herramientas en nuestros sistemas Unix como medida para detectar eventuales compromisos en el sistema.

7 comments :

solrac dijo...

Una pregunta, desde un punto de vista del usuario 'hogareño' ¿puede utilizarse este sistema u otro parecido para detectar posible spyware o similar en nuestro pc?

Según parece ser, gran parte de los pc's de España son zombies y/o botnet.

Podríais hacer algún artículo al respecto ¿?

Yago Jesus dijo...

Hombre, en concreto unhide, esta orientado a Linux, teoricamente se podría portar a Windows, cambiando /bin/ps por tasklist o similar pero yo creo que el problema estaría en la interpretación de los datos para un usuario al que una PID le suene a chino. Para Spyware orientado a Windows, puedes probar mi Patriot, http://www.security-projects.com/?Patriot lo tengo un pelin abandonado, pero me planteo retomar el tema y "fixear" ciertos bugs que tiene esa versión.

Anónimo dijo...

Entonces, supongo que si corro rkhunter y me tira un par de "warning"
/usr/sbin/unhide y
/usr/sbin/unhide-linux26,
es porque hay otro proceso de vaya-a-saber-uno-que-instalé, (tal vex el propio rkhunter?) que tiene por defecto a unhide incluído en su código.
Disculpen mi profunda ignorancia, pero soy metalúrgico :)
Por cierto, uso Debian GNU/Linux lenny

Jakeukalane dijo...

Para más datos, a mí me sale aparte de los dos que menciona Yago Jesus algunos más, como lynx-cur, que si me preocupa y directorios ocultos.

Ahí va el log:

sudo less /var/log/rkhunter.log | grep Warning
[02:39:18] /usr/bin/lynx-cur [ Warning ]
[02:39:18] Warning: The command '/usr/bin/lynx-cur' has been replaced by a script: /usr/bin/lynx-cur: POSIX shell script text executable
[02:39:31] /usr/sbin/unhide [ Warning ]
[02:39:31] Warning: The file '/usr/sbin/unhide' exists on the system, but it is not present in the rkhunter.dat file.
[02:39:34] /usr/sbin/unhide-linux26 [ Warning ]
[02:39:34] Warning: The file '/usr/sbin/unhide-linux26' exists on the system, but it is not present in the rkhunter.dat file.
[03:02:19] Checking /dev for suspicious file types [ Warning ]
[03:02:19] Warning: Suspicious file types found in /dev:
[03:02:21] Checking for hidden files and directories [ Warning ]
[03:02:21] Warning: Hidden directory found: /etc/.java
[03:02:21] Warning: Hidden directory found: /dev/.udev
[03:02:21] Warning: Hidden directory found: /dev/.initramfs


No me tengo que preocupar supongo pero quisiera saber porque pasa esto y para que sirven esos directorios ocultos. Gracias

Yago Jesus dijo...

@Jakeukalane Das muy pocos datos, como para hacerme una idea del entorno. Por ejemplo, en Fedora el fichero /dev/.udev es un directorio normal. De todo lo que posteas, lo que mas me extraña es:

[02:39:18] Warning: The command '/usr/bin/lynx-cur' has been replaced by a script: /usr/bin/lynx-cur: POSIX shell script text executable

No estaría mal que ojearas ese script

Jakeukalane dijo...

Para más datos, a mí me sale aparte de los dos que menciona Yago Jesus algunos más, como lynx-cur, que si me preocupa y directorios ocultos.

Ahí va el log:

sudo less /var/log/rkhunter.log | grep Warning
[02:39:18] /usr/bin/lynx-cur [ Warning ]
[02:39:18] Warning: The command '/usr/bin/lynx-cur' has been replaced by a script: /usr/bin/lynx-cur: POSIX shell script text executable
[02:39:31] /usr/sbin/unhide [ Warning ]
[02:39:31] Warning: The file '/usr/sbin/unhide' exists on the system, but it is not present in the rkhunter.dat file.
[02:39:34] /usr/sbin/unhide-linux26 [ Warning ]
[02:39:34] Warning: The file '/usr/sbin/unhide-linux26' exists on the system, but it is not present in the rkhunter.dat file.
[03:02:19] Checking /dev for suspicious file types [ Warning ]
[03:02:19] Warning: Suspicious file types found in /dev:
[03:02:21] Checking for hidden files and directories [ Warning ]
[03:02:21] Warning: Hidden directory found: /etc/.java
[03:02:21] Warning: Hidden directory found: /dev/.udev
[03:02:21] Warning: Hidden directory found: /dev/.initramfs


No me tengo que preocupar supongo pero quisiera saber porque pasa esto y para que sirven esos directorios ocultos. Gracias

Anonymous dijo...

Entonces, supongo que si corro rkhunter y me tira un par de "warning"
/usr/sbin/unhide y
/usr/sbin/unhide-linux26,
es porque hay otro proceso de vaya-a-saber-uno-que-instalé, (tal vex el propio rkhunter?) que tiene por defecto a unhide incluído en su código.
Disculpen mi profunda ignorancia, pero soy metalúrgico :)
Por cierto, uso Debian GNU/Linux lenny