Para crear nuestro tarro, recurriremos a una herramienta desarrollada en Python llamada Kippo, una herramienta especializada en la creación de honeypots orientados a ssh que nos creará un entorno ficticio para todos los curiosos que quieran entrar al puerto 22 de nuestro servidor. Para ello lo primero que haremos será cambiar el puerto de escucha de nuestro servidor ssh (si es que no lo tenemos cambiado de antes) a un puerto distinto; queremos que el puerto 22 sea el que usen para entrar el honeypot con lo que tendremos que hacer que el ssh real se realice a través de otro puerto... A modo de recomendación personal evitaría usar el puerto 2222 o 22000, pues dichos puertos son conocidos por ser usados como puertos alternativos al 22. Para cambiar el puerto de escucha editaremos el fichero /etc/ssh/sshd_config y cambiaremos el valor de Port a uno menos conocido como podría ser el 10000 (por ejemplo). Si quisiésemos hacerlo directamente desde la línea de comandos al mismo tiempo que aplicamos los cambios, podríamos hacerlo de la siguiente forma:
sed-i's/Port 22/Port 10000/g'/etc/ssh/sshd_config &/etc/init.d/ssh restart
Esta línea estaría compuesta por una sustitución de la línea "Port 22" por "Port 10000" en el fichero sshd_config, seguido del reinicio del servicio ssh para aplicar los cambios.
Con este pequeño requisito cumplido, tocaría comenzar instalando los preparativos; es decir los paquetes necesarios para que Kippo funcione. Kippo no puede ser instalado desde los repositorios oficiales, pero este programa posee dependencias que sí que pueden ser instalados desde éstos, con lo que comencemos instalándolos. En este caso me he centrado en un entorno Debian, pero el proceso en entornos Red Hat no debería diferir mucho más allá del gestor de paquetes:
apt-get install python-dev openssl python-openssl python-pyasn1 python-twisted authbind
La mayoría de los paquetes están basados en python, a excepción del paquete authbind que se encarga de permitir que usuarios que no sean root, puedan trabajar con puertos menores 1024, pues queremos que el honeypot NO sea ejecutado por root.
Ahora crearemos un usuario especialmente preparado para ejecutar el honeypot, un usuario que, valga la originalidad, llamaremos kippo y que pertenecerá al grupo sudo.
useradd-m kippo -gsudo
Dicho usuario podrá manipular/usar el puerto 22, un privilegio que única y exclusivamente tendrá él, si bien con lo que hemos hecho no basta, sino que también necesitamos preparar authbind para ello. Esto es tan sencillo como crear un fichero llamado 22 dentro del directorio /etc/authbind/byport/ y darle los permisos adecuados para que únicamente kippo pueda tener acceso a éste; lo cual se resumiría tal que así:
- touch /etc/authbind/byport/22
- chown kippo /etc/authbind/byport/22
- chmod 700 /etc/authbind/byport/22
Ahora que hemos preparado tanto el puerto como el usuario, llegaría el turno de movernos a la carpeta /home de kippo y descargarnos el fichero kippo; fichero que, tal y como he comentado antes, no está disponible desde los repositorios, pero sí desde github con lo que tras movernos a la carpeta, descargaríamos y descomprimiríamos la aplicación. A modo de recomendación, sería bueno crear una carpeta dentro del directorio home que guarde todo lo relacionado con la aplicación.
- su kippo
- cd /home/kippo
- mkdir kippo_DIR
- cd kippo_DIR
- wget https://github.com/desaster/kippo/archive/v0.9.tar.gz
- tar -xzf v0.9.tar.gz
Por fin tenemos kippo descargado, si bien eso no significa que esté operativo... Por un lado es importante tener en cuenta que, a diferencia de muchos programas descargados desde github, este programa no requiere ser compilado/instalado para funcionar y además requiere realizar algunos ajustes para ser del todo operativo... Para empezar, el fichero de configuración que existe ahí, está a modo de plantilla y ni siquiera se encuentra correctamente nombrado para evitar que pueda usarse... Esta plantilla tendría se llama kippo.cfg.dist y además está configurada para trabajar por defecto con el puerto 2222, cosa que nosotros no queremos pues queremos usar el puerto 22 para emular un puerto ssh "real". Es por eso que primero renombraremos el fichero de configuración y después cambiaremos el puerto de escucha del 2222 al 22 mediante el comando sed de forma parecida a como hemos hecho antes con el fichero sshd_config.
- cd /home/kippo/kippo-DIR/kippo-0.9/
- mv kippo.cfg.dist kippo.cfg
- sed -i '/ssh_port = 2222/ssh_port = 22/g' kippo.cfg
Ya lo tenemos casi preparado, solo faltan un par de detalles más. Por un lado, tenemos que saber que los usuarios ficticios del honeypot se encuentran dentro del fichero userdb.txt, el cual se encuentra dentro del directorio data que a su vez se encuentra dentro de la carpeta de la aplicación de kippo. Cada usuario existente dentro de dicho fichero tiene la siguiente estructura:
usuario:0:contraseña
He aquí un fichero de ejemplo:
- root:0:123456
- root:0:test
- ivan:0:ivan
Por otro lado, dentro del directorio de la aplicación de kippo, tenemos un fichero llamado start.sh, fichero encargado de arrancar kippo; dicho fichero tiene que ser modificado, pues ahora mismo no está preparado para trabajar con authbind. Éste tendría que ser editado para ofrecer este aspecto:
- #!/bin/sh
- echo -n "Starting kippo in background..."
- #twistd -y kippo.tac -l log/kippo.log --pidfile kippo.pid
- DIR=/home/kippo/kippo-DIR/kippo-0.9
- cd ${DIR}
- authbind --deep twistd -y kippo.tac -l log/kippo.log --pidfile kippo.pid
A base de prueba y error, he visto que esto no basta y que es necesario que creemos dos directorios nuevos, pues en caso contrario, la aplicación no funcionará correctamente... El primero es un directorio llamado log, que se crearía dentro de la carpeta de la aplicación, mientras que el otro se llamaría tty. Obviamente ambas carpetas tendrían que pertenecer al usuario kippo.
- mkdir /home/kippo/kippo-DIR/kippo-0.9/log
- mkdir /home/kippo/kippo-DIR/kippo-0.9/log/tty
- chown kippo /home/kippo/kippo-DIR/kippo-0.9/log
- chown kippo /home/kippo/kippo-DIR/kippo-0.9/log/tty
Con esto ya tendríamos todo preparado y si ejecutásemos el script start.sh podríamos arrancar kippo, pero en mi opinión dicho script no es demasiado funcional pues no puede ser ejecutado en el arranque y no te ofrece ninguna posibilidad de pararlo de una forma cómoda. Es por ello que he añadido un pequeño script en /etc/init.d / para poder manejar el servicio con más comodidad. Dicho script sería el de a continuación y se denominaría kippo.sh.
- #!/bin/bash
- #
- # preload init.d script
- ### BEGIN INIT INFO
- # Provides: start.sh
- # Required-Start: $local_fs $remote_fs $time
- # Required-Stop: $local_fs $remote_fs $time
- # Default-Start: 2 3 4 5
- # Default-Stop: 0 1 6
- # Short-Description: Kipoo starter
- # Description: Kippo automatic starter. It starts during the boot
- ### END INIT INFO
- PIDFILE=/home/kippo/kippo-DIR/kippo-0.9/kippo.pid
- NOMBRE="Kippo"
- SRV="twistd"
- function status()
- if [ -f ${PIDFILE} ];
- then
- echo "${NOMBRE} esta en marcha"
- else
- echo "${NOMBRE} esta parado"
- fi
- function start(){
- echo -n $"Iniciando servicio ${NOMBRE}: "
- su - kippo -c "/home/kippo/kippo-DIR/kippo-0.9/start.sh" >/dev/null 2>&1
- RETVAL=$?
- echo $! > $PIDFILE
- if [ ${RETVAL} -eq 0 ];
- then
- echo "Se ha iniciado ${NOMBRE}"
- else
- echo "No se ha podido iniciar ${NOMBRE}"
- fi
- echo
- }
- function stop(){
- echo -n $"Parando servicio ${NOMBRE}... "
- SERV=$(ps -e |grep ${SRV} |awk '{print $1}')
- kill -9 ${SERV}
- echo "Servicio detenido"
- }
- function restart(){
- stop
- sleep 10
- start
- }
- case "$1" in
- start)
- start
- ;;
- stop)
- stop
- ;;
- restart)
- restart
- ;;
- status)
- status
- ;;
- *)
- echo $"Usar: $0 {status|start|stop|restart}"
- exit 1
- esac
- exit 0
Obviamente sobre dicho script tendríamos que ejecutar dos comandos más; uno que haga que sea ejecutable, y otro que haga que se arranque en el inicio con el fin de que en caso de apagar el servidor. no se pierda nuestro querido tarro de miel.
- chmod 755 /etc/init.d/kippo.sh
- insserv kippo.sh
Ahora cualquier que acceda al puerto 22 por ssh, en vez de acceder a nuestro entorno real, accederá al honeypot en cuestión, honeypot en el que en caso de acertar sus credenciales (por defecto está diseñado para tener un único usuario que sería root con contraseña 123456) accederíamos. Obviamente dicho honeypot estaría aislado del verdadero sistema y siempre nos estaría dando datos ficticios, desde la ip hasta los ficheros presentes.
Una evidencia de que no estamos accediendo al servidor de siempre, más allá de la información existente dentro de éste, sería el hecho de que el ssh fingerprinting del servidor ha cambiado, pues en realidad estaríamos accediendo a un entorno diferente al real.
Gracias a este sencillo pero útil procedimiento, lograríamos alejar a gran parte de los curiosos de nuestro servidor ssh, haciendo que los atacantes malgasten su tiempo en un entorno ficticio y evitando que centren su atención en el puerto ssh real.
Espero que os haya resultado útil.
Saludos.