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 pipeDe 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.hAlgunos 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 bncEn 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]