8. Análisis con Herramientas Estándares de Unix

Asumiendo que nuestras herramientas de Unix están limpias de root-kit podemos seguir desde el punto donde lo dejamos en la sección anterior. Hemos notado que las dos cuentas "y" y "z" tienen el directorio "home" situado en en /tmp y en / respectivamente. Eso significa que debemos examinar de forma detenida estos directorios para detectar cualquier anomalía.

# ls -lat /mnt/tmp
   total 156
   drwxrwxrwt 6 root root 1024 May 1 04:03 .
   -r--r--r-- 1 root gdm 11 Apr 29 14:17 .X0-lock
   drwxrwxrwt 2 root gdm 1024 Apr 29 14:17 .X11-unix
   drwxrwxrwt 2 xfs xfs 1024 Apr 29 14:17 .font-unix
   drwxr-xr-x 25 y root 1024 Apr 28 23:47 ..
   drwx------ 2 user1 user1 1024 Apr 26 17:36 kfm-cache-500
   -rw-rw-r-- 1 user1 user1 12288 Apr 26 16:37 psdevtab
   drwxrwxrwt 2 root root 1024 Apr 21 11:12 .ICE-unix
   -rwx------ 1 root root 138520 Apr 20 20:15 .fileMFpmnk
 

El listado nos muestra que existe un fichero cuyo tamaño es superior al resto. También vemos que es el fichero más antiguo de la carpeta que pertenece al root. El nombre del fichero no estandarizado y posee derechos de ejecución. Debemos determinar de que tipo de fichero se trata. El programa file nos informa que el fichero misterioso es un binario ELF de 32-bit LSB ejecutable, Intel 80386, versión 1 (Linux), enlazado estáticamente, stripeado. Para ver cual es el objetivo del fichero examinamos el listado de cadenas de texto que contiene.

   # strings - /mnt/tmp/.fileMFpmnk
   /lib/ld-linux.so.2
   __gmon_start__
   libpam.so.0
   _DYNAMIC
   _GLOBAL_OFFSET_TABLE_
   pam_set_item
   free
   __ctype_tolower
   malloc
   strcmp
   pam_end
   pam_start
   . . .
   File
   Compressed
   Block
   Stream
   [nowhere yet]
   ftpd
   :aAvdlLiop:P:qQr:sSt:T:u:wWX
   bad value for -u
   option -%c requires an argument
   unknown option -%c ignored
   . . .
   VirtualFTP Connect to: %s [%s]
   banner
   logfile
   email
   /var/log/xferlog
   connection refused (server shut down) from %s
   %s FTP server shut down -- please try again later.
   lslong
   /bin/ls -la
   lsshort
   lsplain
   /bin/ls
   greeting
   full
   terse
   brief
   %s FTP server (%s) ready.
   %s FTP server ready.
   FTP server ready.
   . . .
   FTP LOGIN REFUSED (already logged in as %s) FROM %s, %s
   Already logged in.
   /etc/ftphosts
   FTP LOGIN REFUSED (name in %s) FROM %s, %s
   anonymous
   FTP LOGIN REFUSED (anonymous ftp denied on default server) FROM %s, %s
   FTP LOGIN REFUSED (ftp in denied-uid) FROM %s, %s
   /etc/ftpusers
   . . .
Por lo que vemos, strings nos comenta que el binario es un servidor FTP, normalmente llamado ftpd ó in.ftpd. Puede ser que el fichero forma parte de un root-kit, o de un caballo de Troya. Los ficheros de configuración de este tipo de kits suelen normalmente encontrarse en el directorio /dev, entonces una búsqueda rápida en ese directorio podrá desvelar nos mucha información útil.
   
   # cd /mnt/dev
   # ls -lat | head -30
   total 116
   drwxr-xr-x 8 root root 34816 Apr 30 04:02 .
   srw-rw-rw- 1 root root 0 Apr 30 04:02 log
   crw------- 1 root root 4, 1 Apr 29 14:17 tty1
   crw------- 1 root root 4, 2 Apr 29 14:17 tty2
   crw------- 1 root root 4, 3 Apr 29 14:17 tty3
   crw------- 1 root root 4, 4 Apr 29 14:17 tty4
   crw------- 1 root root 4, 5 Apr 29 14:17 tty5
   crw------- 1 root root 4, 6 Apr 29 14:17 tty6
   srwxrwxrwx 1 root root 0 Apr 29 14:17 gpmctl
   srw------- 1 root root 0 Apr 29 14:17 printer
   crw-r--r-- 1 root root 1, 9 Apr 29 14:17 urandom
   prw------- 1 root root 0 Apr 29 14:14 initctl
   drwxr-xr-x 25 y root 1024 Apr 28 23:47 ..
   crw-rw-rw- 1 root tty 3, 2 Apr 28 11:44 ttyp2
   crw-rw-rw- 1 root tty 3, 0 Apr 28 11:43 ttyp0
   crw-rw-rw- 1 root tty 3, 1 Apr 28 11:43 ttyp1
   -rw-r--r-- 1 root root 18 Apr 27 22:58 ptyp
   drwxr-xr-x 4 r00t root 1024 Apr 27 22:58 ...
   crw-rw-rw- 1 root tty 3, 4 Apr 27 12:02 ttyp4
   crw-rw-rw- 1 root tty 3, 3 Apr 27 11:56 ttyp3
   crw------- 1 root root 5, 1 Apr 21 11:09 console
   lrwxrwxrwx 1 root root 5 Apr 21 04:02 mouse -> psaux
   drwxr-xr-x 2 root root 1024 Apr 20 15:21 rev0
   -rw-r--r-- 1 root root 33 Apr 20 15:21 ptyr
   lrwxrwxrwx 1 root root 9 Feb 28 02:23 isdnctrl -> isdnctrl0
   lrwxrwxrwx 1 root root 5 Feb 28 02:23 nftape -> nrft0
   lrwxrwxrwx 1 root root 3 Feb 28 02:23 fb -> fb0
   lrwxrwxrwx 1 root root 15 Feb 28 02:23 fd -> ../proc/self/fd
   lrwxrwxrwx 1 root root 4 Feb 28 02:23 ftape -> rft0
   Broken pipe
