Análisis con Herramientas Estándar 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 quetipo 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.
1. 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-x8 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 | |
srwxrwxrwx1 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 Broken pipe | 1 root | root | 4 Feb 28 02:23 ftape -> rft0 |
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
1 drwxr-xr-x2 rootroot1024 Apr 20 15:21 ./dev/rev0
1 -rw-r--r--1 rootroot5 Apr 20 15:21 ./dev/rev0/sniff.pid
28206120 -rw-r--r--1 rootroot19654 Apr 20 20:23 ./dev/rev0/tcp.log
9 -rwxr-xr-x1 1080users9106 Sep 20 1999 ./dev/rev0/slice
8 -rwxr-xr-x1 1080users8174 Sep 20 1999 ./dev/rev0/smurf4
8 -rwxr-xr-x1 1080users7229 Sep 20 1999 ./dev/rev0/snif
4 -rwxr-xr-x1 1080users4060 Mar 5 1999 ./dev/rev0/sp.pl
1647709 -rwxr-xr-x1 root10008268 Aug 10 1999 ./dev/.../blitznet/slice2
619072 -rwxr-xr-x1 rootroot2006 Mar 29 1999 ./usr/bin/sliceprint
2552301 -rw-r--r--1 rootroot900 Mar 21 1999 ./usr/include/python1.5/sliceobje
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 queencontrar binarios ejecutables con estos nombres.
cd /mnt/dev # ls -lR ...
...: total 2699
drwxr-sr-x2 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 |
-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-x1 root | 1000 | 2258 Aug 10 1999 rush.tcl |
-rwxr-xr-x1 root | 1000 | 8268 Aug 10 1999 slice2 |
ls -lR rev0 rev0: total 51
-rwxr-xr-x1 1080 | users | 9106 Sep 20 1999 slice |
---|---|---|
-rwxr-xr-x1 1080 | users | 8174 Sep 20 1999 smurf4 |
-rwxr-xr-x1 1080 | users | 7229 Sep 20 1999 snif |
-rw-r--r--1 root | root | 5 Apr 20 15:21 sniff.pid |
-rwxr-xr-x1 1080 | users | 4060 Mar 5 1999 sp.pl |
-rw-r--r--1 root | root | 19654 Apr 20 20:23 tcp.log |
drwxr-xr-x6 root | root | 27648 Apr 21 04:01 . |
-rwsr-xr-x1 root | root | 20164 Apr 15 19:23 chx |
lrwxrwxrwx1 root | root | 8 Feb 28 02:28 netscape-navigator -> netscape |
drwxrwxr-x2 news | news | 1024 Feb 28 02:25 rnews.libexec |
drwxrwxr-x2 news | news | 1024 Feb 28 02:25 control |
drwxrwxr-x2 news | news | 1024 Feb 28 02:25 filter |
lrwxrwxrwx1 root | root | 4 Dec 30 13:06 elatex -> etex |
lrwxrwxrwx1 root | root | 5 Dec 30 13:06 lambda -> omega |
lrwxrwxrwx1 root | root | 3 Dec 30 13:06 latex -> tex |
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
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 toolong. 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, %sLOGIN 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 queel 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)
El 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].