HTB{FROLIC}

Como cada semana una máquina mas de Hack The Box ha sido dada de baja, para que otra la reemplace, en esta ocasión toca el turno a Frolic. 

Frolic, presentó un muy buen reto a pesar de que está catalogada inicialmente como fácil. Nada mas allá que lejos de la verdad... al menos para mi. 😅

Dicho lo anterior, comencemos con la reseña de este desafío.

Como cada equipo, comenzaremos con el escaneo de puertos que se encuentran abiertos



En este caso el primer puerto relevante es el 9999, al revisar el protocolo detrás del puerto se trata de un servicio web HTTP, por lo que podemos verlo desde un navegador. 


Abriendo el sitio, no despliega nada relevante de información salvo que se trata de un sitio con motor nginx. 

Así que lo siguiente a realizar es un dirbuster para revisar que otros directorios o archivos se encuentran sobre la aplicación principal. 



El resultado del dirbuster, nos revela varios directorios montados en la aplicación, de los mas relevantes para nuestro reto, están: 


  • admin
  • dev
  • backup


Así que comenzaremos revisando el contenido de /admin 



Vemos una pantalla de login con un mensaje algo sugerente..... 

Debido a que no funciona ninguna combinación de credenciales por defecto, revisamos el código fuente de la pantalla de login..  



Y al no haber mucho en este código, revisamos también los javascripts invocados, en particular el que tiene nombre login.js.




Bingo!!! Tenemos credenciales para autenticarnos en la ventana de login.... 



Ya una vez que ingresamos a la aplicación nos encontramos con el siguiente contenido


Como podrán observar en la imagen, parecerían un conjunto sin sentido de caracteres, ni siquiera algo similar a un cifrado o hash.... o al menos hasta consultar la enciclopedia de códigos de cifrado raros.  Vea la referencia aquí.

Básicamente lo que tuve que hacer en este paso, es agregar la palabra Ook antes de cada símbolo de puntuación, con lo cual el código anterior quedaba como algo de la siguiente manera: 



Ya con este texto como resultado, el siguiente paso es decifrar el mensaje que oculta, para realizar esto, tuve que apoyarme de la pàgina de DCODE y buscando el algoritmo con el mismo nombre. 



Pegando el código anterior en el recuadro de entrada, obtengo el siguiente texto: "Nothing here check /asdiSIAJJ0QWE9JAS"

Así que siguiendo la sugerencia, agregamos ese directorio en la barra del navegador... 



Y obtenemos.... otro código 😓.  Debido a que este reto en particular requirió decifrar multiples ocasiones un mismo código, encontré una herramienta en línea bastante útil para este tipo de tareas y que la verdad lo hace muy simple.  La página se llama CyberChef la cual como lo mostraré permite pasar múltiples códigos u operaciones sobre un mismo texto de entrada y en una sola pantalla. 

Regresando al reto, copié el texto contenido en la página anterior en la herramienta de CyberChef y pasé el mismo texto por dos procesos distintos. 


  • Quitar los espacios en blanco
  • Decodificar el texto en Base64


Como se puede apreciar en la imagen después de pasar por ambas operaciones me resulta un conjunto de bytes peculiar, puesto que los primeros 2 me indican que se trata de un archivo ZIP, lo anterior por el header (PK) que indica que el tipo de archivo es un archivo comprimido. 

Así que repito el proceso en una línea de comandos, para que pueda almacenar esos bytes en un archivo, comprensible por el sistema de archivos...



Y ya teniendo el archivo ZIP, trato de descomprimirlo, pero me pide contraseña, está protegido.... 



Así que ejecuto el comando fcrackzip para tratar de forzar la contraseña y EUREKA..



Ya con el password, pues obtengo el contenido del mismo, que se trata de un archivo con el nombre de index.php.

Así que veamos que contiene este archivo: 



Es en serio??? Otro código.... 

Regreso a la página de CyberChef y pego este texto, sólo que en esta ocasión ejecuto las siguientes operaciones sobre el mismo. 


  • Quito los espacios en blanco
  • Decodifico el texto en formato Hexadecimal
  • Decodifico Base 64 


 Y tenemos como resultado.....  Otro código 😒..  pero esta ocasión se ve más extraño, pero dado a que ya nos topamos con uno al principio del reto pues era de esperarse otro..... 