De todos los ficheros que podemos ver en este directorio, nos llaman atención los archivos "ptyp" y "ptyr" que no son dispositivos comunes, ni directorios ni tampoco enlaces simbólicos, son ficheros de tipo ASCII text. También localizamos un directorio llamado "rev0" y una carpeta oculta "..." que pertenece al usuario r00t.
   
   # less ptyr
   . . .
   sp.pl
   slice
   ssynk4
   rev0
   bc1
   snif

Son ficheros de configuración de un caballo de Troya. El contenido muestra que ls ocultará ficheros o directorios sp.pl, slice (un cliente DoS), ssynk4 (cliente DoS), rev0, bc1, y snif (adivina que puede ser :).

Si estamos seguros que nuestro sistema no está "infectado" con un root-kit podemos utilizar las herramientas find y grep para identificar dónde se encuentran estos ficheros (el disco está montado como solo lectura, nodev, ¿verdad?).

# cd /mnt
# find . -ls | grep -f etc/ptyr
   282058 1 drwxr-xr-x 2 root root 1024 Apr 20 15:21 ./dev/rev0
   282059 1 -rw-r--r-- 1 root root 5 Apr 20 15:21 ./dev/rev0/sniff.pid
   282061 20 -rw-r--r-- 1 root root 19654 Apr 20 20:23 ./dev/rev0/tcp.log
   164753 9 -rwxr-xr-x 1 1080 users 9106 Sep 20 1999 ./dev/rev0/slice
   164754 8 -rwxr-xr-x 1 1080 users 8174 Sep 20 1999 ./dev/rev0/smurf4
   164755 8 -rwxr-xr-x 1 1080 users 7229 Sep 20 1999 ./dev/rev0/snif
   164756 4 -rwxr-xr-x 1 1080 users 4060 Mar 5 1999 ./dev/rev0/sp.pl
   164770 9 -rwxr-xr-x 1 root 1000 8268 Aug 10 1999 ./dev/.../blitznet/slice2
   61907 2 -rwxr-xr-x 1 root root 2006 Mar 29 1999 ./usr/bin/sliceprint
   255230 1 -rw-r--r-- 1 root root 900 Mar 21 1999 ./usr/include/python1.5/sliceobject.h
Algunos de los ficheros que están en la lista posiblemente son ficheros legítimos del sistema operativo, pero hay algunos que son bastante sospechosos, los que se encuentran en dos carpetas del directorio /dev.
   
   # cd /mnt/dev
   # less ptyp
   . . .
   3 egg
   3 egg
   3 bnc
En este momento podemos hacer una apuesta seguro, que el fichero "ptyp" es un fichero de configuración de la utilidad "ps" del root-kit, que oculta los procesos que contienen cadenas "egg", "bnc" en sus nombres. Hay que encontrar binarios ejecutables con estos nombres.
   
   # cd /mnt/dev
   # ls -lR ...
   ...:
   total 2699
   drwxr-sr-x 2 root 1000 1024 Aug 10 1999 blitznet
   -rw-r--r-- 1 root root 30720 Apr 26 04:07 blitznet.tar
   -rwxrw-r-- 1 r00t user1 22360 Apr 27 22:58 bnc
   -rw-r--r-- 1 900 users 2693120 Apr 20 22:18 collision.tar
   -rw-rw-r-- 1 r00t user1 976 Apr 27 22:58 example.conf
   -rw-rw-r-- 1 user1 user1 5 Apr 28 20:35 pid.bnc
.../blitznet:
   total 22
   -rw-r--r-- 1 root 1000 3450 Aug 10 1999 README
   -rw-r--r-- 1 root 1000 1333 Aug 10 1999 blitz.c
   -rw-r--r-- 1 root 1000 3643 Aug 10 1999 blitzd.c
   -rwxr-xr-x 1 root 1000 2258 Aug 10 1999 rush.tcl
   -rwxr-xr-x 1 root 1000 8268 Aug 10 1999 slice2
# ls -lR rev0
   rev0:
   total 51
   -rwxr-xr-x 1 1080 users 9106 Sep 20 1999 slice
   -rwxr-xr-x 1 1080 users 8174 Sep 20 1999 smurf4
   -rwxr-xr-x 1 1080 users 7229 Sep 20 1999 snif
   -rw-r--r-- 1 root root 5 Apr 20 15:21 sniff.pid
   -rwxr-xr-x 1 1080 users 4060 Mar 5 1999 sp.pl
   -rw-r--r-- 1 root root 19654 Apr 20 20:23 tcp.log
# cd /mnt/usr/bin
   # ls -lat | head
   total 89379
   drwxr-xr-x 6 root root 27648 Apr 21 04:01 .
   -rwsr-xr-x 1 root root 20164 Apr 15 19:23 chx
   lrwxrwxrwx 1 root root 8 Feb 28 02:28 netscape-navigator -> netscape
   drwxrwxr-x 2 news news 1024 Feb 28 02:25 rnews.libexec
   drwxrwxr-x 2 news news 1024 Feb 28 02:25 control
   drwxrwxr-x 2 news news 1024 Feb 28 02:25 filter
   lrwxrwxrwx 1 root root 4 Dec 30 13:06 elatex -> etex
   lrwxrwxrwx 1 root root 5 Dec 30 13:06 lambda -> omega
   lrwxrwxrwx 1 root root 3 Dec 30 13:06 latex -> tex
   Broken pipe
# strings - chx
   /lib/ld-linux.so.2
   __gmon_start__
   libcrypt.so.1
   libpam.so.0
   . . .
   /var/log/btmp
   /usr/share/locale
   util-linux
   fh:p
   login: -h for super-user only.
   usage: login [-fp] [username]
   /dev/tty
   %s??
   /dev/vcs
   /dev/vcsa
   login
   login: PAM Failure, aborting: %s
   Couldn't initialize PAM: %s
   FAILED LOGIN %d FROM %s FOR %s, %s
   Login incorrect
   TOO MANY LOGIN TRIES (%d) FROM %s FOR %s, %s
   FAILED LOGIN SESSION FROM %s FOR %s, %s
   Login incorrect
   .hushlogin
   %s/%s
   /var/run/utmp
   /var/log/wtmp
   /bin/sh
   TERM
   dumb
   HOME
   /usr/local/bin:/bin:/usr/bin
   PATH
   /sbin:/bin:/usr/sbin:/usr/bin
   SHELL
   /var/spool/mail
   MAIL
   LOGNAME
   DIALUP AT %s BY %s
   ROOT LOGIN ON %s FROM %s
   ROOT LOGIN ON %s
   LOGIN ON %s BY %s FROM %s
   LOGIN ON %s BY %s
   You have %smail.
   new 
   login: failure forking: %s
   setuid() failed
   No directory %s!
   Logging in with home = "/".
   login: no memory for shell script.
   exec 
   login: couldn't exec shell script: %s.
   login: no shell: %s.
   %s login: 
   login name much too long.
   NAME too long
   login names may not start with '-'.
   too many bare linefeeds.
   EXCESSIVE linefeeds
   Login timed out after %d seconds
   /etc/securetty
   /etc/motd
   /var/log/lastlog
   Last login: %.*s 
   from %.*s
   on %.*s
   LOGIN FAILURE FROM %s, %s
   LOGIN FAILURE ON %s, %s
   %d LOGIN FAILURES FROM %s, %s
   %d LOGIN FAILURES ON %s, %s
   . . .

El programa nos muestra los mensajes del sistema mencionando el fichero ".hushlogin". Todos los indicios apuntan que el binario es una versión modificada de de la aplicación login. Siempre Los binarios siempre incluyen información de objetos compilados y enlazados, salvo que estén stripeados. Si está presente esa información podemos examinarla con la utilidad nm.

 # nm chx
   chx: no symbols

En este caso estamos seguros que el fichero está stripeado. También podemos aprender bastante de lo que nos muestran los enlaces a las librerías dinámicas. Para verlo utilicemos ldd.

# ldd chx
   libcrypt.so.1 => /lib/libcrypt.so.1 (0x40018000)
   libpam.so.0 => /lib/libpam.so.0 (0x40045000)
   libdl.so.2 => /lib/libdl.so.2 (0x4004d000)
   libpam_misc.so.0 => /lib/libpam_misc.so.0 (0x40050000)
   libc.so.6 => /lib/libc.so.6 (0x40054000)
   /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

E binario depende del módulo PAM y de las librerías criptográficas. Entonces, el binario efectúa algunas tareas de autenticación de usuarios. El binario parece ser el /bin/login modificado que pertenece a algún caballo de Troya.

Normalmente los intrusos no dejan huellas evidentes que nos permiten encontrar ficheros y directorios. El ejemplo anterior nos ha probado que utilizando herramientas básicas podemos reunir bastante información.

En caso de que no sea tan sencillo, se deberá utilizar herramientas más complejas y eficaces. Para ver algún ejemplo complejo podemos ver referencias [14, 15].

[Subir]


[Anterior] [Menu Principal] [Siguiente]