Road to HackMex: Dia 3 - Confuser
Writeup: confuser - EchoCTF
Información General

Descripción de la máquina
Do not believe anything this system has to say, it tries to confuse you.
Enumeración
Escaneo Inicial
Corremos nmap y lo único que nos tiene es que hay un servicio http en el puerto 80 y un ssh en el puerto 20 respectivamente.
Nos conectamos al servicio http con nuestro navegador para ver qué hay y encontramos una página con un gestor de archivos simple. Al cual podemos subir y descargar cosas, pero por el momento está vacío.
Las versiones de SSH y HTTP no son vulnerables, entonces veremos qué pasa con este servicio de explorador de archivos, ya que por aquí debe de estar la vulnerabilidad
Análisis de Servicios
El servicio de subida de archivos es un Responsive File Manager en su versión 9.9.5 por lo que podemos encontrar en la página de información del servicio mismo que nos da.

Antes de intentar nada, podríamos comenzar a buscar vulnerabilidades una vez teniendo el nombre del servicio, para ver si hay algún CVE ya conocido que nos pueda ayudar.
Explotación
Busqueda de vulnerabilidades
Y efectivamente, si buscamos el servicio nos sale un exploit para remote command execution. El cual no nos pide requisitos adicionales, por lo que podríamos intentar correrlo de una vez para ver q pasa.

Intentos de explotaciones
Si intentamos correr el exploit recién salido de la caja no funcionará, y nos tirará errores relacionados con sitios y archivos no encontrados, entonces hay que bajar al código a ver qué es lo que pasa.
Bajando al código y comparando los endpoints que busca con los endpoints que tenemos en la máquina nos podemos dar cuenta del error:
El exploit espera que el servicio viva bajo /filemanager, mientras que la realidad en la máquina es que el servicio vive bajo /plugins/filemanager, por lo que debemos de corregir todas las rutas para que el exploit obedezca a la estructura real de la máquina.

Explotación
Una vez hecha la corrección, podemos correr el script y nos dará la shell directamente, haciendo de este uno de nuestros footholds más fáciles hasta el momento

Y de hecho en este screenshot podemos ver arriba del intento exitoso el error que tira el exploit cuando intentamos correrlo sin realizar las correcciones correspondientes, para q me crean jaja

El exploit nos va a dar una shell interactiva desde la cual de buenas a primeras podemos ya sacar la bandera de /etc/passwd y la bandera de env; pero lo fuerte es que también es capaz de darnos nuestra shell con netcat.
Ponemos nuestro netcat en escucha y corremos el comando y ya estufas, oficialmente we're in
Escalación de Privilegios
Análisis
Una vez dentro, podemos hacer varias cosillas, pero algo que he aprendido estos días es que es un buen hábito rifarnos un sudo -l al inicio para ver si de pura casualidad tenemos algun binario que podamos ejecutar como sudos desde un inicio.

Y efectivamente, podemos ejecutar confuser como sudo y sin contraseña, entonces invertiremos nuestros esfuerzos en esto.
Antes de continuar, también prestemos atención a que sudo nos dice que nuestros permisos tienen habilitado el parámetro env_reset, lo que nos indica que cualquier comando que ejecutemos como sudo, se va a ejecutar con un entorno limpio, dropeando todos nuestros cambios en variables de entorno. Esto será importante para más adelante, así que guarda este dato en lo más preciado d tu memoria.
Además, si analizamos los permisos de este binario, nos daremos cuenta de que además de que lo podemos correr como sudo, también tiene SUID, esto será muy importante próximamente, pero primero veamos qué es lo que hace.

Inicialmente lo intenté correr para ver q pasaba y "rompió" mi shell lol, así que saqué las armas pesadas y lo decompilé con Ghidra. Esto fué como matar una mosca a escopetazos pq no me reveló otra cosa más que mi estupidez.
int32_t main(int32_t argc, char** argv, char** envp)
{
setegid(0, seteuid(0, argv));
setuid(0);
setgid(0);
int32_t rax_4 = system("/bin/ls -alR && getpcaps");
if (rax_4)
printf("Command execution failed or retu…", rax_4);
else
printf("Command executed successfully.");
return 0;
}
En realidad no rompe la shell JAJAJA, lo único que hace "a grosso modo" es ejecutar el siguiente comando con privilegios de administrador
/bin/ls -alR && getpcaps
Y la razón por la que pensaba que rompía mi shell es porque siempre se me olvida darle un tamaño de rows y columns, lo cual provocaba su eventual muerte después de unas cuantas líneas.
Esto entonces ya nos abre la puerta a dos cosas:
Si vamos apurados, con este comando podemos reclamar de una vez la bandera de /root/ETSTCF_CENSURADO simplemente corriendo confuser desde la raíz y filtrando su salida para que solo nos muestre los contenidos de /root. Podemos hacer esto porque está corriendo ls de manera recursiva.
Como este binario es tanto "sudoeable" como con SUID, entonces, si lográramos hacer algo con su ejecución podríamos escalar privilegios desde aquí.
Explotación
Lo primero que se me vino a la mente fue secuestrar alguno de los dos comandos ejecutados por este binario, pero desafortunadamente no tenemos los permisos para modificar ninguno de los dos.
Luego, me puse a pensar en que no era necesario secuestrar los comandos originales, si podemos simplemente cambiar el PATH para que no los priorice, y en su lugar llegue a sustitutos que nosotros habremos colocado de manera mañosa.
Probaremos con getpcaps porque es con el que menos perdemos si logramos sustituirlo (en la máquina anterior sustituimos ls y no estuvo tan rico jajaj)
Entonces crearemos un script ejecutable en /tmp/getpcaps el cual contendrá lo siguiente:
#!/bin/bash
chmod u+s /bin/bash
Y lo que hará será darle SUID a /bin/bash, para poder levantar nuestra shell de admins así nomás, sin tanto mole pa no opacar el arroz.
Luego de eso, agregaremos /tmp a nuestro PATH con
export PATH=/tmp:$PATH
Y le damos prioridad principal, de esa forma al llamar getpcaps desde dentro del comando, idealmente nuestro script secuestrará el comando.
Ahora, aquí hay algo importante, y es que recordemos que confuser tiene dos formas de ser corrido como root:
- Con nuestra capability que vimos en sudo -l
- Con el bit SUID que tiene
Si intentamos correr confuser con la capability, nos encontraremos con el problema de que el comando correrá con un env limpio, entonces nuestro cambio al PATH no será efectivo.
Por el contrario, si corremos confuser con el SUID (sin meterle sudo al inicio) entonces el cambio que hicimos a PATH se conservará y nuestro script habrá secuestrado el comando getpcaps exitosamente.

Con esto ya estaremos halfway through, pues lo único que nos hace falta es correr /bin/bash. Pero aquí hay algo importante, y es que deberemos correr /bin/bash con el parámetro -p para que no dropee la UID que le acabamos de dar. Una vez hecho esto, oficialmente somos roots

De aquí, si has seguido mis indicaciones de flags, solo te hará falta la de /etc/shadow.
headshot