Cheese
INFORMACIÓN SOBRE LA MÁQUINA
- Nombre: Cheese CTF
- OS: Linux
- Flag: User y Root
- Objetivo: Root
- Dificultad: Fácil
- Conocimientos usados: Inyección sql, enumeración, detencción de LFI y uso de xxd.
¡Hola a todos! Vaya, ha pasado... más de medio año... desde que he hice algo de provecho con este hobbie que tengo. Vaya... Como sea, he regresado y espero poder ser más activa. Regresando al punto, el día de hoy he decidido meterme a try hack me y hacer una máquina, esta vez la Cheese CTF. Así que sin más, vamos a empezar.
Cheese CTF
En esta ocasión decidí primero empezar viendo la página. Se ve como una simple página de quesos, nada muy interesante. Pero puedo notar algo, una sección de inicio de sesión (login) así que decido ver que hay por aquí.
Es un simple panel de loging, así que lo primero que intento hacer es hacer una inyección de SQL. Después de intentar con varias opcione, la que logró funcionar fue la siguiente: '||1=1-- -, ¿pero qué quiere decir esta expresión?
1
2
3
4
5
6
7
1) ' (comilla simple) - Intenta cerrar una cadena de texto en la consulta SQL original
2) || - Es el operador de concatenación en algunos sistemas SQL
3) 1=1 - Una condición que siempre es verdadera (esto es lo que nos confirma de cierta forma que nuestra condición es verdadera)
4) -- - Inicia un comentario en SQL, lo que hace que todo lo que viene después sea ignorado
5) - (espacio y guion final) - Asegura que haya un espacio después de -- para que el comentario funcione correctamente en todos los sistemas
Toda la expresión básicament dice: busca usuarios donde el username sea 'admin' O donde 1 sea igual a 1 (siempre verdadero) y comenta la petición de contraseña para que no la pida (para eso los --).
En el panel de administración no había nada interesante, literalmente todo estaba vació a excepción de este pequeño apartado de mensaje en dónde te manda a otra sección con este simple mensaje que dice ¡Mensaje!. Al momento de darle click, se ejecuta un script que te manda a otra sección con un simple mensaje que decía: “Si sabes, lo sabes”. Aquí no hay mucho que hacer.
Sin embargo, aquí fue dónde me percaté de algo super importante, y es que aquí justamente hay un ?file=php://, y si algo sé es que cuando vea algo parecido, debo testear si puedo hacer un Local File Inclusion. Pero, ¿qué es un Local File Inclusion? Local File Inclusion, o para los compas, LFI es una vulnerabilidad que permite a un atacante incluir archivos del servidor local a través de parámetros manipulables en la aplicación web. Para probar mi teoría, pongo un /etc/passwd y vaya, vaya, ¿qué tenemos aquí? Podemos ver el contenido del passwd, así que eso significa que podríamos mandarnos una reverse shell.
Intenté de varias formas, pero no me permitía lanzar la shell, así que después de investigar un poco me topé con esta herramienta de generador de cadenas de filtros PHP, pero para empezar, ¿qué es un filtro en php? Los filtros son transformadores de datos que PHP tiene integrados, usualmente php ejecuta las cosas sin mostrar nada, pero al usar filtros puedes ver ciertos procesos pasando por uno primero ya sea en base64 o hasta root. Con esto en mente, sin embargo el truco no está en estos sino en el iconv. Icov es una herramienta que convierte texto entre diferentes sistemas de codificación, cuando intentas convertir entre codificaciones incompatibles, iconv produce bytes basura, sin embargo se ha descubierto que cada combinación de codificaciones produce bytes específicos y predecibles cuando falla. La herramienta de Synacktiv toma los errores de icov que generan bytes basura y generar un byte del código.
Si quieres enter más, puedes ir a esta página web que explica justamente este tipo de ataque, el uso de icov y demás es simplemente automatización, si tienes tiempo, te recomiendo leerlo. Eso sí, está en inglés, pero nada que un traductor no pueda resolver.
Una vez adentro con la reverse shell, exploré el sistema (que era linux btw), y en el home del usuario me di cuenta de algo, y es que tenía las llaves de ssh activas y con permisos de lectura y escritura. Así que en teoría podría generar una clave pública de ssh y meterla en en el file de autorized keys para poder registrarme como dicho usuario sin la necesidad de tener que ingresar la contraseña.
Una vez con mi clave ssh en el archivo de las authorized files, solo debía conectarme con ssh ssh comte@[IP que te asigna thm] y con eso estábamos adentro, solo nos queda ver que dice a flag y tendríamos la primera parte lista. Awww, mira, tiene un quesito.
Ya con el usuario base, ahora tocaba ver como podíamos ascender hasta root. Aquí hay varias formas de hacerlo, pero para simplificar las cosas empecemos viendo sí podemos usar o lanzar cosas con SUID sin la necesidad de usar la contraseña, para eso podemos usar el siguiente comando: sudo -l. Aquí me topé con estos tres comandos que podía usar: deamon-reload, restart.exploid.timer, start exploid.timer y exploit.timer. Al inicio vi esto y pensé “¿y yo qué hago con esto? ¿Me lo como o qué?” Así que para que no te quedes como yo, una breve explicación de que hacen estas tres cosas:
Para empezar, estos son procesos del systemctl, que es el comando para controlar systemd, que es el sistema de inicialización y gestión de servicios en Linux moderno. Por ejemplo, cuando quieres iniciar un servidor apache usas ese comando, por ejemplo sudo systemctl start apache2. Ahora, estos comandos tienen acciones específicas. El daemon-reload recarga la configuración de systemd, detecta servicios/timers nuevos o modificados. Start exploit.timer como su nombre dice, activa/ejecuta el exploit.timer. Y por último el exploit.timer reinicia el timer (lo detiene y lo vuelve a iniciar).
Así que sin más, uso el nano (que milagrosamente está instalado en el sistema) y simplemente edito el exploid.timer para que corra cada 5 segundos, ya que no tenía tiempo de ejecución (por lo tanto, no se ejecutaba). Con esto listo, solo debo emepzar los comandos de nuevo para que se recargue y hay algo curioso cuando el exploid.timer corre le da permisos a la herramienta de xxd de root. Así tras una pequeña búsqueda sobre como usar el xxd para subir de privilegios o al menos explotar dichos privilegios mediante xxd, descubrí lo siguiente:
1
2
3
sudo install -m =xs $(which xxd) .
LFILE=/root/root.txt
./xxd "$LFILE" | xxd -r
Con esto en mente, lo que hice fue ir al directorio de otp, escrbir el comando xxd para que que se genere un file ahí, después escribí el comando que ya les había mostrado arriba en mi terminal para poder leer, la flag del root. Pero antes, ¿cómo es que xxd nos funciona para hacer dicha operación? El xxd es una herramienta de Linux que crea un hexdump (volcado hexadecimal) de archivos. Básicamente, convierte archivos binarios a formato hexadecimal legibles. Al momento de usar el primer comando s/xxd "$LFILE2 lee estamos diciendo al xxd que lea el /root/root.txt, pero por sí solo nos mostraría solo el contenido en hexadecimal, pero si usamos una pipe y le agregamos el xxd -r, entonces no los decodifica y nos muestra el texto en lenguaje legible. Lo que nos da lo siguiente
¡Y listo! ¡Hemos completado la máquna! Hace meses que no tocaba una de estas y si sentí que tardé bastante, pero nada que un poco de práctica no solucione. En fin, espero volver a ser más activa. Ahora les dejo los comandos principales que usé en esta máquina, si notan no usé ni nmpa ni nada por el estilo porque todo se pudo hacer online, además de que cuando corrí el nmap tenía más de 500 puertos abiertos y dije “nel”, así que decidí solo irme por la página y explicar todo lo demas. Ahora sí, los comandos principales:










