sábado, 1 de octubre de 2011

Kippo – SSH Honeypot


Si nunca habéis oído el término “honeypot” deciros que es, como su nombre indica, un tarro de miel para un posible atacante. Existen varios tipos de honeypots según el nivel de interacción que brindan, su finalidad, el tipo de servicio/s que emulen, etc.
Básicamente, un honeypot suele ser un sistema que simula ser vulnerable a algun vulnerabilidad, ser un relay de correo abierto, un servidor SSH con credenciales fáciles de adivinar, etc.

En este caso, Kippo es un honeypot de interacción media (no es una consola obtenida por SSH con todas sus posibilidades, pero sí tiene implementados ciertos comandos) escrito en Python y cuya finalidad es guardar un registro de los intentos de acceso al servidor por fuerza bruta y, cuando un atacante se conecte y realice cualquier acción, guardar toda la sesión de comandos y cualquier posible fichero que el atacante descargue en el servidor.

Las ventajas de tener un honeypot, o varios, son diversas. Por un lado, tenemos la posibilidad de detectar que alguien está intentando atacar nuestra red por las alertas del honeypot, además de que se mantendrá “ocupado” al menos hasta que descubra que es un honeypot o cambie de objetivo. Por otro, podemos recopilar multitud de herramienta que los atacantes suben a los servidores SSH comprometidos, así como obtener ciertas estadísticas relativas a los ataques SSH que recibamos y la metodología seguida por los atacantes cuando consiguen un acceso SSH.

Explicado esto, pasemos a la instalación, en sistemas Debian bastará con hacer:
root@ph0b0s:~# apt-get install python-dev openssl python-openssl python-pyasn1 python-twisted , si tenéis otros sistemas, podéis pasaros por la entrada de instalación en la wiki oficial.
Adicionalmente, y como veremos más adelante, Kippo puede utilizar una base de datos MySQL para guardar la información del honeypot, para ello necesitaremos también el paquete “python-mysqldb”.

Antes de arrancar Kippo, es necesario comentar que, ejecutarlo como root, es una acción bastante peligrosa, puesto que si algún atacante lograse saltarse el honeypot de algún modo, o encontrar algún fallo en el mismo, los privilegios con los que contaría serían los de root, por lo que lo mejor es ejecutarlo con un usuario limitado. Más adelante veremos cómo hacer para que Kippo se encuentre tras el puerto 22 sin estarlo realmente.

Ahora, una vez hayamos descargado y descomprimido el fichero en el directorio que queramos, pasaremos a modificar el fichero kippo.cfg para establecer la configuración del honeypot.

Entre las distintas opciones que tenemos de configuración se encuentran las siguientes:
  • ssh_port: Puerto en el que dejar a la escucha Kippo, como comentamos anteriormente, que sea un puerto no privilegiado para ejecutarlo con un usuario con privilegios limitados.
  • hostname: El nombre de la máquina que será mostrado en el prompt de la consola cuando alguien se conecte al honeypot.
  • log_path: Ruta donde se guardarán los ficheros de log de toda actividad del honeypot.
  • download_path: Ruta donde se guardarán todos los ficheros que se descarguen mediante el “comando” wget, muy útil para descubrir nuevas herramientas y/o malware utilizadas por los atacantes.

Una vez realizados los cambios necesarios tenemos que arrancar Kippo, para ello contamos con varias opciones. La primera es ejecutar directamente el fichero “start.sh”, que no es más que “twistd -y kippo.tac -l log/kippo.log --pidfile kippo.pid ”, lo que arrancará Kippo en segundo plano. En caso de que queráis ejecutarlo en primer plano para poder ver toda la actividad en tiempo real, podéis hacerlo con el comando twistd -y kippo.tac -n.

Una vez ejecutado, se nos irá mostrando la información de toda actividad:

Visualización en tiempo real de las sesiones de Kippo

