17 años en Internet

10 mayo 2011

Espiar las sesiones de SSH


Una imagen vale más que mil palabras =)

Debido al grado de cifrado del ssh, resulta bastante complejo poder conocer los comandos realizados en una de sus sesiones remotas. Instalar un sniffer no es una solución puesto que toda comunicación que captemos no lo podremos leer "en claro" y tampoco nos sirve instalar un keylogger, puesto que en una conexión remota no se hace uso del teclado físico del servidor.

Está claro que siempre podemos consultar el bash_history del usuario, pero por defecto suelen venir sin el date-stamp activo, suele estar limitado por un número concreto de líneas ($HISTSIZE) y además al ser un archivo de texto es susceptible de ser modificado o borrado. Para más inri, con este método nos resulta imposible observar los datos que se han modificado dentro de un vi o las acciones que se han tomado dentro de cualquier otro binario.

Con todo esto queda demostrado que para poder realizar un análisis de calidad deberemos de pensar en una solución algo más elaborada. La solución que propongo en esta entrada es funcional y no muy complicada de llevar a cabo: Instalar un monitor de terminales y recompilar el servicio sshd para obligarle a hacer uso de él.

Lo primero es lo primero, vamos a instalar un monitor de terminales. El más famosillo es ttysnoop y consta de una aplicación cliente y una aplicación servidor. Ambas se instalarán en la máquina servidor:

sebas@MacBook:~$ sudo apt-get install ttysnoop
Y por último editaremos el /etc/snooptab para revisar que la siguiente línea no está comentada:
* socket login /bin/login

Nuestra idea es simple, obligar al demonio local de SHH a loguear todas las peticiones a través del ttysnoop. ¿Cómo haremos esto? Bajándonos las fuentes, configurar manualmente nuestro programa de login y recompilar el demonio. Los puristas de Ubuntu para hacer eso usuarían seguramente el apt-build (un híbrido de apt-get y el merge de Gentoo), pero yo soy más tradicional...

Primero averiguaremos la versión de nuestro sshd:
root@MacBook:~# sshd -v
sshd: illegal option -- v
OpenSSH_5.8p1 Debian-1ubuntu3, OpenSSL 0.9.8o 01 Jun 2010
Acto seguido nos metemos en este repositorio y nos bajamos el código fuente de nuestra versión de OpenSSH. En este caso habría que bajarse el openssh-5.8p1.tar.gz. Una vez descargado configuraremos una variable de sesión, descomprimiremos el archivo y ejecutaremos el ./configure para crear el makefile necesario para compliar nuestro demonio:
root@MacBook:~# which ttysnoops
/usr/sbin/ttysnoops (Hacemos esto para localizar el binario)
root@MacBook:~# export LOGIN_PROGRAM="/usr/sbin/ttysnoops"
root@MacBook:~# cd Descargas/
root@MacBook:~# tar xzvf openssh-5.8p1.tar.gz
root@MacBook:~# cd openssh-5.8p1/
root@MacBook:~# ./configure --prefix=/usr --sysconfdir=/etc/ssh --without-zlib-version-check --with-pam --with-tcp-wrappers

Durante la configuración nos irá dando una serie de errores referentes a la ausencia de librerías necesarias para la compilación de la aplicación. Tendremos que hacer uso del apt-get para ir instalándolas. En mi caso tuve que realizar la siguiente instalación de paquetes:
sebas@MacBook:~$ sudo apt-get install zlib1g-dev libwrap0-dev libssl-dev libpam0g-dev
Una vez finalizado sin errores el configure, compilaremos la aplicación y la instalaremos:
root@MacBook:~# make
root@MacBook:~# make install
Una vez instaldo editaremos el /etc/ssh/sshd_config para verificar que estas dos líneas no estén comentadas y tengan asignado el valor "yes":
PasswordAuthentication yes
UseLogin yes
Por último reiniciamos el servicio sshd:
root@MacBook:~# /etc/init.d/ssh restart
(En otras distribuciones es /etc/init.d/sshd restart)

Vale, ya tienes todo listo para monitorizar las sesiones SSH de tu servidor. Ahora pasemos al siguiente nivel, ¿cómo utilizamos esta herramienta? Lo primero que nos hace falta saber es en qué terminal se ha conectado el usuario que nos interesa. Si en una terminal haces un who verás que las terminales remotas vienen con apodo (definido en el /etc/hosts) o con una dirección IP. En mi ejemplo el usuario remoto está conectado en el "pts/3":


pts/3 = terminal 3


Ahora que ya hemos localizado que estamos en el terminal 3, siendo root (o haciendo uso de sudo) invocamos el ttysnoop con el número de terminal como único parámetro. Acto seguido, por motivos de seguridad, la aplicación nos solicitará la contraseña de root. Realmente te pide la contraseña de la aplicación snoop, pero si no la defines (se hace a través del código fuente original) se empleará la de root. Si no tienes password de root te va a tocar darlo de alta tecleando "sudo passwd" en otra shell:


Si no queréis usar el password de root, cread un usuario específico en vuestro sistema (similar a root pero más restrictivo) y modificar el config.h del código fuente de ttysnoop para que este sea el nuevo "snoop user".

Disfruta. Ahora verás en vivo todo lo que está haciendo el otro usuario. En tiempo real verás todo lo que teclea, todo lo que abre y todo lo que modifica en su shell. Por cierto, es una monitorización bidireccional, si escribes algo en "tu" shell también aparecerá en la shell original.

Acabamos de clonar una sesión de SSH, utilizable desde dos shells distintas =)


Podrás ver incluso todos los archivos de texto que modifica.


Ahora bien, ¿te interesa guardar todo lo que hace en un archivo de log? Pues juega con las redirecciónes:

En este ejemplo, todo lo que el usuario vea se almacenará en mi_log.txt. Como vemos en el "cat" se almacenan hasta los colorines ;)

2 comentarios:

  1. Insisto, si le hablas de esto a Sony te contratan de inmediato jeje, que ya se supo que tenian la información en un servidor con un apache viejo, corriendo en un windows 2000 sin parchar, con el firewall de windows apagado, y sin contraseña para el usuario administador.

    ResponderEliminar
  2. Da miedo pensar en cuantas manos estarán todos nuestros datos :S

    ResponderEliminar

Si te ha gustado la entrada o consideras que algún dato es erróneo o símplemente deseas dar algún consejo, no dudes en dejar un comentario. Todo feedback es bienvenido siempre que sea respetuoso. También puedes contactarme vía Twitter @Hamster_ruso si lo consideras necesario.