En esta ocasión el código con el que me topé es el Brainfuck , así que ya con el código identificado, regresé a la pagina de DECODE pero ahora con este algoritmo para decifrar. 

Así que como lo hice anteriormente, copio/pego el código y obtengo como resultado, el texto : "idkwhatispass"



El cual, claramente se trata de un password, pero, de qué??

Así que tras revisar mis posibilidades para usar esta contraseña, regresé a los resultados del dirbuster, y probé con el directorio /dev/backup 




Y en esta ocasión solo me muestra este texto "/playsms". 

Así que nuevamente agrego este directorio directo a la raíz de la aplicación en el puerto 9999.  


Y tenemos otra aplicación más.  Ingreso con el usuario admin y la contraseña adquirida del código anterior.... 


Y listo, ya tenemos acceso a la consola de la aplicación de PlaySMS, el siguiente paso es encontrar una vulnerabilidad que nos pueda servir para obtener un posible RCE o reverse shell. 

Y después de buscar, encontré la siguiente referencia de ExploitDB.


Esta vulnerabilidad explota una entrada en la función de importar contactos en la consola de administración por medio de un archivo en formato CSV con instrucciones que a su vez mandan llamar los parámetros del header de nuestra aplicación PHP. 

Este es nuestro archivo CSV


Y lo importé en el sistema por la función de "Importar contactos.."


Una vez importado el archivo a la consola, pongo el BurpSuite en modo proxy para interceptar la solicitud de la página web y así alterar el parametro USER-AGENT para ejecutar código en el servidor. 

Antes del cambio: 


Después del cambio: 

Como lo que voy a ejecutar se trata de un shell inverso, pongo a mi equipo atacante a la escucha de la solicitud. 


Permito que la solicitud con el parámetro modificado de USER-AGENT modificado se complete en el lado del servidor y obtengo una conexión de shell inversa en mi equipo atacante. 



Ya con esta conexión, simplemente busco la bandera del usuario.. 



Ahora vamos por la bandera de root

Para obtener la bandera de root, será necesario realizar un exploit para un archivo ejecutable que despliega un mensaje en pantalla, el exploit se realiza básicamente con un buffer overflow de una cadena de caracteres, como verán a continuación: 

El archivo ejecutable se encuentra en el siguiente directorio oculto .binary.


Debido a que para mi en lo personal fue un proceso un poco complicado, trataré de explicarlo en pocos pasos, espero me salga... 

Primero fue necesario saber que librerías estaban ligadas con este archivo, para lo cual ejecuté el siguiente comando: 


Aquí me dice que una de las librerías que están relacionadas es la libc.so.6 así que con esta información pude bajar un script para revisar las posiciones de memoria que esta librería ocupara para sus principales funciones de llamada, sistema y término de proceso. 

Para compilarlo es necesario ejecutar la siguiente linea de comandos: 

gcc libc-search.c -o search -lc -ldl

Ya con el archivo compilado, lo copio al servidor de Frolic y lo ejecuto sobre el archivo rop p
ara ubicar las secciones de memoria donde están las funciones relevantes.


Ya con estas instrucciones presentes puedo obtener también la dirección donde se encuentra
cargado el binario de /bin/sh.

search -p /bin/sh -b "libcstring"

Y ahora si ya tengo la siguiente información para formar la cadena que conformará mi exploit.

  • The exit address is: 0xb7e479d0
  • The system address is: 0xb7e53da0
  • The execve address is: 0xb7ec97e0
  • The /bin/sh address is: 0xb7f74a0b

Armando la linea de texto que generará el buffer overflow, quedaría de la siguiente manera 

python -c 'print "A"*48+"B"*4+"\xe0\x97\xec\xb7"+"\xc8\x97\xec\xb7"+"\x0b\x4a\xf7\xb7"+"\xe0\xf0\xfd\xbf"+"\xe0\xf0\xfd\xbf"'


Ejecuto esa instrucción como parámetro de mi aplicación original


Y finalmente obtengo la bandera de root.


De verdad no termino de entender como este reto terminó clasificado como fácil, puesto que la
verdad es que estuvo demasiado complejo, como lo pueden ver.

Sin embargo otro reto mas completado.

Espero lo hayan disfrutado tanto como yo. Hasta el siguiente reto. ✌


NOT BAD FOR A LAB RAT


Comentarios

Lo mas visto