El Loop Infinito del Atacante
En esta guía te enseñaré a desplegar un honeypot que no solo simula servicios corriendo en ciertos puertos, sino que además aplica reglas dinámicas para que cualquier atacante que se conecte… termine atacándose a sí mismo jeje
Ideal para entretenerte y agotar la paciencia y recursos del bot atacante.
¿Qué necesitamos?
Pues muy poco, un Linux, en nuestro caso un Debian 12 e instalar iptables para que funcione nuestro honeybot y tcpdump para ver que realmente funciona.
sudo apt install -y iptables tcpdump
Una vez tenemos lo necesario, para que el sistema pueda redirigir conexiones entrantes hacia otra IP (en este caso, hacia el propio atacante), hay que habilitar IP forwarding, el código facilitado más adelante ya lo hace cuando se ejecuta, pero si queréis quitarlo del script tendréis que hacerlo de manera permanente así:
echo "net.ipv4.ip_forward = 1″ | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
¿Como funciona?
Es simple, levantaremos servicios fake en todos los puertos que queramos y seremos aún más desesperantes, en la primera conexión le mostraremos un banner que vaya muy lentamente, cuando nuestro banner haya terminado de mostrarse creara dos reglas en iptables, una DNAT para redirigir todo el tráfico futuro desde ese atacante hacia sí mismo y una de MASQUERADE
para que el sistema atacante no descarte el tráfico por no reconocer el origen.
Ahora solo nos falta crear nuestro honey, creamos el fichero /opt/honeypot/honeypot.py con el siguiente contenido:
import socket
import threading
import time
import subprocess
import logging
import uuid
import sys
from logging.handlers import RotatingFileHandler
import gzip
import os
HONEYPOT_PORTS = [21, 23, 80, 443, 2222, 3306, 3389, 4000, 8080, 8443, 10000]
BANNER = "Welcome \nUnauthorized access is prohibited\n"
CHAR_DELAY = 0.3 # Seconds per character for banner delay
class CompressedRotatingFileHandler(RotatingFileHandler):
def doRollover(self):
super().doRollover()
if self.backupCount > 0:
old_log = f"{self.baseFilename}.1"
if os.path.exists(old_log):
with open(old_log, 'rb') as f_in, gzip.open(old_log + '.gz', 'wb') as f_out:
f_out.writelines(f_in)
os.remove(old_log)
logger = logging.getLogger()
logger.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s [%(levelname)s] %(message)s')
file_handler = CompressedRotatingFileHandler(
'/var/log/honeypot.log', maxBytes=1_000_000_000, backupCount=5)
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
console_handler = logging.StreamHandler(sys.stdout)
console_handler.setFormatter(formatter)
logger.addHandler(console_handler)
def create_firewall_rules(attacker_ip, local_port):
dnat_cmd = [
"iptables", "-t", "nat", "-A", "PREROUTING",
"-s", attacker_ip, "-p", "tcp", "--dport", str(local_port),
"-j", "DNAT", "--to-destination", f"{attacker_ip}:{local_port}"
]
masq_cmd = [
"iptables", "-t", "nat", "-A", "POSTROUTING",
"-p", "tcp", "-d", attacker_ip, "--dport", str(local_port),
"-j", "MASQUERADE"
]
logger.info(f"Applying DNAT rule: {attacker_ip}:{local_port} -> {attacker_ip}:{local_port}")
subprocess.call(dnat_cmd)
logger.info(f"Applying MASQUERADE rule for {attacker_ip}:{local_port}")
subprocess.call(masq_cmd)
def send_slow_banner(conn):
try:
for char in BANNER:
conn.send(char.encode())
time.sleep(CHAR_DELAY)
except Exception as e:
logger.error(f"Error sending banner: {e}")
def handle_connection(conn, addr, port):
ip, src_port = addr
session_id = uuid.uuid4()
logger.info(f"Session {session_id} started from {ip}:{src_port} on port {port}")
send_slow_banner(conn)
create_firewall_rules(ip, port)
try:
while True:
data = conn.recv(1024)
if not data:
break
data_str = data.decode(errors='ignore').strip()
logger.info(f"Session {session_id} received data: {data_str}")
conn.send(b"Access denied\n")
except Exception as e:
logger.error(f"Session {session_id} error with {ip}:{src_port} - {e}")
finally:
conn.close()
logger.info(f"Session {session_id} closed with {ip}:{src_port}")
def listener(port):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(('0.0.0.0', port))
sock.listen(5)
logger.info(f"Honeypot listening on port {port}")
while True:
conn, addr = sock.accept()
thread = threading.Thread(target=handle_connection, args=(conn, addr, port))
thread.daemon = True
thread.start()
def enable_ip_forwarding():
try:
subprocess.call(["sysctl", "-w", "net.ipv4.ip_forward=1"])
with open("/etc/sysctl.conf", "r") as sysctl_file:
lines = sysctl_file.readlines()
forwarding_line = "net.ipv4.ip_forward = 1\n"
if forwarding_line not in lines:
with open("/etc/sysctl.conf", "a") as sysctl_file:
sysctl_file.write("\n" + forwarding_line)
subprocess.call(["sysctl", "-p"])
logger.info("IP forwarding enabled")
except Exception as e:
logger.error(f"Error enabling IP forwarding: {e}")
def main():
logger.info("Infinite honeypot starting...")
enable_ip_forwarding()
for port in HONEYPOT_PORTS:
thread = threading.Thread(target=listener, args=(port,))
thread.daemon = True
thread.start()
try:
while True:
time.sleep(10)
except KeyboardInterrupt:
logger.info("Honeypot terminated")
if __name__ == '__main__':
main()
Como se puede ver fácilmente en el código, simplemente en HONEY_PORTS ponemos los puertos fake que queramos, el banner a nuestro gusto y el CHAR_DELAY ,cuanto más alto, más lento va mostrando los caracteres en la primera conexión.
Ahora lo ejecutamos, tenemos dos opciones, ejecutarlo manualmente, que sería lo ideal en el primer arranque para ver como funciona, con:
sudo python3 /opt/honeypot/honeypot.py
Y luego ya podemos crearlo como servicio:
sudo nano /etc/systemd/system/honeypot-loop.service
Y pegamos:
[Unit]
Description=Infinite Attacker Loop Honeypot
After=network.target
[Service]
ExecStart=/usr/bin/python3 /opt/honeypot/honeypot.py
Restart=always
User=root
[Install]
WantedBy=multi-user.target
Lo habilitamos y lo iniciamos:
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl enable honeypot-loop.service
sudo systemctl start honeypot-loop.service
Con esto ya tendríamos nuestro, honey loop listo.
¿Cómo puedo probarlo?
Lo más sencillo es con un telnet a un puerto que pongamos en el script y que nuestra máquina atacante también escuche para que veamos como después de hacer una primera conexión y terminar de mostrar el banner nos va a conectar a nuestra propia máquina. Vamos hacer la prueba en el laboratorio con el puerto 4000.
Arrancamos honeypot:
Desde nuestra máquina atacante lanzamos el primer telnet al puerto 4000:
telnet 192.168.1.148 4000
Ahora si lanzamos un segundo telnet no nos va a mostrar el banner, porque va realmente a conectar a la máquina del atacante que también tiene el puerto 4000 abierto:
En nuestro honeypot podemos ver además utilizando tcpdump, con este comando:
sudo tcpdump -n host 192.168.1.139 and port 4000
Como redirige la conexión a la ip del atacante:
Los logs podéis encontrarlos en /var/log/honeypot.log
Si queréis borrar las reglas de iptables para hacer pruebas desde cero basta con ejecutar:
sudo iptables -t nat -F
Tener en cuenta que esto está realizado en una LAN y puede ser muy divertido para marear al auditor de ciberseguridad que venga a tu empresa, incluso poniendo un banner por cada puerto como el servicio real. Si lo ponéis expuesto a internet y la máquina tiene la ip pública directa no tendréis que hacer nada, salvo exponer solo los puertos fake que queráis y si quieres pues poner políticas por defecto de iptables para INPUT Y FORWARD en DROP y un anti-Dos básico:
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -A INPUT -p tcp –dport Número_Puerto -m connlimit –connlimit-above 5 -j REJECT
Pero eso ya va al gusto. Si lo pones detrás de un firewall, pues lo típico, tendrás que redirigir los puertos y en algunos casos configurar iptables para conservar encabezados.
Eso es todo, buen fin de semana.
TL.
Gracias por leer nuestros posts.
Preguntas Frecuentes
Un honeypot es como un cebo que pones para que los hackers intenten entrar ahí en vez de en tu sistema real. Así puedes ver qué intentan hacer, cómo atacan y aprender para protegerte mejor.
Sí, siempre y cuando solo expongas los puertos del honeypot y mantengas cerrado todo lo demás. El honeypot no da acceso real al sistema y simplemente simula servicios, pero es recomendable usarlo en entornos controlados y monitorizar el tráfico para evitar riesgos.
No te preocupes, está pensado para atrapar y estudiar a los atacantes sin que puedan hacer daño a lo que de verdad te importa. Es como una trampa segura que puedes usar para espiar a los "malos" y saber como protegerte.