Ghost AcademyGhostOffensive · Ghost Academy
GhostOffensiveMódulo 03SOLO PROFESOR

Writeup — Nebula Logistics

← Volver al capítulo 03

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

Solución completa del laboratorio. Las salidas de los retos son reales, capturadas contra el contenedor desplegado.

Despliegue

kali@lab (salida real)
$ bash startlab.sh ghostoffensive-m03.tar
[+] Imagen cargada
[OK] Laboratorio desplegado.
Servicios del contenedor: web 8080 · FTP 2121 · SSH 2222 · SMTP 2525 · DNS 5353. Todos en puertos no estándar (los publica 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:

kali@lab
$ nmap -p- --min-rate 2000 localhost
(entre los abiertos: 2121, 2222, 2525, 5353, 8080)
kali@lab (salida real)
$ 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    Gunicorn

Lecció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.

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

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

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

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

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

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

kali@lab (salida real)
$ curl -s -l ftp://localhost:2121/pub/
.nota_admin
LEEME.txt
servicios.txt
kali@lab (salida real)
$ 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):

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

kali@lab (salida real)
$ 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écnicaHerramienta
0Escaneo completo de puertosnmap
1robots.txt y rutas derivadascurl
2Cabeceras HTTPcurl -I
3/.well-known/security.txtcurl
4Host virtualcurl -H Host
5Transferencia de zona (AXFR)dig
6FTP anónimocurl / ftp
7VRFY SMTPnc
8Banner SSHssh