CONSULTORÍA ESTRATÉGICA EN TECNOLOGÍAS DE LA INFORMACIÓN Y COMUNICACIONES

CONSULTORIA EN REDES Y SERVICIOS DE TELECOMUNICACIONES




Detección de intrusos en Unix

Autor: Ramón Jesús Millán Tejedor

Publicado en Monografias.com, Trabajos 52, 2007

Acceder al articulo en Monografias.com



IntroducciÓn

En el pasado, los ordenadores eran entidades aisladas, ubicados en habitaciones cerradas protegidas por mecanismos de seguridad física. Pero la interconexión masiva de equipos informáticos a través de Internet y otras redes, ha traído consigo serios problemas de seguridad.

En efecto, en Internet proliferan los crackers, piratas informáticos que buscan atacar un sistema para obtener beneficios de forma ilegal; los hackers, que son aquellos que lo hacen como mero pasatiempo o reto técnico; y los sniffers, que rastrean y observan todos los mensajes que hay en la red. La seguridad era antes un problema principalmente asociado a las grandes y pequeñas empresas, pero con la proliferación de las conexiones permanentes a Internet mediante el ADSL y el cable, esta preocupación ha llegado también a los hogares.

En cuanto tenga sospechas o le haya sido notificado que su sistema ha sido atacado, o lo está siendo, deberá determinar:

El procedimiento a seguir puede ser rutinario o extremadamente complejo. Éste artículo contiene instrucciones para seguir, paso a paso, si se investiga un incidente de seguridad en una máquina Unix. El lector podrá encontrar información detallada sobre los siguientes temas:

Es recomendable obtener previamente al proceso de búsqueda de intrusos, un perfil del estado de su sistema operativo en condiciones normales, para lo cual deberá ejecutar los comandos descritos en este artículo. Grabe los resultados y familiarícese con la salida de todas las órdenes.

Determinar los usuarios conectados a su sistema

Si sospecha que un intruso está conectado a su sistema en un determinado momento, primero debe descubrir dónde se encuentra y qué está haciendo. Esta sección le enseñará a cómo utilizar estos comandos para descubrir quién está en su sistema:

Comando "w"

El comando “w” ofrece una visión general de todos los usuarios y sus programas activos en el sistema. Un ejemplo de su salida es el siguiente:

9:24am  up 51 day(s), 20:25,  7 users,  load average: 0.10, 0.05, 0.04
User    tty       login@        idle       JCPU     PCPU    what
rmt     console   28Jun99       93days     4091:16 703:58  /usr/dt/bin/dtexec -open 0 -ttpr
ramon   pts/21    Wed11am       16         /bin/ksh
rmt     pts/5     28Jun99       52days     -ksh
ramon   pts/1     9:22am        1          -ksh
ramon   pts/22     9:23am                  w
...

La primera línea mostrada, la de estado, da información general: la hora actual, cuánto tiempo lleva arrancado el sistema, y la carga del sistema para varios períodos de tiempo. El resto de la salida del comando “w”, muestra quién está en estos momentos conectado al sistema, qué terminales están utilizando, y qué están haciendo.

Deberá verificar que:

El problema es que la salida del comando “w” puede ser fácilmente modificada para ocultar la existencia de un intruso en el sistema.

Comando "finger"

Otro comando que permite descubrir intrusos conectados actualmente a su sistema, es “finger”. Un ejemplo de su salida es el siguiente:

Login       Name           TTY                      Idle         When                   Where
rmt         ???            console                  8            Mon 13:29              :0                 
ramon       ???            pts/21                   16           Wed 11:26              caballero           
ramon       ???            pts/1                    1            Thu 09:22              suntiago           
ramon       ???            pts/22                                Thu 09:23              suntiago
...

El comando “finger” muestra quién está conectado al sistema, qué terminales está utilizando, cuándo se conectaron y desde dónde están operando.

Debe comprobar que:

