Cómo configurar un Honeypot SSH

Hace unas semanas sentí curiosidad sobre qué tipos de credenciales “probaban” los hackers en SSH. Se me ocurrió la idea de crear un honeypot y capturar qué credenciales se probaron, cuándo las probaron y de dónde se originaron los intentos.

¿Qué es un honeypot?

Es posible que algunos de ustedes no sepan qué es un honeypot. Lo siguiente está tomado de la definición de Wikipedia:

En terminología informática, un honeypot es un mecanismo de seguridad informática. Está configurado para detectar, desviar o, de alguna manera, contrarrestar los intentos de uso no autorizado de los sistemas de información. 

En general, un honeypot consta de datos (por ejemplo, en un sitio de red) que parece ser una parte legítima del sitio, pero en realidad está aislado y monitoreado. Además, este parece contener información o un recurso de valor para los atacantes, que son luego bloqueados. Esto es similar a las operaciones policiales, conocidas coloquialmente como “cebo”, que se les pone un sospechoso.

En resumen, un honeypot es un sistema que parece proporcionar un servicio para atraer la atención de un recurso real. También sirve para capturar detalles de los intentos maliciosos realizados sobre él.

Descargo de responsabilidad

Una palabra de advertencia. No hubiera intentado esto en una máquina local si no fuera por 1 hecho. Tenía una conexión de banda ancha adicional que podía dedicar al proyecto. Esto aseguró que, si algo salía mal, ningún otro dispositivo podría verse comprometido. Si sigues los pasos a continuación, lo haces bajo tu propio riesgo.

Cómo configurar el Honeypot

Hay una serie de paquetes populares que proporcionan la funcionalidad de honeypot SSH (como Cowrie). Esto fue pensado en parte como una experiencia de aprendizaje, por lo tanto, el uso de dicho paquete habría negado este objetivo. Entonces, cuando fue posible, diseñé mis propias herramientas para la tarea.

Elegir un dispositivo

La primera decisión que tuve fue elegir el dispositivo que iba a actuar como un honeypot. Tengo numerosas PC’s viejas por ahí, sin embargo, habría sido excesivo dedicar una de ellas al proyecto. Otra opción que tuve fue la Raspberry Pi, tengo una gran cantidad de estas diminutas y poderosas herramientas. Estas ocupan poco espacio, requieren pocos recursos (como el poder) y la forma es perfecta para que puedas guardarla fácilmente.

No necesitaba ningún específico de una distribución que se instalara en la Raspberry Pi, por lo tanto, me quedé con Raspbian. No soy un gran admirador de Noobs, por lo tanto, instalé una copia sin cabeza de Raspbian directamente. Si no estás seguro de cómo hacerlo, puedes buscar algún artículo en línea para que sepas como hacerlo.

No hay ninguna razón por la cual esto no funcionaría en una PC estándar con un sistema operativo como CentOS o Ubuntu, es posible que debas modificar algunas cosas.

Módulo Pam

Sabía que deseaba capturar los detalles de cualquier solicitud y decidí que utilizar un módulo Pam sería mi mejor opción. No estaba seguro de si existía dicho módulo, pero (según lo anterior) este es un ejercicio de aprendizaje, por lo tanto, decidí construir un módulo básico yo mismo. El módulo fue escrito en c y almacena los detalles en una base de datos SQLite.

Este módulo deliberadamente no permite ningún inicio de sesión (ni siquiera de mí, si necesito acceso conectaría un monitor y un teclado). Como no buscaba permitir que los intentos de inicio de sesión fueran más allá de verificar las credenciales, solo implementé el método ‘pam_sm_authenticate’ para el módulo. El código fuente lo puedes encontrar en Github .

Los créditos van dirigidos a un artículo titulado “Escribir un módulo PAM de Linux” del blog de Fedetask. Encontré este artículo, así como los otros artículos asociados, muy útiles para comprender cómo funcionaba PAM.

Servidor OpenSSH

Después de configurar mi servidor SSH para usar el módulo pam recién creado, encontré un problema. Algunas solicitudes estaban almacenando credenciales vacías o peor aún con “Incorrecto” (o una subcadena que coincide con la longitud de la contraseña). Esto, por supuesto, fue un show inicial.

Tras la investigación, descubrí que el código fuente de OpenSSH contenía una función llamada ‘fake_password’. Este fue responsable de ayudar a proteger contra ataques de tiempo y ofuscó la contraseña. Para resolver mi problema, tuve que eliminar este código, compilar mi propia versión e instalarlo en Raspberry Pi (código fuente).

Almacenamiento externo

Por último, deseaba almacenar las credenciales de inicio de sesión fuera del sitio. Esto fue en caso de que algo le sucediera al Pi que me imposibilitara recuperar los datos. Por lo tanto, creé un script de Python para cargar las solicitudes a un punto final de la API de AWS. Esto fue como un plan de respaldo.

AWS

Para que los intentos de inicio de sesión pudieran almacenarse en AWS, había una configuración de 3 etapas.

  1. Base de datos DynamoDB configurada para almacenar los datos.
  2. Una función Lambda creada para actuar ante cualquier solicitud de entrada.
  3. Puerta de enlace API para permitir conexiones salientes de manera fácil a la función Lambda.

Para ayudar en la seguridad, me aseguré de que API Gateway requiriera una clave para cualquier solicitud. Esto ayudaría a detener cualquier solicitud aleatoria que se realice.

Actualmente no voy a entrar en detalles sobre cómo se configuró AWS, ya que esto requeriría un artículo en sí mismo.

Instalando el Honeypot

Actualmente, cada una de las tecnologías anteriores está alojada en Github y cada una tiene sus propios métodos de instalación y scripts. Sin embargo, he creado un instalador muy tosco en Github .

Faltan un par de pasos según el archivo README. Como configurar SSH para usar el módulo PAM y agregar la ejecución del script python en cron.

Una vez instalado, puedes dejarlo, siempre que las solicitudes no sobrecarguen el registrador.

Conclusiones

Al crear el honeypot, decidí al principio que iba a registrar las solicitudes y pasarlas a AWS. En retrospectiva, esto probablemente no era necesario y en realidad causaba una sobrecarga.

Por ejemplo, el honeypot recibió varios ataques prolongados. Durante cada uno de estos ataques, el script que se estaba cargando a AWS no pudo seguir el ritmo (lo asfixié intencionalmente).

Tuve que aumentar la cantidad de solicitudes que cargaría en un momento dado para mantener el ritmo varias veces. Si tuviera que volver a hacerlo, dejaría el paso de iniciar sesión en AWS. Si hay algo, haré una copia de seguridad de todo el archivo de la base de datos, posiblemente todavía en AWS.

Aprender cómo funcionaba PAM fue bastante interesante. El mismo módulo que creé debería funcionar bien con otros servicios como MySQL, que es potencialmente mi proyecto neto. Sería una tarea trivial transferir esto a algo como MySQL, siempre que no haya problemas similares a la función fake_password en SSH.

Este fue un experimento muy interesante el cual puedes replicar tomando las medidas de seguridad adecuadas. Te aseguro que los hallazgos te sorprenderán.