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

Writeup — Helios Systems

← Volver al capítulo 04

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

Las salidas son reales, capturadas contra el contenedor desplegado.

Servicios y puertos del laboratorio: web 8181 · SMB 4445 · SNMP 1161/UDP · Redis 6380 · servicio propio 7777 · portal TLS 8443. Ninguno está en su puerto estándar.

Fase 0 — Descubrir y perfilar

kali@lab (salida real)
$ nmap -p 4000-9000 --min-rate 3000 localhost
4445/tcp open  upnotifyp
6380/tcp open  unknown
7777/tcp open  cbt
8181/tcp open  intermapper
8443/tcp open  https-alt

Los nombres que nmap muestra en esta fase son solo los que corresponden a esos números de puerto en su tabla, no lo que realmente hay. Se confirma con -sV sobre los abiertos:

kali@lab (salida real)
$ nmap -sV -p 4445,6380,7777,8181,8443 localhost
4445/tcp open  netbios-ssn Samba smbd 4
6380/tcp open  redis       Redis key-value store 7.0.15
7777/tcp open  cbt?
8181/tcp open  http        Apache httpd 2.4.49 ((Unix))
8443/tcp open  ssl/http    BaseHTTPServer 0.6 (Python 3.11.16)
1 service unrecognized despite returning data.

Ojo con el tiempo: el -sV del puerto 7777 tarda casi 3 minutos porque nmap prueba decenas de mensajes contra un servicio que no reconoce.

kali@lab (salida real)
$ nmap -sU -sV -p 1161 localhost
1161/udp open  snmp    SNMPv1 server; net-snmp SNMPv3 server (public)

UDP hay que pedirlo aparte (-sU): el escaneo TCP no ve SNMP.

Reto 1 — Servicio desconocido

TCP★★

Nmap marca cbt?: responde pero no lo identifica. Se conecta a mano y se prueba la ayuda:

kali@lab (salida real)
$ printf "HELP\nINFO\nQUIT\n" | nc -q2 localhost 7777
Comandos: HELP, STATUS, INFO, QUIT
helios-telemetry 0.3 GO{lo_desconocido_tambien_se_sondea}
bye

Flag: GO{lo_desconocido_tambien_se_sondea}

Lección: un servicio sin identificar no es un callejón sin salida; muchos se describen a sí mismos con un comando de ayuda.

Reto 2 — Listado de directorios

Web★

El script http-enum de nmap revisa rutas típicas (con -sV para que reconozca el servicio web):

kali@lab (salida real)
$ nmap -sV --script http-enum -p 8181 localhost
8181/tcp open  http    Apache httpd 2.4.49 ((Unix))
|_http-server-header: Apache/2.4.49 (Unix)
| http-enum: 
|   /backup/: Backup folder w/ directory listing
|_  /staff/: Potentially interesting folder
kali@lab (salida real)
$ curl -s localhost:8181/backup/config.bak
# copia de configuracion (no publicar)
db_host=10.20.0.5
db_user=helios_app
# GO{listado_de_directorios_expuesto}

Flag: GO{listado_de_directorios_expuesto}

Lección: sin -sV, nmap no trataba el puerto como web y el script no se ejecutaba. Un listado de directorio expone copias de configuración.

Reto 3 — Certificado TLS

TLS★★

El puerto 8443 usa TLS. El certificado contiene datos de la organización:

kali@lab (salida real)
$ nmap --script ssl-cert -p 8443 localhost
| ssl-cert: Subject: commonName=portal.helios.lab/organizationName=Helios Systems GO{el_certificado_habla}/countryName=ES

Flag: GO{el_certificado_habla}

Lección: los certificados revelan nombres de host y de organización, y a veces datos internos. Aquí además aparece portal.helios.lab.

Reto 4 — Sesión nula SMB

SMB★★

El puerto 4445 es Samba. Se listan recursos sin credenciales y se lee el compartido:

kali@lab (salida real)
$ smbclient -L //localhost -p 4445 -N
	Sharename       Type      Comment
	---------       ----      -------
	publico         Disk      Documentos compartidos del departamento
	IPC$            IPC       IPC Service (Servidor de archivos Helios)