El problema que presenta el comando “finger” es que puede ser fácilmente modificado para ocultar la existencia de un intruso. Este comando, además, no sólo muestra información útil para el administrador, sino también para el posible intruso. Por ejemplo, éste podría utilizar finger para encontrar el momento oportuno para atacar el sistema, utilizando “finger” para determinar la actividad de usuarios como root, manager, bin, etc.

Comando "who"

Con el comando “who” se obtiene información sobre los usuarios conectados al sistema en el momento de su ejecución. Ésta información es mantenida en el fichero “/etc/utmp”. Un ejemplo de su salida es presentado continuación:

rmt                console                   Jun 28 13:29        (:0)
ramon              pts/21                    Aug 18 11:26        (caballero)
rmt                pts/5                     Jun 28 13:30        (:0.0)
ramon              pts/1                     Aug 19 09:22        (suntiago)
ramon              pts/22                    Aug 19 09:23        (suntiago)
...

El comando devuelve una lista con los usuarios conectados actualmente al sistema, qué terminal están utilizando, cuándo se conectaron, y desde donde están operando.

Deberá verificar que:

De nuevo éste comando es vulnerable. Su salida puede ser fácilmente modificada para ocultar la existencia de un intruso, puesto que el comando obtiene la información del fichero “/etc/utmp”.

Determinar los procesos activos

Incluso si un intruso ya no está conectado a una máquina Unix ajena, puede haber dejado un proceso en ejecución para continuar con sus tareas de usurpación de información o de ataque al sistema. Esta sección enseña cómo utilizar estos comandos para comprobar cuáles son los procesos activos en el sistema:

Comando "ps"

El comando “ps –ef” devuelve una lista con los procesos que están siendo ejecutados en el sistema. Las opciones seleccionadas son las siguientes:

El comando “ps -ef” es una manera segura de ver qué programas están en ejecución en el sistema. Un fragmento de su salida es la presentada a continuación:

UID                    PID         PPID      C       STIME    TTY      TIME         CMD
root                    0          0         0       Jun 28   ?        0:01         sched
root                    1          0         0       Jun 28   ?        0:19         /etc/init -
root                    2          0         0       Jun 28   ?        0:01         pageout
root                    3          0         0       Jun 28   ?        39:31        fsflush
...
rmt                     3007      3005       0       Jun 29   pts/7    0:00         -ksh
...

Lo siguiente podría indicar una actividad indeseada:

En algunos casos, se ha encontrado en los sistemas atacados, versiones alteradas de “ps” que no muestran los procesos del intruso. Además, si está ejecutándose un proceso inválido pero con un nombre válido, es difícil distinguir los procesos sospechosos. Por ejemplo, los intrusos a menudo ejecutan procesos sniffers con nombres como “sendmail” o “inetd”.

Comando "crash"

El comando “crash” puede ser utilizado, sólo por el usuario root, para listar todos los procesos ejecutándose en el sistema. Debería utilizarlo para confirmar la validez del resultado del comando “ps”. Es decir, para encontrar un proceso a su salida que no aparece en la salida proporcionada por “ps” (buscando la correspondencia entre los pids). Una vez que ejecute “crash”, recibirá el prompt “>”. Teclee “proc” y, una vez ejecutado, teclee “quit”. La salida del comando “crash” se muestra a continuación:

PROC TABLE SIZE = 1978
SLOT     ST     PID      PPID      PGID      SID       UID         PRI         NAME       FLAGS
0        t      0        0         0         0         0           96          sched      load sys lock 
1        s      1        0         0         0         0           58          init       load
2        s      2        0         0         0         0           98          pageout    load sys lock nowait
3        s      3        0         0         0         0           60          fsflush    load sys lock nowait
4        s      24696    1         24696     24696     0           48          ttymon     load
5        s      109      1         109       109       0           48          inetd      load
6        s      330      1         330       330       0           58          sac        load jctl
7        s      90       1         90        90        0           58          rpcbind    load
...

Lo siguiente podría indicar una actividad indeseada:

No obstante, como puede ocurrir con cualquier comando, “crash” puede haber sido sustituido por otro comando semejante pero alterado.

Encontrando las huellas dejadas por un intruso

