Soccer
Last updated
Last updated
Publicado: 12 de Mayo de 2025 Autor: José Miguel Romero aKa x3m1Sec Dificultad: ⭐ Easy
Soccer es una máquina Linux de dificultad Easy que presenta múltiples vectores de ataque interesantes. La explotación inicial se basa en el descubrimiento de un Tiny File Manager vulnerable alojado en un directorio oculto, el cual utiliza credenciales por defecto. Aunque los exploits públicos fallan debido a restricciones de permisos, es posible aprovechar la funcionalidad nativa del file manager para crear y modificar archivos PHP, permitiendo la ejecución de una reverse shell.
La escalada horizontal involucra el descubrimiento de un segundo vhost mediante enumeración de configuraciones de nginx. Este nuevo sitio web contiene una aplicación con funcionalidad de tickets que es vulnerable a SQL Injection ciega a través de WebSockets, lo que permite extraer credenciales de la base de datos usando sqlmap.
Finalmente, la escalada de privilegios se logra mediante el binario doas (alternativa a sudo) que permite ejecutar dstat como root. Aprovechando la capacidad de dstat para cargar plugins de Python personalizados desde directorios escribibles, es posible ejecutar código arbitrario con privilegios de root.
Esta máquina es excelente para practicar técnicas de enumeración web avanzada, explotación de file managers, SQL injection en protocolos no convencionales y escalada de privilegios mediante binarios menos comunes.
💡 Nota: El TTL cercano a 64 sugiere que probablemente sea una máquina Linux.
⚠️ Importante: Detectamos durante la fase de enumeración con nmap que se está realizando virtual hosting. Debemos añadir el siguiente vhost a nuestro fichero /etc/hosts
http://soccer.htb/
A priori no tenemos gran cosa, realizamos fuzzing web usando la herramienta gobuster:
Gobuster nos revela un recurso poco convencional:
Cuando intentamos acceder, nos redirige automáticamente a un sitio web que está utilizando un servicio llamado tiny file manager y nos encontramos ante un panel de autenticación.
Buscamos y probamos credenciales por defecto de este servicio
En el sitio web https://exploit-notes.hdks.org/exploit/web/tiny-file-manager-pentesting/ encontramos credenciales por defecto para este servicio:
![[Pasted image 20250527123255.png]]
Logramos entrar y enumeramos la versión del servicio:
Parece que esta versión es vulnerable y existen algunos exploits públicos:
https://github.com/febinrev/tinyfilemanager-2.4.3-exploit
Descargamos la versión en python de este exploit: https://github.com/febinrev/tinyfilemanager-2.4.3-exploit/blob/main/tiny_file_manager_exploit.py
Este exploit no nos funciona porque el directorio /var/www/html/tiny no tiene permisos de escritura y no nos permite subir ahí el payload
Tampoco nos funciona si intentamos incrustar una webshell php dentro del codigo tinyfilemanager.php:
Probamos con este otro exploit:
Obtenemos el mismo error, no tenemos permisos para subir nada a la ruta por defecto:
Cambiemos el enfoque, el file manager de tiny nos da la opción de copiar y mover archivos y directorios. Vamos a usar la utilidad Copy para crear una copia de tinyfilemanager.php de la siguiente forma:
A continuación renombramos el archivo a shell.php, le damos permisos de ejecución (que de inicio no los tiene) y reemplazamos el código por el de una reverse shell php de pentestmonkey:
Ahora solo nos queda iniciar un listener y cuando hagamos click en Open ganaremos una reverse shell
Una vez dentro de la máquina, vamos a busca archivos de configuración de nginx por si pudiera haber otros vhosts alojados:
Localizamos la instalación de nginx en /etc/nginx y en su interior está el archivo nginx.conf
Este archivo nos indica que la configuración de los vhosts está definida en estos otros archivos:
Descubrimos un nuevo subdominio:
Lo añadimos en el fichero /etc/hosts de nuesto host de ataque y accedemos:
http://soc-player.soccer.htb/
La web tiene un formulario de registro, nos registramos usando las siguientes credendiales:
Al acceder con nuestra nueva cuenta, tenemos una sección de tickets:
Revisando el código fuente de la página encontramos un script que indica la petición que se está realizando mediante websocket:
Al jugar con el formulario de tickets tenemos un error de ticket no existe:
Vamos a ver con Burp como se está enviando esta petición y manipularla para ver si es vulnerable a SQLI y en efecto lo es, ya que logramos que nos diga que el ticket es válido.
Usamos sqlmap de la siguiente forma para automatizar la blind sqli injection:

Relizamos un dump de la base de datos soccer_db
Ahora ya podemos capturamos la flag en el directorio del usuario player.
Enumeramos binarios con SUID:
De la lista, hay varios binarios con bit SetUID, pero el que se parece más a sudo
y no es sudo
es:
🔸
/usr/local/bin/doas
doas
?doas
es una alternativa a sudo
que permite ejecutar comandos como otro usuario (normalmente root).
Se originó en OpenBSD y algunas distros de Linux lo usan como una alternativa más simple y segura que sudo
.
Al tener el bit SetUID, puede ejecutarse con privilegios elevados, igual que sudo
.
Si está configurado correctamente (en /etc/doas.conf
) y tu usuario tiene permiso, deberíamos obtener algo como:
Dstat es una herramienta para generar estadísticas de recursos del sistema. Su manual ofrece información interesante, especialmente la posibilidad de usar complementos de Python para la herramienta.
Si podemos ejecutar código Python como usuario root, podríamos generar un shell con los privilegios elevados intactos. Aunque los complementos de dstat solo se pueden alojar en ciertos directorios, tenemos acceso de escritura a uno de ellos: /usr/local/share/dstat. Esto significa que potencialmente podemos explotar este acceso para ejecutar código arbitrario como usuario root.
Creamos un script de Python que genera un shell bash y lo guardamos en el directorio mencionado anteriormente, asegurándonos de anteponerle dstat_, según el manual.
Para verificar que dstat detecte el complemento, ejecutamos el comando con el indicador --list.
Finalmente, después de confirmar que nuestro complemento es detectado, ejecutamos dstat y especificamos el complemento pasándolo como un argumento de línea de comando, usando un prefijo --.
Obtenemos un nombre de usuario y una contraseña. Anteriormente enumeramos dos usuarios en el directorio /home de la máquina que habíamos comprometido y uno de ellos era player, podemos ver si el usuario está reutilizando la contraseña para varios servicios.