Lfi.elf
Máquina de dificultad difícil de la plataforma Dockerlabs
Comprobación
En el día de hoy traigo el writeup de la máquina lfi.elf por lo que vamos a comenzar creándonos un directorio con el nombre de la máquina y desplegando la función “maquina”, la cual está definida en nuestra zshrc

Una vez que tenemos los tres directorios de trabajo nos vamos a meter en “reconocimiento” y vamos a comprobar si podemos ver la máquina víctima a través de una traza icmp

Podemos observar que vemos la máquina sin problema y también que parece ser que estamos ante una máquina linux, debido al ttl
En una máquina linux el ttl suele ser 64 mientras que una máquina windows suele ser 128
Una vez que hemos comprobado que podemos ver la máquina vamos a empezar con el escaneo de puertos
Escaneo de puertos
El primer escaneo que vamos a hacer va a ser para detectar qué puertos están abiertos en la máquina víctima

Con el parámetro -sS indicamos que no queremos que se efectúe un three-way handshake lo que nos va a dar más agilidad, además le vamos a indicar que no queremos que la herramienta vaya a menos de 5000 paquetes por segundo (-min-rate 5000), que no queremos que nos haga resolución dns (-n) y que no queremos que se realice el descubrimiento de hosts mediante ARP (-Pn) por último queremos que todas las evidencias que saque nos las guarde en el archivo “puertos_” en un formato especial
Este es el contenido del archivo “puertos_”

Ya que hay mucho ruido, vamos a extraer la información más relevante con nuestra herramienta portsClean.sh

Así es como nos representa la información, de esta manera podemos verla mucho más clara
Ahora que sabemos que el puerto 80 está abierto toca determinar qué servicios y versiones están corriendo para este puerto por lo que vamos a volver a utilizar nmap pero de manera distinta

Con este escaneo estamos haciendo dos cosas, la primera es lanzar unos scripts básicos de reconocimiento que tiene nmap previamente programados en lua(-sC) y por otro lado estamos determinando qué versión corre para el servicio que está ocupando el puerto 80(-sV) todo esto nos lo está exportando en formato nmap al archivo “versiones”

Esto es lo que nos ha reportado el escaneo, tenemos que es un servidor Apache y el título de la página que es “CTF LFI.elf”
PD: En el cat he puesto “-l java” especificando que esto es java aunque no lo sea para que me lo represente en colores, esto se puede hacer ya que mi cat es un alias de bat
Genial pues ahora que sabemos que lo que está corriendo por detrás del puerto 80 es un servidor web vamos a realizar las dos operaciones que siempre hacemos cuando vemos que hay un servidor web
La primera de todas es determinar qué tecnologías están corriendo para este servidor web con whatweb

No nos está reportando mucha más información de la que ya sabíamos por lo que vamos a realizar la otra operación que es ejecutar un script que viene cuando instalas nmap que es “http-enum” el cual funciona como un pequeño fuzzer


Podemos ver que nos ha reportado algunas rutas de la página web como “login.php” y un directorio “pages” por lo que vamos a ir a la web para ver qué nos encontramos
Pero antes por si a alguien le interesa, esta es la ruta donde reside el script “http-enum” que he utilizado

Web
Esto es lo que nos encontramos cuando ingresamos a la web

Después de revisar la web, no tiene nada para poder explotar ni la web ni las rutas ocultas que nos había reportado nmap, por lo que vamos a realizarle un fuzzing un poco más profundo para ver si sacamos más rutas


Vemos que hay una ruta que tiene buena pinta, “secret.txt”
Dentro del archivo podemos ver lo siguiente

El mensaje dice que tenemos que buscar más dentro de la página, por lo que vamos a ver si en el “index.php” hay algún parámetro con el cual podamos apuntar a algún fichero interno de la máquina
Vamos a ir probando con palabras del rockyou.txt para ver si alguna nos permite apuntar al /etc/passwd


Podemos ver que el parámetro “search” nos da un resultado en cuanto a tamaño distinto a los demás, ahora vamos a comprobar si realmente nos permite apuntar al /etc/passwd
Para comprobarlo vamos a interceptar la solicitud con burpsuite y vamos a tratarla desde ahí

Genial pues ahora que tenemos la solicitud en burpsuite podemos operar más cómodos, vamos a comprobar si realmente el parámetro “search” nos devuelve el /etc/passwd


Podemos ver que sí que nos devuelve todo el contenido del archivo /etc/passwd por lo que aquí ya hemos explotado un LFI (Local File Inclusion) por lo que a partir de aquí tenemos que intentar conseguir un RCE
Vamos a empezar intentando a través de wrappers obtener el código php del archivo index.php para ver cómo está hecho por detrás esta página