Si sospecha que un intruso estuvo conectado a su sistema, pero ya no lo está, deberá utilizar los comandos y ficheros descritos en esta sección para encontrar las huellas que pudiera haber dejado. En esta sección aprenderá a cómo utilizar estos comandos y ficheros:

Comando "last"

El comando “last” muestra información sobre las conexiones y desconexiones al sistema, a través de los datos almacenados en el fichero “/var/adm/wtmp”. Si puede descubrir el nombre de usuario que el intruso utilizó para conectarse, este comando puede mostrarle cuánto tiempo estuvo en el sistema y desde dónde se conectó.

La opción “-n“ es utilizada para ver las últimas n entradas del fichero “/var/adm/wtmp”. Seguidamente se muestra un ejemplo de su salida:

ramon     pts/22      suntiago         Thu Aug 19 09:23   still logged in
ramon     pts/1       suntiago         Thu Aug 19 09:22   still logged in
...

La primera columna es el nombre de usuario, seguido por el terminal desde el que está conectado. Si la conexión se realizó a través de un dispositivo de red, el nombre del sistema remoto aparecerá en la siguiente columna. En el caso de que la conexión se realizase a través de un módem esta columna estaría en blanco. Finalmente nos encontramos con el instante en que el usuario se conectó y se desconectó y el tiempo total que estuvo en el sistema.

Deberá fijarse en lo siguiente:

El problema es que un intruso puede ocultar sus huellas en el sistema borrando o modificando el fichero “/var/adm/wtmp”.

Comando "lastcomm"

El comando “lastcomm” muestra los últimos comandos ejecutados por cualquier persona en el sistema. Este comando está disponible sólo si tiene procesos de contabilidad en ejecución, sobre lo cual puede informarse en el manual “man” accediendo a la entrada “acct”.

La orden “lastcomm” es excelente para percatarse de lo que hizo el usuario, ya que lista todos los comandos ejecutados por todos los usuarios. Por ejemplo, una salida con ejecuciones repetidas del programa “tftp”, podría indicar el intento de robar ficheros de claves.

Este comando produce un fichero que tiende a crecer muy deprisa, por lo que debería renombrarlo cada cierto tiempo, manejando así ficheros de un tamaño menor.

La debilidad de “lastcomm” es que sólo guarda información de comandos que ejecutan un programa, pero no las acciones que fueron tomadas después de que el programa comenzase (por ejemplo, podría mostrar que el editor fue utilizado, pero no qué ficheros fueron abiertos con él).

Muchas veces, los ataques no son descubiertos hasta pasados unos días de ocurrir los daños o descubrir la presencia de intrusos. En estos casos, el problema está en que el intruso puede haber borrado las huellas dejadas en el sistema, ya que la salida de “lastcomm” se basa en los datos almacenados en el fichero /var/adm/pacct, el cual puede ser fácilmente borrado y modificado si pueden ser obtenidos los privilegios adecuados.

Determinados shells, como por ejemplo “tcsh”, mantienen un registro de los comandos ejecutados recientemente por cada usuario. Esta información es generalmente almacenada en un fichero en el directorio casa del usuario denominado “.history”. Mediante su análisis se podrían reconstruir la actividad de dicho usuario y verificar la información obtenida mediante “lastcomm”.

Fichero "/var/log/syslog"

El fichero “/var/log/syslog” contiene mensajes relativos a varios tipos de conexiones al sistema. El contenido de este fichero está definido por el fichero “/etc/syslog.conf”.

La mayoría de los mensajes son del programa “sendmail”, y muestran el estado de los mensajes enviados y recibidos en el sistema. Este fichero también contiene mensajes de conexión de in.telnetd y otros mensajes previamente definidos.

Cuando observe el contenido de “/var/log/syslog”, debe fijarse en las observaciones enumeradas seguidamente:

En muchos casos, el fichero “/var/log/syslog” tiene derechos de escritura para todos los usuarios y debe permanecer así por razones operativas. Por lo tanto, sus datos pueden ser alterados fácilmente.

