Writeup — Nebula Logistics
Solución completa del laboratorio. Las salidas de los retos son reales, capturadas contra el contenedor desplegado.
Despliegue
$ bash startlab.sh ghostoffensive-m03.tar
[+] Imagen cargada
[OK] Laboratorio desplegado.startlab.sh), de modo que un escaneo por defecto no los encuentra.Fase 0 — Descubrimiento de servicios
El escaneo por defecto de localhost no ve estos servicios. Hay que escanear todos los puertos y luego perfilar los abiertos:
$ nmap -p- --min-rate 2000 localhost
(entre los abiertos: 2121, 2222, 2525, 5353, 8080)$ nmap -sV -p 2121,2222,2525,5353,8080 localhost
2121/tcp open ftp
2222/tcp open ssh OpenSSH 9.2p1 Debian 2+deb12u10 (protocol 2.0)
2525/tcp open smtp Postfix smtpd
5353/tcp open domain (generic dns response: REFUSED)
8080/tcp open http GunicornLección: el escaneo completo (-p-) es lo que revela servicios en puertos no habituales.
Reto 1 — robots.txt
Web★
Se lee robots.txt, que lista rutas que la empresa no quiere indexar y por eso mismo señala.
$ curl -s localhost:8080/robots.txt
User-agent: *
Disallow: /admin-old/
Disallow: /respaldo//respaldo/ devuelve 403 al listar, pero el fichero concreto sí es accesible. Probando nombres típicos:
$ curl -s localhost:8080/respaldo/notas.txt Notas de migracion (BORRAR) GO{robots_no_es_una_puerta_cerrada}
Flag: GO{robots_no_es_una_puerta_cerrada}
Lección: robots.txt no protege nada; anuncia rutas interesantes. Un 403 en un directorio no implica que sus ficheros estén protegidos.
Reto 2 — Cabeceras HTTP
Web★
$ curl -sI localhost:8080 Server: gunicorn X-Powered-By: NebulaCMS 2.3 X-Debug-Token: GO{las_cabeceras_hablan}
Flag: GO{las_cabeceras_hablan}
Lección: las cabeceras revelan tecnologías, versiones y restos de depuración. Deben limpiarse en producción.
Reto 3 — security.txt
Web★
$ curl -s localhost:8080/.well-known/security.txt Contact: mailto:soporte@nebula.lab Expires: 2027-01-01T00:00:00Z # GO{security_txt_dice_mas_de_lo_que_crees}
Flag: GO{security_txt_dice_mas_de_lo_que_crees}
Lección: los ficheros bajo /.well-known/ son otra fuente estándar. Además confirma el dominio nebula.lab y un buzón real.
Reto 4 — Host virtual
Web★★
El dominio nebula.lab aparece en el correo de contacto, y el DNS (reto 5) lista intranet.nebula.lab. El servidor web responde distinto según la cabecera Host:
$ curl -s -H "Host: intranet.nebula.lab" localhost:8080 <h1>Intranet - Nebula Logistics</h1> <p>Circular interna: los accesos al portal se controlan por nombre de host.</p> <p><code>GO{el_host_header_abre_puertas}</code></p>
Flag: GO{el_host_header_abre_puertas}
Lección: un sitio sin enlace público sigue existiendo. También puede descubrirse probando nombres de host, pero con DNS es inmediato.
Reto 5 — Transferencia de zona DNS
DNS★★
Se pide la zona completa al DNS del laboratorio:
$ dig axfr nebula.lab @127.0.0.1 -p 5353 +short | grep GO "nota-admin: GO{transferencia_de_zona_sin_restricciones}"
La zona completa además lista www, mail, intranet, vpn, dev, bastion01, backup: un mapa de la infraestructura.
Flag: GO{transferencia_de_zona_sin_restricciones}
Lección: restringir allow-transfer a los servidores secundarios. Aquí estaba en any.
Reto 6 — FTP anónimo
Servicios★★
El puerto 2121 es FTP. Acceso anónimo y listado, incluyendo ficheros ocultos:
$ curl -s -l ftp://localhost:2121/pub/
.nota_admin
LEEME.txt
servicios.txt$ curl -s ftp://localhost:2121/pub/.nota_admin Recordatorio: borrar este directorio antes de la auditoria. GO{ftp_anonimo_todo_a_la_vista}
Además servicios.txt menciona la cuenta de servicio svc-backup, que se usa en el reto 7.
Flag: GO{ftp_anonimo_todo_a_la_vista}
Lección: el FTP anónimo y los ficheros ocultos (los que empiezan por punto) son una fuente clásica de fugas.
Reto 7 — VRFY en SMTP
Servicios★★★
El SMTP responde en 2525. Con VRFY se comprueba qué usuarios existen. Los nombres salen de /equipo (jlopez, mfernandez, cgarcia, soporte) y del FTP (svc-backup):
$ printf "VRFY svc-backup\r\nVRFY x\r\nQUIT\r\n" | nc -q2 localhost 2525 220 mail.nebula.lab ESMTP Postfix (Debian/GNU) 252 2.0.0 Servicio Backup GO{vrfy_confirma_usuarios} <svc-backup@nebula.lab> 550 5.1.1 <x>: Recipient address rejected: User unknown 221 2.0.0 Bye
Flag: GO{vrfy_confirma_usuarios}
Lección: VRFY permite validar usuarios y devuelve además datos asociados. Se desactiva en producción. La cadena FTP → SMTP muestra cómo se combinan los hallazgos.
Reto 8 — Banner SSH
Servicios★
$ ssh -p 2222 ghost@localhost ******************************************************************* NEBULA LOGISTICS - Servidor de salto (bastion01) Acceso restringido a personal autorizado. ref. auditoria: GO{el_banner_ssh_tambien_cuenta} *******************************************************************
Flag: GO{el_banner_ssh_tambien_cuenta}
Lección: el banner previo a la autenticación lo ve cualquiera. Además el nombre bastion01 ya salía en el DNS.
Resumen
| # | Técnica | Herramienta |
|---|---|---|
| 0 | Escaneo completo de puertos | nmap |
| 1 | robots.txt y rutas derivadas | curl |
| 2 | Cabeceras HTTP | curl -I |
| 3 | /.well-known/security.txt | curl |
| 4 | Host virtual | curl -H Host |
| 5 | Transferencia de zona (AXFR) | dig |
| 6 | FTP anónimo | curl / ftp |
| 7 | VRFY SMTP | nc |
| 8 | Banner SSH | ssh |