Por supuesto, el atacante tiene una pseudo shell bastante completa. A pesar de que Kippo emula distintos comandos, es muy fácil que un atacante que realiza el proceso de forma manual se de cuenta de que está en un honeypot sólo con probar algunos comandos básicos.

Por ejemplo, el comando “top” dice que no se encuentra:
webdev:~# top
bash: top: command not found

Al igual que disponemos de un “ls”, pero con cierto comportamiento extraño de sus modificadores:

Comportamiento del ls "simulado"
  
Como vemos, el “ls” funciona, si le decimos que haga un “ls” extendido también nos devuelve la salida, pero con la particularidad de que nos muestra los ficheros ocultos. Por último, si probamos a realizar un “ls” “recursivo” el argumento no es procesado.

En cualquier caso, un honeypot como este considero que es muy útil para detectar y estudiar ataques automatizados que realizan ataques de fuerza bruta de contraseñas para acceder a servidores y, posteriormente, descargar herramientas de ataque, por ejemplo:

Descarga con "wget" de una herramienta de ataque

En este caso simulamos un atacante que descarga un fichero en C de una herramienta que permite realizar ataques de SYN flood. Recordemos que todo fichero descargado se guarda en la carpeta “dl” (establecida en el fichero de configuración), por lo que, si el atacante descargase una herramienta privada, algún exploit, etc, podríamos obtener una copia para su posterior análisis.

Para reproducir los logs tenemos la herramienta “playlog.py” dentro de la carpeta “utils”, para reproducir un log podemos, por ejemplo, utilizar el comando z0mbiehunt3r@ph0b0s:~/kippo-0.5/utils$ ./playlog.py ../log/tty/20111001-181757-4654.log 0, lo que empezará a mostrar por pantalla toda la sesión.

Por supuesto, existen más herramientas en dicha carpeta, como “passdb.py” que permite añadir más passwords aceptados para la conexión SSH o “createfs.py” que permite recrear el sistema de ficheros de la máquina real para simular un entorno más realista.

También hay que tener en cuenta que, para recibir más ataques automatizados, lo mejor es que Kippo “escuche” en el puerto 22, tal y como se ha comentado varias veces en el post, para escuchar en dicho puerto se requieren privilegios de root, por lo que lo mejor es utilizar iptables para redirigir la petición, por ejemplo: iptables -t nat -A PREROUTING -i IN_IFACE -p tcp --dport 22 -j REDIRECT --to-port 2222, si queréis más información al respecto, o métodos alternativos, visitad la correspondiente entrada en la wiki.

Por último, vamos a ver las opciones de log mediante MySQL con las que cuenta Kippo.
Lo primero será conectarnos al servidor MySQL como root, o un usuario con suficientes privilegios, para autorizar al usuario que usará Kippo.
z0mbiehunt3r@ph0b0s:~$ mysql -u root -p
mysql> CREATE DATABASE kippo;
mysql> GRANT ALL ON kippo.* TO 'kippo'@'localhost' IDENTIFIED BY 'kippo'; (Utilizar un password mejor...)

Ahora, nos conectamos como el usuario kippo e importamos el fichero .sql con la estructura utilizada por Kippo.
z0mbiehunt3r@ph0b0s:~$ mysql -u kippo -p
mysql> USE kippo;
mysql> source kippo-0.5/doc/sql/mysql.sql;

Una vez que tengamos preparada la base de datos, sólo nos queda realizar los cambios de configuración, recordemos que es el fichero kippo.cfg. Las líneas correspondientes al log mediante MySQL se encuentran justo al final. Tendremos que dejar algo similar a lo siguiente:

[database_mysql]
host = localhost
database = kippo
username = kippo
password = kippo

Una vez volvamos a arrancar Kippo, podremos recurrir a la base de datos para obtener estadísticas, comprobar el uso del Honeypot, etc.

Si alguno de vosotros utiliza Kippo en un servidor real, seguro que se “asusta” de la cantidad de ataques diarios que se realizan de manera automatizada...


No hay comentarios:

Publicar un comentario