Este fichero suele ser muy grande, por lo que investigar todas las conexiones, sobre todo los mensajes originados por “sendmail”, puede resultar tedioso. Esto es debido a que, para cada mensaje de correo electrónico, al menos una línea es escrita en el archivo “/var/log/syslog”. Además, los usuarios acostumbran a borrar los mensajes y olvidan quiénes se los enviaron, cuando fueron recibidos, y sobre que trataban.

Fichero "/var/adm/messages"

El fichero “/var/adm/messages” contiene, por lo general, una lista de todos los mensajes enviados a la consola. Su contenido está definido en el fichero “/etc/syslog.conf”.

Lo siguiente podría indicar una actividad indeseada:

Una vez que un intruso obtiene el acceso como root, este fichero puede ser modificado o borrado fácilmente. Además, por medio del fichero “syslog.conf”, se pueden suprimir las conexiones de este fichero.

Comando "netstat"

El comando “netstat” muestra las conexiones abiertas en el sistema. Es interesante comparar la salida de este comando con la correspondiente a “last –n”.

Utilizando la opción “-a” se muestra el estado de todos los sockets abiertos. Un ejemplo de su uso es el mostrado a continuación:

UDP
Local Address                           State
--------------------                    -------
*.sunrpc                                Idle
*.*                                     Unbound
*.32771                                 Idle
*.32773                                 Idle
*.32777                                 Idle
*.name                                  Idle
*.biff                                  Idle
*.talk                                  Idle
...
     
 
TCP
Local Address          Remote Address               Swind      Send-Q    Rwind       Recv-Q      State
--------------------   --------------------         -----      ------    -----       ------      -------
*.*                    *.*                          0          0         0           0           IDLE
*.sunrpc               *.*                          0          0         0           0           LISTEN
*.64027                *.*                          0          0         0           0           IDLE
*.32771                *.*                          0          0         0           0           LISTEN
*.32772                *.*                          0          0         0           0           LISTEN
*.ftp                  *.*                          0          0         0           0           LISTEN
*.telnet               *.*                          0          0         0           0           LISTEN
*.shell                *.*                          0          0         0           0           LISTEN
...
escocia.telnet         suntiago.56459               8760       0         8760        0           ESTABLISHED
escocia.telnet         suntiago.56460               8760       0         8760        0           ESTABLISHED
...
 
Active UNIX domain sockets
Address          Type                  Vnode     Conn Addr
607c5a88         stream-ord            10        0    /tmp/.X11-unix/X0
...

Lo siguiente podría indicar una actividad indeseada:

No obstante, es posible que el intruso haya suplantado la versión original de “netstat” por otras que no muestran las conexiones a y desde el sistema donde se desarrolla el ataque.

Buscar ficheros olvidados por el intruso

Normalmente, el mejor indicador de si el sistema ha ido atacado es examinar los ficheros del sistema, viendo si han sido modificados o creados otros nuevos. No obstante, el intruso podría haber alterado los programas del sistema para ocultar su ataque. Por ejemplo, muchos administradores han descubierto que comandos como “ps” han sufrido cambios para ignorar los procesos lanzados por el intruso.

El comando “find”, ejecutado preferentemente como root, lista todos los ficheros que han sido modificados en los n días anteriores:

find / -mtime –ndays -ls

El intruso podría cambiar el instante de modificación del fichero, para ocultar los cambios hechos. Muchas de estas modificaciones podrían aún ser detectadas, comparándolas con el instante en que fue cambiado el nodo-i del fichero. El siguiente comando lista todos los ficheros cuyo instante de modificación del nodo-i ha variado en los últimos n días:

find / -ctime –ndays –ls

