Writeup — Helios Systems
Las salidas son reales, capturadas contra el contenedor desplegado.
Fase 0 — Descubrir y perfilar
$ 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-altLos 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:
$ 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.
$ 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:
$ 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):
$ 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$ 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:
$ 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:
$ smbclient -L //localhost -p 4445 -N
Sharename Type Comment
--------- ---- -------
publico Disk Documentos compartidos del departamento
IPC$ IPC IPC Service (Servidor de archivos Helios)$ 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:
$ 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★
$ redis-cli -p 6380 keys '*'
nota
flag$ 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:
$ 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:
$ searchsploit apache 2.4.49
Apache HTTP Server 2.4.49 - Path Traversal & Remote Code Execution (RCE) | multiple/webapps/50383.shLa cabecera del fichero indica el identificador:
$ 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:
$ 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écnica | Herramienta |
|---|---|---|
| 0 | Escaneo de puertos, versiones y UDP | nmap |
| 1 | Sondeo manual de servicio desconocido | nc |
| 2 | Script de enumeración web | nmap http-enum |
| 3 | Certificado TLS | nmap ssl-cert |
| 4 | Sesión nula SMB | smbclient |
| 5 | SNMP con comunidad pública | snmpwalk |
| 6 | Redis sin autenticación | redis-cli |
| 7 | Descubrimiento por diccionario | gobuster |
| 8 | Versión a CVE | searchsploit |