kali@lab (salida real)
$ smbclient //localhost/publico -p 4445 -N -c "get informe_trimestral.txt /tmp/inf.txt"; cat /tmp/inf.txt
Helios Systems - Informe trimestral (borrador)
Servidor de archivos accesible sin credenciales por error de configuracion.
Ref: GO{sesion_nula_smb}

Flag: GO{sesion_nula_smb}

El aviso Connection to localhost failed del principio es normal: smbclient prueba primero el puerto 139 y después el indicado.

Lección: las sesiones nulas y los recursos con acceso de invitado son un hallazgo clásico.

Reto 5 — SNMP público

UDP★★

SNMP es UDP. Con la comunidad public se leen los datos del sistema:

kali@lab (salida real)
$ snmpwalk -v2c -c public localhost:1161 1.3.6.1.2.1.1
iso.3.6.1.2.1.1.4.0 = STRING: "admin@helios.lab GO{snmp_comunidad_public}"
iso.3.6.1.2.1.1.5.0 = STRING: "helios-core01"
iso.3.6.1.2.1.1.6.0 = STRING: "Sala de servidores, planta 2"

Flag: GO{snmp_comunidad_public}

Lección: comunidades por defecto (public) dan información del equipo. Sin -sU este servicio no aparece.

Reto 6 — Redis sin autenticación

Base de datos★

kali@lab (salida real)
$ redis-cli -p 6380 keys '*'
nota
flag
kali@lab (salida real)
$ redis-cli -p 6380 get flag
GO{redis_sin_autenticacion}

Flag: GO{redis_sin_autenticacion}

Lección: Redis no exige contraseña por defecto; cualquiera con acceso de red puede leer su contenido.

Reto 7 — Contenido no enlazado

Web★★

Ninguna página enlaza /staff/, pero un diccionario común lo contiene:

kali@lab (salida real)
$ gobuster dir -u http://localhost:8181 -w /usr/share/dirb/wordlists/common.txt -q
backup               (Status: 308) [Size: 245] [--> http://localhost:8181/backup/]
staff                (Status: 308) [Size: 243] [--> http://localhost:8181/staff/]

Al visitar /staff/ aparece la flag GO{diccionario_encuentra_lo_oculto}.

Flag: GO{diccionario_encuentra_lo_oculto}

Lección: lo que no está enlazado sigue existiendo. El diccionario decide qué encuentras.

Reto 8 — De versión a CVE

Vulnerabilidades★★★

La cabecera Server anuncia Apache 2.4.49. Se busca en la base local de exploits:

kali@lab (salida real)
$ searchsploit apache 2.4.49
Apache HTTP Server 2.4.49 - Path Traversal & Remote Code Execution (RCE)   | multiple/webapps/50383.sh

La cabecera del fichero indica el identificador:

kali@lab (salida real)
$ head -8 /usr/share/exploitdb/exploits/multiple/webapps/50383.sh
# Exploit Title: Apache HTTP Server 2.4.49 - Path Traversal & Remote Code Execution (RCE)
# Date: 10/05/2021
# Version: 2.4.49
# CVE : CVE-2021-41773

Se introduce el CVE en el verificador (http://localhost:8181/verificador, sección del reto 8) y devuelve la flag:

kali@lab (salida real)
$ curl -s -X POST -d "cve=CVE-2021-41773" localhost:8181/cve
{"flag":"GO{de_version_a_cve}","ok":true}

Flag: GO{de_version_a_cve}

Lección: del banner al identificador CVE hay pocos pasos, pero en un caso real se verifica: la versión puede estar parcheada o el banner puede ser falso. Aquí, además, el banner es una cabecera configurada a propósito para el laboratorio.

Resumen

#TécnicaHerramienta
0Escaneo de puertos, versiones y UDPnmap
1Sondeo manual de servicio desconocidonc
2Script de enumeración webnmap http-enum
3Certificado TLSnmap ssl-cert
4Sesión nula SMBsmbclient
5SNMP con comunidad públicasnmpwalk
6Redis sin autenticaciónredis-cli
7Descubrimiento por diccionariogobuster
8Versión a CVEsearchsploit