Cuando examine los resultados generados por estos comandos, preste atención a los ficheros y directorios ocultos (ficheros cuyo nombre empieza por “.” y que no son mostrados con el comando “ls”, a menos que se utilice la opción “-a”. También debe prestar atención a ficheros con extensiones poco comunes o software para la captura de claves de acceso.

Los sistemas Unix permiten elevar sus privilegios a los usuarios mediante un mecanismo conocido por setuid. Cuando un fichero con el atributo setuid es ejecutado por un usuario, el programa da los permisos de acceso correspondientes al propietario de dicho fichero. Los ficheros setuid aparecen en los listados de los directorios con una “s”, en lugar de la “x”, en la posición correspondiente al bit de ejecución. No obstante, tenga en cuenta que los sistemas Unix contienen varios programas setuid necesarios para la operación normal del sistema. Por ejemplo, el programa “login” es típicamente un fichero setuid perteneciente al usuario root.

Los intrusos a menudo crean ficheros setuid que los permiten obtener rápidamente el acceso como root durante posteriores visitas al sistema. Generalmente, el fichero se guarda en un directorio oculto, o se trata de un fichero oculto. Los ficheros setuid potencialmente sospechosos son:

Para listar los ficheros setuid en su sistema, deberá utilizar el siguiente comando:

find / -user root –perm – 4000 –print

Examinar otros ficheros importantes del sistema

Para examinar ficheros puede utilizar la orden “cat” seguida por el nombre del fichero en cuestión. También es interesante el comando “cmp”, gracias al cual podrá comparar dos ficheros. Éste último es interesante para determinar, por ejemplo, si existen copias de ejecutables del sistema en directorios de usuario, lo cual puede ser un indicio de ataque al sistema.

El primer fichero a considerar es “/etc/passwd”. Deberá buscar en él, lo siguiente:

Otro fichero importante es “~/.forward”, que sirve para reenviar mensajes de correo electrónico. Deberá fijarse en entradas sospechosas.

El fichero “~/.rhosts” puede ser utilizado para permitir el acceso remoto al sistema y es usado algunas veces por intrusos, para crear fácilmente una puerta de acceso oculta al sistema. Compruebe periódicamente que los servidores remotos y los nombres de usuarios a los que deja conectarse son correctos. Fíjese detenidamente en la entrada “+”, pues permitiría a todos los usuarios acceder al sistema local desde cualquier servidor.

Es recomendable sacar un listado del fichero /etc/inetd.conf en condiciones totalmente seguras y compararla en situaciones posteriores, cuando se hayan añadido nuevos servicios.

Busque en “/etc/aliases”, alias inusuales o aquellos que redireccionan el correo electrónico a lugares indeseados. Fíjese también en comandos sospechosos.

Compruebe también que no aparecen nuevas entradas en el fichero de “cron”, especialmente las relativas al root. Mire los comandos que son lanzados periódicamente por el sistema y por quién ha sido solicitada su ejecución.

Detectar un sniffer

El comando “ifconfig” muestra la configuración de la interfaz de red del sistema. La mayoría de los adaptadores Ethernet deberían estar configurados para aceptar sólo los mensajes destinados a ellos. La persona que ataca su sistema, podría establecer el adaptador de un ordenador a modo promiscuo, para escuchar (y grabar) todo lo que circula por ese segmento de red.

Un ejemplo de la salida proporcionada por este comando es la siguiente:

lo0: flags=849 <UP,LOOPBACK,RUNNING,MULTICAST> mtu 8232
                               inet 127.0.0.1 netmask ff000000
hme0: flags=863<UP,BROADCAST,NOTRAILERS,RUNNING,MULTICAST> mtu 1500
                               inet 1.0.20.222 netmask ff000000 broadcast 1.255.255.255
                               ether 8:0:20:9e:9b:14

En conjunción con la aparición del en el campo flags del argumento PROMISC, lo siguiente podría indicar una actividad indeseada:

El problema es que como cualquier comando, “ifconfig” puede ser suplantado. Una forma fácil de asegurar su correcto funcionamiento, y el de todos los comandos estudiados, es hacer una copia de seguridad del ejecutable y renombrarlo en una ubicación conocida sólo por el administrador del sistema, siendo utilizada esta versión en caso de sospecha. Sería conveniente comprimir todos los comandos y ficheros juntos, para evitar que la copia de seguridad de uno de ellos sea detectada por el intruso mediante el comando “cmp”.

Volver al listado de artículos