Archive

Archive for May 4th, 2011

Sniffing en Remoto

May 4th, 2011 No comments

En más de una ocasión me he encontrado en la necesidad de realizar una captura de red de un equipo remoto en tiempo real y analizarla con varias herramientas, pero se plantean varios “problemas” a la hora de realizarlo.

Uno de los problemas es que necesitaríamos tener instaladas en el servidor todas las herramientas de análisis que necesitemos. Esto en algunos casos no es posible (herramientas con GUI), además de no ser muy seguro tener todas las herramientas instaladas en el servidor. Una opción es realizar una captura con tcpdump durante X tiempo y luego volcarla a la estación de trabajo, pero el no poder analizar la captura “on-the-fly” o el hecho de que la actividad sospechosa no se realizase justo cuando estamos capturando los datos (¿qué pasa si te la cuelan entre captura y captura?) es algo que me preocupa, y sí, el servidor ya cuenta con NIDS y HIDS pero el problema se plantea cuando necesitamos una captura de red completa.

Para ello lo que vamos a hacer es lo siguiente:

  • Crear un usuario en el servidor, que pueda ejecutar tcpdump con permisos de root sin password
  • Autorizar el login de dicho usuario por SSH en el servidor mediante claves DSA permitiendo únicamente ejecutar el binario ‘sudo
  • Crear una cola FIFO donde volcar la captura remota

Hecho esto, la FIFO contendrá la captura del servidor remoto, con lo que podremos usarla como origen de captura en la estación de trabajo.

El servidor es una Debian GNU/Linux y la estación de trabajo es FreeBSD 8.2.

Creando el usuario en el servidor:

[email protected]:~$ sudo useradd -m -N -s /bin/bash sniffer
[email protected]:~$ sudo passwd sniffer
sudo passwd sniffer
Introduzca la nueva contraseña de UNIX:
Vuelva a escribir la nueva contraseña de UNIX:
passwd: contraseña actualizada correctamente

Parámetros:

  • -m Crea el directorio de conexion si no existe
  • -N No crea el grupo del usuario
  • -s Shell por defecto del usuario
  • sniffer Usuario

La password es opcional, dependiendo si el servidor SSH permite logins con contraseñas vacías. Hecho esto ejecutamos la siguiente orden para permitirle ejecutar tcpdump como root sin pedir la contraseña:

[email protected]:~$ sudo echo "sniffer ALL= NOPASSWD: `which tcpdump`" >> /etc/sudoers

Autorizar login SSH sin password:

Ahora lo que haremos será generar una clave DSA en la estación de trabajo, en caso de que ya la tengas generada, puedes saltarte esta parte.

[[email protected] ~]$ ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/home/sch3m4/.ssh/id_dsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/sch3m4/.ssh/id_dsa.
Your public key has been saved in /home/sch3m4/.ssh/id_dsa.pub.
The key fingerprint is:
78:d2:ed:e7:33:8f:d8:5c:78:b6:2b:21:1d:9c:c0:a6 [email protected]
The key's randomart image is:
+--[ DSA 1024]----+
|         .       |
|          +      |
|         o o .   |
|       oE.  +    |
|      o S .. .   |
|       o .. o.   |
|          ..o.+  |
|           *+= . |
|          . ==+. |
+-----------------+
[[email protected] ~]$

Ahora camos a copiar la clave pública que hemos generado (~/.ssh/id_dsa.pub) al directorio de trabajo del usuario “sniffer” en el servidor, crear la carpeta “.ssh” y volcar la clave pública al fichero “.ssh/authorized_keys” y darle los permisos adecuados. Dependiendo de la configuración que tengamos en el servidor SSH tendremos que agregar el usuario “sniffer” en la linea “AllowUsers“  del fichero de configuración de SSH (/etc/sshd/sshd_config).

[[email protected] ~]$ scp -C .ssh/id_dsa.pub [email protected]:~/
[email protected]'s password:
id_dsa.pub         100%  616     0.6KB/s   00:00   
[[email protected] ~]$

Ahora nos conectamos por SSH al servidor, con el usuario “sniffer” para crear el directorio “~/.ssh” crear el fichero “~/.ssh/authorized_keys” con la clave pública DSA que hemos subido al servidor, e indicarle que solo puede usar la orden ‘sudo‘:

[[email protected] ~]$ ssh [email protected]
[email protected]'s password: 

[email protected]:~$ mkdir .ssh
[email protected]:~$ chmod 0700 .ssh/
[email protected]:~$ cat id_dsa.pub > .ssh/authorized_keys
[email protected]:~$ rm id_dsa.pub
[email protected]:~$ chmod 600 .ssh/authorized_keys
[email protected]:~$ ls -l .ssh/
total 4
-rw------- 1 sniffer users 631 may  4 19:55 authorized_keys
[email protected]:~$

Hecho esto el contenido de “~/.ssh/authorized_keys” quedaría algo parecido a esto:

ssh-dss A(...)suGkuJRcwAAAIEAmKBmvqR+0IjzrdYXR8BX(...)ZScAAACAG2l92RIc4vlI+o(...)UQoreQ= [email protected]

Ahora probamos a iniciar sesion con el usuario ‘sniffer‘ en el servidor:

[[email protected] ~]$ ssh [email protected]

Last login: Wed May  4 19:58:10 2011 from 10.0.0.33
[email protected]:~$

Ahora vamos a intentar iniciar sesión lanzando tcpdump:

[[email protected] ~]$ ssh [email protected] sudo tcpdump -i tun0

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on tun0, link-type RAW (Raw IP), capture size 65535 bytes
^CKilled by signal 2.
[[email protected] ~]$

Todo correcto así que vamos a preparar los parámetros de tcpdump y volcar la salida a una FIFO:

[[email protected] ~]$ mkfifo /tmp/fifo.sniffer
[[email protected] ~]$ ssh [email protected] sudo tcpdump -U -n -w - -i wlan0 "port 80" > /tmp/fifo.sniffer

Ahora, ya podemos lanzar Wireshark con la siguiente orden:

[[email protected] ~]$ sudo wireshark -k -i /tmp/fifo.sniffer

La opción “-k” es para que comience la captura en cuanto se abra.

Categories: *BSD, General, GNU/Linux, Red, Seguridad, UNIX Tags: