CAPEv2: Sandbox Automatizado Self-Hosted para Análisis de Malware
Guía de CAPEv2 (Cuckoo fork), el sandbox de malware self-hosted más potente. Instalación, configuración con KVM, extracción automática de configs de malware, YARA/Sigma integration, y por qué es la opción cuando la privacidad importa.
CAPE: la sandbox privada que extrae configs
CAPEv2 se diferencia de otros sandboxes por su capacidad de extracción automática de configuraciones de malware. Cuando un RAT descifra su config en runtime (C2 IP, port, mutex, encryption key), CAPE captura esos datos descifrados. Cuando un loader desempaqueta su payload final, CAPE dumpa el payload limpio. Esto es posible porque CAPE hookea APIs criptográficas y de memoria para interceptar datos en el momento del descifrado.
Instalación
Requisitos
| Componente | Especificación |
|---|---|
| OS Host | Ubuntu 22.04 LTS |
| CPU | 8+ cores con VT-x/AMD-V |
| RAM | 32+ GB |
| Disco | 500+ GB SSD/NVMe |
| Virtualización | KVM/QEMU |
| Guest VMs | Windows 10, Windows 7, Linux |
Instalación rápida
# 1. Clonar repositorio
git clone https://github.com/kevoreilly/CAPEv2
cd CAPEv2
# 2. Ejecutar installer
sudo ./installer/cape2.sh base
# Instala: Python, MongoDB, PostgreSQL, KVM, tcpdump, etc.
# Tarda 30-60 minutos
# 3. Configurar VM guest
# Crear VM Windows 10 con KVM (virt-manager)
# Instalar Python 3, agent.py de CAPE
# Deshabilitar Windows Update, Defender, firewall
# Tomar snapshot
# 4. Configurar CAPE
# Editar conf/cuckoo.conf, conf/kvm.conf, conf/reporting.conf
# Definir las VMs disponibles, red, almacenamiento
# 5. Iniciar
sudo systemctl start cape
sudo systemctl start cape-processor
sudo systemctl start cape-web
# Web UI: http://localhost:8000
Configuración de red
Host (Ubuntu)
├── virbr0 (bridge KVM): 192.168.122.0/24
│ └── Guest VMs: 192.168.122.100-200
├── Internet access: via NAT o INetSim
└── CAPE web: puerto 8000
Con INetSim (recomendado para malware):
# INetSim simula Internet
# El malware "cree" que tiene conexion
# Todo el trafico queda capturado
sudo inetsim --bind-address 192.168.122.1
Con acceso real a Internet (riesgoso):
# Solo si necesitas que el malware contacte C2 real
# Configurar NAT con iptables
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Uso: subir muestras
Web UI
1. Acceder a http://cape-host:8000
2. Submit > Upload file o paste URL
3. Opciones:
- Package: exe, dll, doc, pdf, ps1 (auto-detecta)
- Machine: win10, win7, linux
- Timeout: 120-600 segundos
- Network: none, inetsim, internet
- Options: procmemdump, CAPE, force-sleepskip
4. Submit
5. Esperar 3-10 minutos
6. Ver informe en la web
API
import requests
# Subir muestra via API
response = requests.post(
"http://cape-host:8000/apiv2/tasks/create/file/",
files={"file": open("sample.exe", "rb")},
data={"timeout": 300, "options": "procmemdump=1"}
)
task_id = response.json()["data"]["task_ids"][0]
# Obtener informe
report = requests.get(f"http://cape-host:8000/apiv2/tasks/get/report/{task_id}/")
CLI
# Desde el servidor CAPE
python3 utils/submit.py --url http://localhost:8000 sample.exe
Output: qué genera CAPE
Informe web
| Sección | Contenido |
|---|---|
| Summary | Score, clasificación, familia detectada |
| Behavioral | Procesos, archivos, registro, mutex, servicios |
| Network | DNS, HTTP, TCP/UDP, IPs contactadas, PCAP descargable |
| Dropped files | Archivos creados por el malware (payloads, configs) |
| CAPE extractions | Payloads desempaquetados, configs descifradas |
| Process Memory | Dumps de memoria de procesos del malware |
| Screenshots | Capturas de pantalla durante ejecución |
| YARA | Reglas YARA que coincidieron |
| Sigma | Reglas Sigma que coincidieron |
| MITRE ATT&CK | Técnicas detectadas mapeadas a ATT&CK |
| Signatures | Firmas behavioral de CAPE (200+ signatures) |
Config extraction (la killer feature)
Ejemplo de output para Agent Tesla:
{
"cape_type": "AgentTesla",
"config": {
"protocol": "smtp",
"host": "mail.evil-server.com",
"port": 587,
"username": "[email protected]",
"password": "P@ssw0rd123",
"to": "[email protected]",
"persistence": "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run",
"mutex": "AgentTesla_MUTEX_xxx"
}
}
Ejemplo para Cobalt Strike:
{
"cape_type": "CobaltStrike",
"config": {
"BeaconType": "HTTPS",
"C2Server": "192.168.1.100,/api/v2/updates",
"Port": 443,
"SleepTime": 60000,
"Jitter": 20,
"PublicKey": "...",
"UserAgent": "Mozilla/5.0 ...",
"Watermark": 123456789,
"PipeName": "\\MSSE-1234-server"
}
}
Estos datos extraídos automáticamente son IOCs de alta calidad: C2 servers, credenciales del operador, configuración del beacon.
Familias con extracción automática
CAPE soporta extracción de configs para 100+ familias. Las más comunes:
| Familia | Datos extraídos |
|---|---|
| Cobalt Strike | C2, port, sleep, jitter, watermark, pipe name |
| Agent Tesla | SMTP/FTP/Telegram config, credentials |
| Emotet | C2 list, RSA public key |
| QakBot | Campaign ID, C2 list, bot ID |
| Remcos | C2, port, mutex, keylog path |
| AsyncRAT | C2, port, mutex, AES key |
| NanoCore | C2, port, mutex, plugins |
| RedLine | C2, build ID |
| FormBook/XLoader | C2 list, decoy URLs |
| IcedID | Campaign ID, C2 |
Integración con pipeline
Automatización
# Pipeline: muestra llega → CAPE analiza → IOCs a SIEM
import requests
import json
def analyze_and_extract(filepath):
# 1. Submit a CAPE
r = requests.post(
"http://cape:8000/apiv2/tasks/create/file/",
files={"file": open(filepath, "rb")}
)
task_id = r.json()["data"]["task_ids"][0]
# 2. Esperar resultado (polling)
import time
while True:
status = requests.get(f"http://cape:8000/apiv2/tasks/get/status/{task_id}/")
if status.json()["data"] == "reported":
break
time.sleep(30)
# 3. Obtener informe
report = requests.get(f"http://cape:8000/apiv2/tasks/get/report/{task_id}/")
data = report.json()
# 4. Extraer IOCs
iocs = {
"c2_servers": [],
"dropped_files": [],
"yara_matches": [],
"cape_configs": data.get("CAPE", {}).get("configs", [])
}
# 5. Enviar IOCs al SIEM/TIP
send_to_siem(iocs)
return iocs
YARA rules custom en CAPE
# Añadir reglas YARA propias
cp my_rules.yar /opt/CAPEv2/data/yara/CAPE/
# CAPE escanea automaticamente con tus reglas
Comparativa: CAPE vs sandboxes online
| Aspecto | CAPE (self-hosted) | ANY.RUN | Joe Sandbox |
|---|---|---|---|
| Privacidad | Total (tu infra) | Community = público | Community = público |
| Límites | Sin límite (tu hardware) | 1/día free | 5/mes free |
| Config extraction | 100+ familias | Limitado | Bueno |
| Personalización | Total (código abierto) | No | No |
| Interactividad | No (automatizado) | Sí (tiempo real) | No |
| Coste | Hardware + mantenimiento | Suscripción | Suscripción |
| Setup | Complejo (Linux, KVM) | Ninguno (cloud) | Ninguno (cloud) |
Fuentes y referencias
- kevoreilly. "CAPEv2: Malware Configuration and Payload Extraction." https://github.com/kevoreilly/CAPEv2
- CAPE Documentation. https://capev2.readthedocs.io/
- Cuckoo Foundation. "Cuckoo Sandbox." https://cuckoosandbox.org/
- KVM. "Kernel-based Virtual Machine." https://www.linux-kvm.org/
Preguntas frecuentes
Libros recomendados
Artículos relacionados
ANY.RUN, Joe Sandbox y Hybrid Analysis: Sandboxes Online Comparadas
Análisis Dinámico de Malware: Sandboxes, Debuggers y Monitorización
FLARE VM: Configuración Paso a Paso de la Distro de Análisis de Malware
Este contenido tiene fines exclusivamente educativos y de investigación en ciberseguridad defensiva. No se proporcionan binarios maliciosos ni payloads ejecutables. El uso indebido de esta información es responsabilidad exclusiva del usuario. Leer disclaimer completo.