Con este wrapper evitamos que el contenido de la página web se interprete directamente y conseguimos que se muestre codificado en Base64 para poder extraer la cadena y decodificarla en nuestra máquina

Aquí podemos observar el contenido del index.php el cual si el parámetro “search” está vacío nos carga la página “home.php” y si no está vacío nos carga el archivo que le indiquemos
Esto lógicamente es vulnerable a LFI ya que no valida que el archivo que está cargando sea un archivo permitido o no por lo que pueden ser archivos internos del sistema
Ahora que sabemos cómo está programado el index.php por detrás vamos a intentar ganar acceso a la máquina utilizando la herramienta php filter chain generator
Esta herramienta nos va a permitir inyectar código php que queramos al parámetro vulnerable a lfi, con el objetivo de poder ganar acceso al sistema
Le vamos a pasar la instrucción que queremos que se interprete en el servidor

Al ejecutar el script nos devuelve una cadena enorme como esta

Esta cadena la vamos a introducir en el parámetro vulnerable a LFI y añadimos en la solicitud el parámetro cmd, el cual va a contener el comando que será procesado

Al enviar todo esto al servidor, obtenemos la siguiente respuesta

Podemos ver que se nos ha ejecutado el comando y nos ha devuelto www-data
Antes de seguir quiero explicar por qué se hace esto con el script en python y por qué funciona
El script recibe una cadena que contiene código php y la transforma mediante una serie de conversiones y filtros propios de php. El objetivo de hacer esto es generar una cadena que esté codificada y que al ser interpretada por el servidor a través de estos filtros, nos permita reconstruir el contenido para ser interpretado
Una vez que hemos explicado esto, volvamos con la máquina
Como lo que queremos es ganar acceso a ella, vamos a montarnos un script en bash con una reverse shell

Ahora que lo tenemos montado vamos a ofrecer este archivo a nivel de red con python a la vez que nos ponemos en escucha por el puerto 1212

Una vez que tenemos esto montado vamos a descargarnos el contenido del archivo reverse.sh y a ejecutarlo en la máquina víctima desde el parámetro que hemos creado

De esta manera hemos podido ganar acceso a la máquina

Antes de pasar a escalar privilegios vamos a hacerle un tratamiento a la tty para que no se nos muera si hacemos ctrl+c
Primero de todo creamos una nueva pseudo-terminal limpio

Después paramos este proceso con ctrl+z y ajustamos los modos tty y volvemos al proceso

Reiniciamos la xterm con “reset xterm” y por último exportamos una xterm

Para dejar la sesión perfecta vamos a ajustar el ancho y largo ya que al ejecutar nano lo vemos de la siguiente manera

Por lo que con el comando “stty size” en una ventana nueva vemos las proporciones de nuestra consola y con el comando “stty rows x columns y” las seteamos en nuestra nueva sesión

Ahora que ya tenemos todo listo, comenzamos con la escalada de privilegios
Escalada de privilegios
En la máquina al irme al directorio “home” veo que hay un directorio de un usuario “lin” al cual vamos a intentar escalar
Buscando, en el directorio /var/www vi lo siguiente

Un directorio oculto llamado “.secret_www-data” el cual contenía un archivo y otro directorio oculto “.passwd”
Ahí pude ver la contraseña del usuario lin

Genial pues ahora que estoy como el usuario lin puedo ver su directorio
Dentro veo que está la flag y un script sistem.py

Si intento ver si puedo ejecutar algún binario o script como root me dice que “No tienes permisos para listar comandos disponibles”
Este es el contenido del script system.py

La librería “subthreads” me ha llamado la atención ya que no suele ser una librería común
Al buscar por la librería en el sistema he encontrado este script


Al ver el contenido me he dado cuenta de que estaba ejecutado el binario sudo sobre un script con nombre “script.sh” ubicado en el directorio /tmp por lo que he ido a ver qué es lo que contenía este
El directorio /tmp no tiene ningún ejecutable llamado script por lo que aquí es donde veo oportunidad de poder crearlo yo para escalar privilegios a root
Este es el contenido del script que he creado

Ahora ejecutamos el script

Podemos ver que ahora el binario que nos proporciona la bash tiene permisos SUID lo que quiere decir que podemos ejecutar una bash como el usuario root ya que es el propietario de este binario

-p <- con esto le estamos indicando que queremos preservar sus privilegios
Ahora podemos ver la flag del usuario root

Este es el final de la máquina, un saludo :)