Imagery

Enumeration
Vamos a empezar un escaneo nmap:
Vamos a realizar un segundo escaneo para identificar el servicio y versión de los puertos:
Obtuvimos la siguiente información:
22/tcp-> OpenSSH 9.7p18000/tcp-> Werkzeug httpd 3.1.3
Estamos ante un servicio con python. Podríamos estar ante un SSTI.
Vamos a ver la aplicación web:

Vemos que es una web donde podemos guardar nuestras imágenes. En el header vemos que podemos iniciar sesión y registrarnos. Vamos a crearnos una cuenta:

Vamos a iniciar sesión:

Vemos ahora que tenemos una nueva función llamada Gallery donde nos da un mensaje de que no hay imágenes subidas que podemos subir alguna, vamos a probar:


Si desplegamos la sección My Images veremos lo siguiente:

Vemos la imagen.
Se puede probar a intentar un File Upload, pero sin éxito alguno.
En los 3 puntos de la imagen podremos encontrar lo siguiente:

Pero vemos que tenemos varías opciones deshabilitadas, si intentamos darle nos sale el siguiente mensaje:

Vemos que esta en desarrollo.
Viendo la web encontré lo siguiente en el footer:

Vamos a ver que podemos hacer con ello:
Shell as web
Cross-Site Scripting (XSS)
Vamos a enviar un reporte al azar:

Vemos que este bug va a ser revisado por un administrador. Esto me llama la atención ya que si algún campo del formulario es vulnerable a un XSS podremos robarle la Cookie de sesión al administrador. Vamos a comprobar enviandonos una solicitud con fetch a un servidor nuestro:
Máquina kali:
Payload:
En este caso las etiquetas <script> no funcionan, así que empleamos otros métodos como por ejemplo usando atributos de otras etiquetas que permitan ejecutar código JavaScript.
En donde pone form_camp pondremos el nombre del campo, esto nos ayudará a identificar donde está el campo vulnerable:

Enviaremos el reporte y esperaremos:
Funcionó!! Vemos que la recibimos una única solicitud donde indica /details esto nos da a entender que el campo vulnerable es Bug Details , ahora vamos a modificar el payload para que nos de su cookie (document.cookie):

Obtuvimos la cookie del usuario administrador!! Ahora vamos a remplazar nuestra cookie por la suya:

Remplazamos el valor por el obtenido:

Ahora recargamos la web:

Funcionó!! Vemos que ahora en el header tenemos una nueva sección llamada Admin Panel. Vamos a acceder a ella:

Vemos la sección de reportes donde es vulnerable y una sección llamada User Management, vamos a darle al botón Download Log:

Nos descarga un Log del usuario admin, vamos a ver su contenido:
Hmm no vemos gran cosa. Lo que si me ha interesado es saber de donde se saca este recurso, así que interceptaremos la descarga con BurpSuite y la enviaremos al Repeater:

Local File Inclusion (LFI)
Si nos fijamos el parámetro log_identifier está apuntando a un .log existente en el servidor, podríamos probar un LFI:

Funciona!! Estamos ante un LFI. Ahora podríamos enumerar un poco el sistema enumerando el directorio /proc/self :
/proc/self/environ:

Interesante el PATH , vemos que en el home del usuario web hay otra carpeta llamada web , donde apunta a un entorno virtual en python env . Podríamos intentar a apuntar al app.py (normalmente se les llama así a las webs hechas en algún framework de python):

Obtuvimos el código fuente de la aplicación!! Vamos a leerlo
App Source Code
Si leemos el código vemos que en el principio importa varios archivos, el que me ha llamado la atención es from config import * , vamos a ver si podemos leer el config.py :

Bien!! Vemos en las primeras lineas que define una variable llamada DATA_STORE_PATH donde apunta a un db.json , vamos a intentar leerlo:

db.json
Vemos el usuario testuser@imagery.htb y si contraseña encriptada, por la apariencia parece MD5. Vamos a probar a descifrarla con Crackstation:

Obtuvimos las credenciales del usuario testuser !! Vamos a iniciar sesión:

Ahora vemos que tenemos una nueva sección que es Manage Group . Antes de probar cualquier cosa ahí voy a ver si las funciones que estaban en desarrollo al ser el usuario testuser las tenemos habilitadas, así que vamos a subir una imagen:

Vemos que podemos usarlas, vamos a probar alguna e interceptarla con BurpSuite para estar controlando todo lo que suceda en la aplicación:



Sabiendo este funcionamiento me llama la atención como lo realiza. Con el LFI que tenemos vamos a buscar algún archivo que cuadre su nombre con esa funcionalidad:
Vamos a leer el archivo api_edit.py :
Leyendo el código podemos ver la función que empleamos:
Vemos que recoge nuestros parámetros x,y,width,heaight y luego usa imagemagick para cambiar el tamaño y luego ejecuta el comando. No vemos ningún tipo de sanitizacion. Así que vamos a probar a colar un ping :

Vemos que funcionó!! Vamos a darnos una reverse shell:

Estamos dentro!!
Shell as mark
Si leemos el /etc/passwd veremos que existe otro usuario:
Vamos a enumerar el sistema. Para ello emplee Linpeas. Una vez finalizado el escaneo me llamo la atención lo siguiente:
Vemos que en el directorio /var/backup hay un backup en .aes :
AES o Advanced Encryption Standard es un método de cifrado simétrico de bloques que protege la confidencialidad de los datos.
Vamos a bajarnos este archivo a nuestra máquina:
Maquina victima:
Kali:
Buscando maneras de desencriptarlo encontré el siguiente repositorio:
Vamos a probarlo pasándole el rockyou.txt y el archivo comprimido encriptado:
Encontró la contraseña!! Vamos a indicar que lo desencripte:
Vemos que ya nos da el .zip normal, vamos a descomprimirlo:
Nos crea el directorio web , vamos a entrar y ver que hay:
Vamos a revisar el db.json :
Vemos el hash del usuario mark , vamos a crackearlo con Crackstation:

Tenemos su contraseña, vamos a pasarnos al usuario mark :
Shell as root
Vamos a ver los permisos SUDOERS:
Podemos usar como cualquier usuario sin necesidad de contraseña el binario charcol , vamos a ejecutarlo como root y ver su panel de ayuda:
Vemos que podemos obtener una shell interactiva, vamos a probarla:
Vemos que nos pide contraseña y no tenemos ninguna. Si vemos el panel de ayuda tenemos el parámetro -R para reiniciar la contraseña, vamos a probar:
Nos comenta que ahora se a restablecido y ahora no requiere contraseña vamos a probar:
Estamos dentro, vamos a poner help :
Veremos muchas opciones pero la que más destaca es la siguiente:
Podemos añadir una tarea cron, como estamos como root podremos darle suid a la /bin/bash , vamos a probar:
Vamos a salir de esa shell y vamos a ver si a funcionado:
Tiene SUID!! Ahora con bash -p podremos lanzar una bash con el privilegio más alto y ser root:
root! ;)