Cómo configurar Kippo SSH Honeypot en CentOS 5.5
Introducción
Kippo es un honeypot SSH de interacción media diseñado para registrar ataques por fuerza bruta y, lo más importante, toda la interacción de shell realizada por el atacante. Kippo está inspirado en Kojoney, pero no basado en él. Esta guía muestra cómo compilar e instalar Kippo en un servidor CentOS 5.5 y ofrece recomendaciones prácticas para un despliegue más seguro en entornos de laboratorio.
Definición rápida: honeypot = sistema que simula vulnerabilidades para atraer y analizar atacantes.
Antes de empezar — Requisitos
- CentOS 5.5 (esta guía está escrita específicamente para esa versión; ver sección de compatibilidad más abajo).
- Acceso root o privilegios sudo para instalar paquetes y crear usuarios.
- Python 2.6 (CentOS 5.5 trae Python 2.4 por defecto).
- Paquetes/librerías: Twisted, zope.interface, pycrypto, pyasn1.
Importante: Kippo no debe ejecutarse como root. Cree un usuario dedicado y limite su acceso.
Instalación de Python 2.6
CentOS 5.5 incluye Python 2.4; usted debe instalar Python 2.6. Puede usar los RPMs preparados como en este recurso:
http://www.geekymedia.com/tech-articles/rhel5-centos5-rpms-for-python-2-5-and-2-6/
Notas importantes:
- Instale solo los RPMs de la versión que necesite (al menos el paquete base y libs).
- Para iniciar Python 2.6, use el comando python26 en lugar de python. Su Python 2.4 original seguirá instalado.
- Si instala paquetes con setuptools, asegúrese de usar el intérprete correcto: python26 setup.py install
Twisted, Zope Interface y PyCrypto
Twisted es un motor de red orientado a eventos, escrito en Python. Se usa para manejar las conexiones y protocolos (entre ellos SSH).
Ejemplo de instalación de Twisted:
cd /tmp
wget http://twistedmatrix.com/Releases/Twisted/10.2/Twisted-10.2.0.tar.bz2
tar -xvf Twisted-10.2.0.tar.bz2
cd Twisted-10.2.0
python26 setup.py build
python26 setup.py install
Instale zope.interface:
cd /tmp
wget http://www.zope.org/Products/ZopeInterface/3.3.0/zope.interface-3.3.0.tar.gz
tar -xvf zope.interface-3.3.0.tar.gz
cd zope.interface-3.3.0
python26 setup.py build
python26 setup.py install
Instale pycrypto:
cd /tmp
wget wget http://www.amk.ca/files/python/crypto/pycrypto-2.0.1.tar.gz
tar -xvf pycrypto-2.0.1.tar.gz
cd pycrypto-2.0.1
python26 setup.py build
python26 setup.py install
Instale pyasn1 (ASN.1 codecs):
cd /tmp
wget http://sourceforge.net/projects/pyasn1/files/pyasn1-devel/0.0.12a/pyasn1-0.0.12a.tar.gz/download
tar -xvf pyasn1-0.0.12a.tar.gz
cd pyasn1-0.0.12a
python26 setup.py build
python26 setup.py install
Crear un usuario no privilegiado
Kippo no debe ejecutarse como root. Cree un usuario dedicado para ejecutar Kippo:
useradd kippouser
Revise y limite sus permisos si va a ejecutar en un entorno con acceso a red.
Descargar el código fuente de Kippo
Descargue la versión disponible en aquel entonces desde Google Code:
su - kippouser
wget http://kippo.googlecode.com/files/kippo-0.5.tar.gz
tar -xvf kippo-0.5.tar.gz
cd kippo-0.5
Configurar Kippo
Edite kippo.cfg según su entorno:
vi kippo.cfg
(El contenido del archivo de configuración se mantiene tal cual en el proyecto; use el archivo ejemplo y ajuste ssh_port, hostname, rutas de log y password.)
#
# Kippo configuration file (kippo.cfg)
#
[honeypot]
# IP addresses to listen for incoming SSH connections.
#
# (default: 0.0.0.0) = any address
#ssh_addr = 0.0.0.0
# Port to listen for incoming SSH connections.
#
# (default: 2222)
ssh_port = 2222
# Hostname for the honeypot. Displayed by the shell prompt of the virtual
# environment.
#
# (default: sales)
hostname = sales
# Directory where to save log files in.
#
# (default: log)
log_path = log
# Directory where to save downloaded (malware) files in.
#
# (default: dl)
download_path = dl
# Directory where virtual file contents are kept in.
#
# This is only used by commands like 'cat' to display the contents of files.
# Adding files here is not enough for them to appear in the honeypot - the
# actual virtual filesystem is kept in filesystem_file (see below)
#
# (default: honeyfs)
contents_path = honeyfs
# File in the python pickle format containing the virtual filesystem.
#
# This includes the filenames, paths, permissions for the whole filesystem,
# but not the file contents. This is created by the createfs.py utility from
# a real template linux installation.
#
# (default: fs.pickle)
filesystem_file = fs.pickle
# Directory for miscellaneous data files, such as the password database.
#
# (default: data_path)
data_path = data
# Directory for creating simple commands that only output text.
#
# The command must be placed under this directory with the proper path, such
# as:
# txtcmds/usr/bin/vi
# The contents of the file will be the output of the command when run inside
# the honeypot.
#
# In addition to this, the file must exist in the virtual
# filesystem {filesystem_file}
#
# (default: txtcmds)
txtcmds_path = txtcmds
# Public and private SSH key files. If these don't exist, they are created
# automatically.
#
# (defaults: public.key and private.key)
public_key = public.key
private_key = private.key
# Initial root password. Future passwords will be stored in
# {data_path}/pass.db
#
# (default: 123456)
password = 123456
# IP address to bind to when opening outgoing connections. Used exclusively by
# the wget command.
#
# (default: not specified)
#out_addr = 0.0.0.0
# Sensor name use to identify this honeypot instance. Used by the database
# logging modules such as mysql.
#
# If not specified, the logging modules will instead use the IP address of the
# connection as the sensor name.
#
# (default: not specified)
#sensor_name=myhostname
# Fake address displayed as the address of the incoming connection.
# This doesn't affect logging, and is only used by honeypot commands such as
# 'w' and 'last'
#
# If not specified, the actual IP address is displayed instead (default
# behaviour).
#
# (default: not specified)
#fake_addr = 192.168.66.254
# MySQL logging module
#
# Database structure for this module is supplied in doc/sql/mysql.sql
#
# To enable this module, remove the comments below, including the
# [database_mysql] line.
#[database_mysql]
#host = localhost
#database = kippo
#username = kippo
#password = secret
Consejo: cambie ssh_port a un puerto elevado durante pruebas y deje 2222 solo para producción de laboratorio si configura redirección de puertos.
Arrancar Kippo
Desde el directorio de kippo:
./start.sh
Kippo redirige la salida a log/kippo.log por defecto.
Ver los logs
Use tail para ver en tiempo real:
tail -f log/kippo.log
Hacer Kippo accesible desde internet (nota sobre puertos)
Por defecto Kippo escucha en el puerto 2222. En Windows a menudo puede usar el puerto 22 directamente; en Linux el puerto 22 está restringido a root. Una forma habitual de exponer Kippo en el puerto 22 sin ejecutar como root es redirigir el tráfico con iptables (ejemplo tomado de Twisted):
iptables -t nat -A PREROUTING -i IN_IFACE -p tcp --dport 22 -j REDIRECT --to-port 2222
Reemplace IN_IFACE por su interfaz real, p. ej. eth0. Importante: aplicar reglas NAT cambia el flujo de red; pruebe en un entorno controlado.
Pruebas
Conéctese al servidor Kippo en el puerto 2222 usando root y la contraseña 123456:
ssh 127.0.0.1 -p 2222 -l root
Debe ver el prompt del honeypot tras el login:
sales:~#
Si no ve el prompt, verifique que start.sh esté en ejecución y que no haya conflictos de puerto.
Comparativa rápida: alternativas a Kippo
- Honeyd: honeypot de baja interacción para emular servicios de red.
- Cowrie: fork moderno de Kippo con soporte mejorado y actualizaciones (recomendado si no está obligado a usar Kippo).
- Dionaea: enfocado en capturar malware (más orientado a servicios y binarios).
Cuando usar Kippo: entornos de investigación y análisis retro donde se requiere la experiencia de interacción con shell. Para nuevas implementaciones, considere Cowrie por soporte activo.
Fallos comunes y cómo solucionarlos
- Python incorrecto: asegúrese de invocar python26 al instalar dependencias.
- Permisos: Kippo crea logs y carpetas; compruebe que kippouser tenga permisos de escritura.
- Puerto en uso: use netstat -tlnp o lsof para identificar procesos que escuchen en el puerto.
- Errores de dependencias: lea la salida de python26 setup.py install; instale paquetes del sistema (gcc, python-devel) si hay fallos al compilar extensiones.
Seguridad y endurecimiento (básico)
- Ejecutar en red aislada (VLAN o laboratorio) y con monitoreo del tráfico.
- No permitir que Kippo realice conexiones salientes sin filtrado; use reglas de firewall para limitar wget y otras salidas.
- Mantenga copias de los logs en un servidor seguro para análisis forense.
- Desactive módulos de logging que puedan filtrar información sensible hacia terceros.
Checklist por rol
Operaciones/Infraestructura:
- Crear usuario kippouser y limitar permisos.
- Configurar firewall y redirección de puertos.
- Asegurar almacenamiento de logs.
Seguridad/Analistas:
- Verificar que la fs.pickle y contenidos virtuales no expongan datos reales.
- Confirmar que las muestras descargadas (dl) queden en un entorno aislado.
- Revisar y rotar claves y contraseñas iniciales.
Desarrolladores/QA:
- Probar intentos de login y validar que las sesiones quedan registradas.
- Validar que comandos en txtcmds producen salida esperada.
Criterios de prueba / aceptación
- Kippo arranca sin errores con ./start.sh.
- Conexiones SSH entrantes en ssh_port crean entradas en log/kippo.log.
- Interacciones de shell se registran y pueden reproducirse desde los logs.
- Descargas realizadas por el atacante quedan almacenadas en download_path.
Migración y compatibilidad
CentOS 5.5 y Python 2.6 son plataformas antiguas y ya no reciben actualizaciones de seguridad. Para entornos modernos considere migrar a una distribución soportada y a una solución actualizada (por ejemplo Cowrie). Si mantiene CentOS 5.5, aíslelo de redes de producción y aplique controles adicionales.
Mini-metodología para despliegue en laboratorio
- Preparar VM aislada con snapshot.
- Instalar dependencias (python26, Twisted, etc.).
- Crear usuario non-root y descargar Kippo.
- Configurar kippo.cfg (logs, puerto, paths).
- Probar localmente y revisar logs.
- Aplicar reglas de NAT/Firewall para exponer el servicio (si procede).
- Capturar snapshot y comenzar monitorización.
Glosario — 1 línea
- Honeypot: sistema trampa que simula servicios vulnerables para atraer y estudiar atacantes.
Preguntas frecuentes
¿Puedo ejecutar Kippo como root para escuchar en el puerto 22?
No es recomendable. En Linux, mejor redirigir el puerto 22 al puerto de Kippo con iptables o ejecutar en puerto no privilegiado y mantener Kippo como usuario sin privilegios.
¿Debo usar Kippo en producción?
No. Kippo es para investigación y análisis. Nunca debería ejecutarse sin aislamiento y controles estrictos en redes de producción.
¿Cuál es la alternativa moderna a Kippo?
Cowrie es un fork/alternativa más activa y mantenida que agrega funcionalidades y compatibilidad moderna.
Enlaces útiles
- The Honeynet Project: http://www.honeynet.org/
- Honeypot (Wikipedia): http://en.wikipedia.org/wiki/Honeypot_(computing)
- Kippo Project: http://kippo.googlecode.com/
- CentOS: http://www.centos.org/
Resumen final
Kippo permite capturar interacciones de atacantes en SSH y estudiar técnicas de intrusión. Dado que depende de software y sistemas antiguos, úselo en entornos controlados. Para nuevos despliegues valore alternativas mantenidas como Cowrie y siempre aplique aislamiento de red, control de salidas y almacenamiento seguro de logs.
Importante: no ejecute muestras descargadas en sistemas de producción; trate todo el material capturado como potencialmente malicioso.