Scape Room: diseñando una cadena de fallo con presión, pistas y preloading
Una cadena de fallos que parecen inconexos pero se empujan unos a otros, de una pista en las cabeceras HTTP a una biblioteca precargada con la clave de root.
Avanzado · Linux
URL del reto: labs.thehackerslabs.com/machines/80
Por qué la diseñé
Scape Room es una cadena de fallos que parecen inconexos pero se empujan unos a otros, desde una pista filtrada hasta un secreto donde nadie mira, un automatismo que se puede activar y un mecanismo de carga que rompe la confianza del host. La monté para que el valor estuviera en entender por qué cada pieza encaja con la siguiente, más que en llegar a root.
Le puse nombre de escape room a propósito, por la presión, las señales pequeñas y la obligación de separar el ruido de la pista que sirve. Así se lee mejor la superficie de exposición, que es como cae la mayoría de sistemas, por varias decisiones pobres encadenadas y no por un solo fallo crítico.
La máquina de un vistazo
Deja expuestos tres servicios, SSH, HTTP y MySQL, sin nada de relleno. La cadena arranca en una pista escondida en las cabeceras HTTP, pasa por un subdominio oculto, unas credenciales metidas en los metadatos de una imagen y un evento de MySQL que se puede encender, y termina en una biblioteca precargada con la clave de root.
Cómo la monté, paso a paso
Tres puertos y ni uno de relleno
Expuse solo SSH, HTTP y MySQL. No quería esconder la máquina detrás de una enumeración interminable ni inflarla con servicios que no pintan nada. El aprendizaje está en interpretar bien tres puertos, no en encontrar veinte.
La primera pista, en las cabeceras HTTP
En la web dejé dos cabeceras fuera de lo habitual, X-Hint y X-Contact. La primera lleva a un subdominio que hay que resolver a mano (info.sensores.thl), y en su código fuente escondí un comentario en Base64 con una pista narrativa. Quería que se viera cómo la información que hunde un sistema rara vez está en la funcionalidad visible. Casi siempre está en metadatos, cabeceras y comentarios que el equipo da por inofensivos.
El secreto en los metadatos de una imagen
- Generé la imagen del panel de sensores.
- Codifiqué en Base64 las credenciales del usuario
acute. - Las incrusté en el comentario EXIF de la imagen. Un
exiftoollas descubre.
Lo escondí ahí para que quien resuelve trate los ficheros auxiliares, imágenes, documentos, artefactos de despliegue, como parte del perímetro. Esa frontera no existe. Todo lo que se publica cuenta.
El automatismo de MySQL que se puede encender
Con esas credenciales se entra a MySQL. Dentro dejé un evento programado deshabilitado. Al activarlo (ALTER EVENT insert_login_data ENABLE), la tabla login empieza a generar credenciales y desde ahí se recupera la contraseña del administrador, cifrada con una clave que vive en el propio entorno.
Un servicio expuesto no siempre se rompe atacando el motor. A veces basta un automatismo inseguro que ya estaba ahí. Un evento o un job se dan por confiables porque existen, y en cuanto alguien los puede activar o reconfigurar, dejan de ser automatización y pasan a ser mecanismo de abuso.
La pista de preloading, escondida en un GPG
Puse un leeme.txt.gpg protegido con una passphrase débil, de las que caen con rockyou. Dentro no hay ninguna instrucción literal, solo una pista sobre pre-carga. Con esto quería girar la mentalidad de buscar secretos hacia entender cómo resuelve el sistema sus dependencias y quién controla ese proceso. No todo privilegio se gana explotando un SUID o un sudoers mal puesto.
El corazón del fallo, una biblioteca precargada con la clave de root
El fallo central lo metí en /etc/ld.so.preload, que fuerza a cargar /lib/libscaperoom.so en cada proceso. Dentro de esa biblioteca, en la sección .rodata, dejé la contraseña de root en claro. Un readelf la saca y con ella se pasa a root.
Cuando el sistema carga una biblioteca de forma global, extiende su superficie de confianza a todo el host. Si esa pieza guarda lógica sensible o secretos, el problema deja de estar acotado a una aplicación y contamina el comportamiento del sistema entero. Es una exageración de algo que pasa fuera del laboratorio, cuando se esconde lógica crítica en componentes compartidos.
Qué quería enseñar
Scape Room premia leer cómo se conectan una filtración de contexto, un secreto expuesto, un automatismo inseguro y el abuso de un mecanismo global de carga. Aquí la fuerza bruta y la intuición a ciegas no llevan a ningún sitio.
| Fase | Qué enseña | Error que representa |
|---|---|---|
| Cabeceras HTTP y subdominio | La superficie útil no está solo en la app visible | Pistas operativas filtradas en metadatos y cabeceras |
| Metadatos de la imagen | Los archivos publicados son parte del perímetro | Secretos embebidos en recursos auxiliares |
| Evento de MySQL | Un servicio expuesto puede ser punto de control | Automatismos mal gobernados |
| Passphrase del GPG | El acceso entrega la siguiente pista, no el final | Secretos débiles y exportables |
ld.so.preload | La confianza global del host se puede romper por diseño | Bibliotecas precargadas usadas sin criterio |
La lección que quería dejar es sencilla. Una intrusión que llega lejos rara vez depende de una bala de plata. Avanza porque varias capas comparten el mismo problema de fondo, decisiones tomadas sin pensar cómo se comportan cuando alguien observa, correlaciona y reutiliza lo que encuentra.