Prototipo de cifrado progresivo + detección y contención autónoma.
Importante: el cifrado es real (AES-256-GCM), pero el simulador está deliberadamente confinado a
demo_datay únicamente procesa los archivos sintéticos creados porsetup_demo.py. No acepta una ruta de destino, no busca carpetas personales, no tiene persistencia, no usa red y no bloquea Windows. La pantalla a pantalla completa es una simulación visual con salida segura.
flowchart TD
A["Cada 350 ms:<br/>foto del filesystem + muestra I/O por proceso"] --> B["Delta vs. foto anterior:<br/>creados / borrados / modificados"]
B --> C["Entropía de Shannon de archivos<br/>nuevos o modificados (≥ 7,35 bits/byte)"]
C --> D["Ventana móvil de 2,5 s:<br/>puntuación combinada de señales (máx 9)"]
D --> E{"Score ≥ 5?"}
E -- "No" --> A
E -- "Sí" --> F["Correlación: proceso con mayor<br/>escritura reciente (≥ 64 KiB),<br/>nacido durante el monitoreo"]
F -- "Sin candidato" --> G["Registrar patrón sospechoso<br/>y seguir escaneando"]
G --> A
F -- "Con candidato" --> H["Contención: terminate()<br/>→ kill() si no cede en 1,5 s"]
H --> I["Reporte de contención JSON<br/>(quarantine/) + detector.jsonl"]
La clasificación es puramente conductual: ninguna firma identifica al simulador; la decisión surge solo de la combinación de señales débiles dentro de la ventana móvil (detalle en la sección 7).
| Archivo | Función |
|---|---|
src/setup_demo.py |
Crea 30 archivos sintéticos en cinco carpetas y guarda sus hashes SHA-256 originales. |
src/ransomware_sim.py |
Cifra una carpeta nueva cada 5 segundos con AES-256-GCM y una clave derivada de contraseña; luego muestra la pantalla de recuperación. |
src/detector.py |
Escanea cada 0,35 s, puntúa comportamiento anómalo y termina automáticamente el proceso de escritura correlacionado. |
src/verify_lab.py |
Compara los SHA-256 actuales contra el manifiesto y demuestra que la restauración quedó byte por byte intacta. |
src/self_test.py |
Ejecuta una prueba integrada de detección, contención, recuperación e integridad antes de la exposición. |
src/lab_common.py |
Límites de seguridad, rutas y utilidades compartidas. |
proyecto_ransomware_lab/
├── .gitignore # Excluye .venv, demo_data, logs, quarantine y el manifiesto
├── README.md
├── requirements.txt
└── src/
├── __init__.py
├── lab_common.py # Seguridad, rutas y utilidades compartidas
├── setup_demo.py # Genera el entorno sintético + manifiesto SHA-256
├── ransomware_sim.py # Cifrado progresivo + pantalla de recuperación
├── detector.py # Detección y contención autónoma
├── verify_lab.py # Verificación de integridad post-recuperación
└── self_test.py # Prueba integrada de todo el flujo
En tiempo de ejecución se generan demo_data/, logs/, quarantine/ y lab_manifest.json en la raíz del repositorio. Ninguno se sube a GitHub (ver .gitignore).
Recomendado: Python 3.11 o superior (probado con 3.13) en una máquina virtual con snapshot.
py -m venv .venv
.venv\Scripts\Activate.ps1
python -m pip install -r requirements.txt
python src\setup_demo.py
python src\verify_lab.pyResultado esperado de la última orden:
Integridad SHA-256: 30/30 archivos idénticos al estado inicial.
OK: el entorno volvió intacto a su estado original.
Antes de la clase conviene ejecutar también la prueba integrada:
python src\self_test.pyDebe finalizar con SELF-TEST OK: detección, contención y recuperación verificadas.
Contraseña sugerida para la exposición: Seguridad2026.
Con el detector apagado:
python src\setup_demo.py
python src\ransomware_sim.py encrypt --password Seguridad2026Qué observar:
- El primer grupo de archivos cambia inmediatamente.
- Se selecciona una carpeta nueva cada 5 segundos.
- Los originales desaparecen de
demo_datay aparecen representaciones cifradas de alta entropía. - Al terminar se abre una pantalla completa de advertencia académica.
- Escriba
Seguridad2026y pulse DESCIFRAR Y DESBLOQUEAR. - Compruebe la integridad:
python src\verify_lab.pyEse 30/30 es evidencia objetiva de que no solo se recuperaron nombres: el contenido volvió exactamente igual, porque se compara SHA-256 de cada archivo contra el estado previo al cifrado.
Si cerró la pantalla de forma segura, también puede recuperar desde terminal:
python src\ransomware_sim.py decrypt --password Seguridad2026
python src\verify_lab.pyCon una contraseña errónea, AES-GCM falla la autenticación antes de escribir el texto recuperado y conserva el archivo cifrado.
Restablezca primero el entorno:
python src\setup_demo.pyAbra dos PowerShell en esta misma carpeta (la raíz del repositorio).
Terminal 1:
.venv\Scripts\Activate.ps1
python src\detector.pyTerminal 2:
.venv\Scripts\Activate.ps1
python src\ransomware_sim.py encrypt --password Seguridad2026El detector debería alertar y finalizar el proceso antes de que transcurran los 5 segundos necesarios para que el simulador avance a la siguiente carpeta. Muestra la latencia real de detección y deja evidencia en quarantine/containment-*.json y logs/detector.jsonl.
Después de la contención, recupere cualquier archivo alcanzado antes de que el proceso fuera detenido:
python src\ransomware_sim.py decrypt --password Seguridad2026
python src\verify_lab.pysrc/detector.py no contiene el nombre ransomware_sim.py, no busca .locked, no lee la cabecera del formato cifrado y no compara un hash del programa.
En una ventana móvil de 2,5 s observa:
- Ráfaga de cambios: muchos archivos creados, borrados o modificados en muy poco tiempo.
- Patrón destructivo: varios archivos desaparecen mientras aparecen varios nuevos.
- Entropía: si varios archivos nuevos/modificados pasan a tener bytes casi aleatorios, suma evidencia compatible con cifrado o compresión.
- Concentración de extensiones nuevas: detecta que muchas salidas recientes comparten una terminación, cualquiera que esta sea.
- I/O por proceso: correlaciona el evento del disco con el proceso que más bytes acaba de escribir.
Cada señal aislada puede ser legítima. Por eso se usa una puntuación combinada. Al superar el umbral, el proceso con la actividad de escritura correlacionada se finaliza automáticamente.
Para que un falso positivo nunca mate procesos ajenos a la práctica, el detector solo puede contener procesos cuyo directorio de trabajo esté dentro de esta carpeta del proyecto y que hayan nacido después de que el detector arrancó. La segunda condición es el modelo de amenaza real (el ataque se lanza durante la observación) e impide que la contención alcance procesos preexistentes del laboratorio (terminales, shells, runners). Estas dos fronteras no identifican el ransomware: únicamente definen el perímetro seguro de la VM/laboratorio. La clasificación sigue dependiendo exclusivamente del comportamiento observado.
| Rúbrica | Evidencia en la demo |
|---|---|
| Cifrado progresivo | ransomware_sim.py agrupa por carpeta y programa cada inicio con intervalo exacto de 5 s. |
| Cifrado real y funcional | AES-256-GCM mediante cryptography; los bytes almacenados no son una simple renombrada/codificación. |
| Contraseña y recuperación | PBKDF2-SHA256 deriva la clave desde la contraseña; AES-GCM autentica cada archivo antes de restaurarlo. |
| Recuperación intacta | verify_lab.py exige 30/30 hashes SHA-256 iguales al manifiesto original. |
| Mensaje/pantalla de bloqueo | Ventana tkinter a pantalla completa y topmost, explícitamente etiquetada como simulación académica. |
| Escaneo más rápido | 0,35 s por escaneo frente a 5 s por cambio de carpeta. |
| Detección por rastros | Ráfaga de archivos + borrado/creación + entropía + I/O; ninguna firma del simulador. |
| Contención automática | psutil termina el PID correlacionado sin pedir confirmación. |
| Operación autónoma | Una vez iniciadas ambas herramientas, ninguna intervención es necesaria para detectar y contener. |
La única diferencia deliberada frente a un ransomware real es el alcance: en vez de recorrer contenido personal de la computadora, cifra datos sintéticos. Para la exposición conviene decirlo expresamente como control de seguridad de la práctica.
El laboratorio reproduce, de forma confinada, dos técnicas del framework:
| Técnica ATT&CK | ID | Componente del laboratorio | Cómo se emula |
|---|---|---|---|
| Data Encrypted for Impact | T1486 | ransomware_sim.py |
El actor cifra archivos de la víctima con AES-256-GCM (clave derivada con PBKDF2-SHA256, salt y nonce por archivo), dejando los datos inutilizables hasta pagar/descifrar. |
| Command and Scripting Interpreter: Python | T1059.006 | ransomware_sim.py |
El payload se distribuye y ejecuta como un script Python de línea de comandos (encrypt --password ...), sin binario compilado ni persistencia. |
Del lado defensivo, detector.py representa el control de comportamiento equivalente al que implementa un EDR moderno: detecta T1486 en curso (ráfaga destructiva + alta entropía + concentración de extensiones) sin firmas ni hashes, y contiene al intérprete T1059 que la ejecuta (correlación por I/O y terminación del proceso). La correspondencia exacta entre cada señal del detector y la evidencia que aporta se detalla en la sección 7.
setup_demo.pycrea la evidencia inicial y calcula SHA-256.- Para cada archivo, el simulador genera
saltynoncealeatorios. - PBKDF2-SHA256 transforma la contraseña en una clave de 256 bits.
- AES-GCM cifra y agrega autenticación: una clave incorrecta o datos alterados no producen una restauración silenciosamente corrupta.
- Se escribe primero un temporal, se sincroniza y luego se reemplaza; así se reduce el riesgo de dejar una salida incompleta.
- El detector toma una línea base, vuelve a escanear cada 350 ms y mantiene una ventana móvil de 2,5 s.
- Cuando varias señales coinciden, correlaciona el cambio con el proceso de mayor escritura reciente nacido durante el monitoreo dentro del límite del laboratorio y lo termina.
- El reporte JSON deja visibles las métricas que provocaron la decisión, por lo que la detección es explicable.
- En Windows real: consumir ETW/Sysmon o un minifiltro para atribuir cada operación de archivo directamente al PID, en vez de correlacionar por tiempo e I/O.
- Mantener una copia transaccional/rollback de archivos afectados antes de la contención.
- Aprender una línea base por usuario y tipo de archivo para reducir falsos positivos de compresores, copias de seguridad y compilaciones.
- Combinar entropía con tasas de
rename,delete, apertura masiva y fallos de acceso. - Ejecutar el detector como servicio protegido y enviar telemetría a un SIEM.
- Agregar pruebas automatizadas de falsos positivos con cargas legítimas (ZIP, copia masiva, compilación) y medir precisión/recall.
- Use exclusivamente la VM y tome un snapshot antes de la clase.
- No quite el marcador ni cambie
LAB_ROOTpara apuntar a datos reales. - No ejecute la demostración con privilegios de administrador; no los necesita.
- No copie archivos personales a
demo_data; usesetup_demo.pypara regenerar el entorno. - La pantalla completa tiene una salida segura y no modifica políticas, sesión, teclado ni shell de Windows.
Paso a paso de referencia para recrear la máquina virtual de la exposición en cualquier computadora, sin servicios en la nube. La presentación original se hizo en una instancia EC2 de AWS; este procedimiento la reemplaza por una máquina virtual local de VirtualBox con Ubuntu 22.04 LTS (mismo sistema operativo, en local).
Requisitos del anfitrión: Oracle VirtualBox 7.x instalado y virtualización activada (VT-x/AMD-V en el firmware). En Windows: Administrador de tareas → Rendimiento → CPU → "Virtualización: Habilitada".
- Descargar la ISO Ubuntu 22.04 LTS (
ubuntu-22.04.x-desktop-amd64.iso) desde ubuntu.com/download. - VirtualBox → Nueva:
- Nombre:
ransomware-lab| Tipo: Linux | Versión: Ubuntu (64-bit) - Memoria: 4096 MB (mínimo 2048 MB)
- Disco virtual: 30 GB, tipo VDI, expansión dinámica
- Nombre:
- Configuración de la VM → Sistema → Procesador: 2 CPUs y casilla VT-x/AMD-V habilitada.
- Configuración → Almacenamiento: montar la ISO en la unidad óptica.
- Arrancar la VM e instalar Ubuntu (instalación mínima, usuario normal con contraseña). Al terminar, desmontar la ISO y reiniciar.
Dentro de la VM:
sudo apt update && sudo apt upgrade -y
sudo apt install -y python3-venv python3-pip git python3-tkpython3-tk: pantalla de bloqueo del simulador (tkinter)- Ubuntu 22.04 trae Python 3.10; el código es compatible pese a la recomendación 3.11+ de la sección 4.
- No hace falta xrdp ni SSH: la VM tiene su propia pantalla en la ventana de VirtualBox.
(Opcional) Guest Additions para pantalla completa y portapapeles compartido: menú Dispositivos → Insert Guest Additions CD image y ejecutar VBoxLinuxAdditions.run dentro de la VM. No es imprescindible: la pantalla de bloqueo se ve igual en la ventana de la consola.
cd ~
git clone https://github.com/LoesssLR/Cibersecurity_Ramsomware.git
cd Cibersecurity_Ramsomware
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
.venv/bin/python src/setup_demo.py
.venv/bin/python src/verify_lab.py # 30/30 + OK
.venv/bin/python src/self_test.py # SELF-TEST OKDemo A — cifrado + pantalla de bloqueo + recuperación. Abrir el administrador de archivos (GNOME Files) en demo_data y una terminal:
.venv/bin/python src/setup_demo.py
.venv/bin/python src/ransomware_sim.py encrypt --password Seguridad2026Aparece la pantalla roja de bloqueo a pantalla completa; se escribe la contraseña y se pulsa DESCIFRAR Y DESBLOQUEAR:
.venv/bin/python src/verify_lab.pyLuego restablecer el entorno:
.venv/bin/python src/setup_demo.pyDemo B — detección y contención (dos terminales en el escritorio de la VM; así la demo es solo texto e instantánea, y Files queda abierto para ver los archivos pasar a .locked en vivo):
# Terminal 1: el detector
.venv/bin/python src/detector.py
# Terminal 2: el ataque sin interfaz (1-2 s después del detector)
.venv/bin/python src/ransomware_sim.py encrypt --password Seguridad2026 --no-uiEl detector alerta en ~0,4 s (Score=8), correlaciona el PID del simulador por I/O real y lo termina; mientras tanto, en Files se ven los archivos pasar a .locked. La evidencia:
cat quarantine/containment-*.jsonY la recuperación de lo alcanzado antes de la contención:
.venv/bin/python src/ransomware_sim.py decrypt --password Seguridad2026
.venv/bin/python src/verify_lab.pyResumen del flujo de la exposición: Demo A en la VM (el ataque con pantalla) → reset → Demo B en dos terminales (el defensor, con Files de testigo) → evidencia (reporte de contención) → verify_lab 30/30.
Una vez verificado todo (self_test OK), crear un snapshot de la VM:
VirtualBox → menú Máquina → Tomar snapshot (nombre: funcional).
Un snapshot es una foto completa del disco: si algo falla el día de la exposición, Máquina → Restaurar snapshot devuelve la VM al estado funcional en minutos. Para un respaldo fuera del equipo: Archivo → Exportar appliance (OVA) y conservar el archivo.
El detector fue ajustado para correr de forma confiable en Linux nativo:
- Solo procesos nacidos durante el monitoreo son candidatos a contención (modelo de amenaza real): nunca se toca un proceso preexistente (terminal, shell, runner de pruebas).
- La actividad se mide por deltas reales entre muestras, no por contadores I/O acumulados, que pueden arrastrar I/O histórico de corridas previas y desviar la correlación.
- La contención sondea estado (
status()/zombie) en vez dewaitpid(): en Linux no se puede esperar (waitpid) a un proceso que no es hijo del detector, y el simulador es hijo del runner deself_test. psutil.io_counters()funciona con procesos vivos; unAccessDeniedal muestrear procesos recién terminados es un artefacto de zombie, no un problema de permisos.
- Apagar la VM desde el escritorio de Ubuntu (o al cerrar la ventana elegir "Save the machine state": guarda sesión y programas corriendo).
- Al encenderla de nuevo todo queda como estaba: sistema, proyecto, venv y configuración. Los snapshots solo son para restaurar el disco si algo se rompe.
- Para actualizar el código en la VM:
git pully re-ejecutarsrc/verify_lab.pyysrc/self_test.py. - Si se cambia de computadora anfitriona: Archivo → Exportar appliance (OVA) y Importar appliance en la nueva, conservando el snapshot.