
Snipe-IT PoC exploit for CVE-2025-59712 and CVE-2025-59713
यह PoC CVE-2025-59712 (User-Agent हैडर में XSS) और CVE-2025-59713 (असुरक्षित deserialization) का शोषण करने के लिए एक स्वचालित स्क्रिप्ट प्रदान करता है।
ये दोनों कमज़ोरियाँ Synacktiv द्वारा Snipe-IT सॉफ़्टवेयर पर कमज़ोरी अनुसंधान के दौरान खोजी गई थीं। Snipe-IT Laravel पर आधारित एक ओपन-सोर्स संपत्ति प्रबंधन प्रणाली है, जिसे संगठनों को उनकी भौतिक और डिजिटल संपत्तियों को ट्रैक करने और प्रबंधित करने में मदद करने के लिए डिज़ाइन किया गया है।
इसका तकनीकी विवरण Synacktiv की वेबसाइट पर समर्पित सुरक्षा सलाह में पाया जा सकता है।
यह स्क्रिप्ट तीन उप-कमांड प्रदान करती है, जो शोषण मोड के अनुरूप हैं: xss, rce और fullchain।
यह उप-कमांड CVE-2025-59712 का शोषण करता है, जो कम-विशेषाधिकार वाले उपयोगकर्ता को /reports/activity रूट को कॉल करने पर प्रस्तुत HTML पृष्ठ में मनमाना JavaScript इंजेक्ट करने की अनुमति देता है। यह केवल किसी admin उपयोगकर्ता, या उस उपयोगकर्ता द्वारा किया जा सकता है जिसके पास रिपोर्ट देखने की स्पष्ट अनुमति हो। यह इंजेक्शन इसलिए संभव है क्योंकि जब उपयोगकर्ता अपनी प्रोफ़ाइल जानकारी अपडेट करता है तो User-Agent फ़ील्ड का उचित सैनिटाइज़ेशन नहीं होता।
ऐसा करने के लिए, यह पहले कम-विशेषाधिकार वाले उपयोगकर्ता के रूप में लॉग इन करेगा, और फिर --javascript फ़्लैग के माध्यम से दी गई फ़ाइल में परिभाषित JavaScript कोड इंजेक्ट करेगा।
$ python3 exploit.py xss --help
Usage: exploit.py xss [OPTIONS]
Execute XSS attack only with custom JavaScript payload
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --url -u TEXT Target Snipe-IT URL [required] │
│ * --login -l TEXT Low-privileged username [required] │
│ * --password -p TEXT Low-privileged password [required] │
│ * --new-name -n TEXT New name for low-privileged user [required] │
│ * --javascript -js TEXT Path to custom JavaScript file [required] │
│ --proxy -x TEXT HTTP proxy (http://ip:port) │
│ --verbose -v [quiet|normal|verbose] Logging verbosity [default: normal] │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
[!IMPORTANT]
सुरक्षा अनुसंधान के दौरान, Snipe-IT के एक संस्करण पर परीक्षण किए गए थे जो डिफ़ॉल्ट रूप से उसUser-Agentफ़ील्ड को प्रदर्शित करता था जिसमें दुर्भावनापूर्ण JavaScript इंजेक्ट की जाती है। कमिट 10e5d88 के बाद से, एक्शन लॉग तालिका प्रस्तुत करने परUser-Agentप्रॉपर्टी डिफ़ॉल्ट रूप से प्रदर्शित नहीं होती है। इसलिए, XSS ट्रिगर करने वाले admin को इस कमिट के बाद के Snipe-IT संस्करणों के लिए व्यू विकल्पों मेंUser-Agentबॉक्स को चेक किया हुआ होना चाहिए।
यह उप-कमांड CVE-2025-59713 का शोषण करता है, जो admin या superadmin उपयोगकर्ता के क्रेडेंशियल ज्ञात होने पर रिमोट कोड निष्पादन की अनुमति देता है। ऐसा करने के लिए, निम्नलिखित चरण निष्पादित किए जाते हैं:
db-dumps/mysql-snipeit.sql फ़ाइल में अतिरिक्त SQL स्टेटमेंट शामिल होते हैं, जो एक नया कस्टम फ़ील्ड बनाते हैं और अंतिम एक्शन लॉग को Laravel pop chain वाले JSON ऑब्जेक्ट के साथ संपादित करते हैं, जो पुनर्स्थापना पर निष्पादित होता है।[!TIP] डिफ़ॉल्ट रूप से, Snipe-IT बैकअप में
.envफ़ाइल शामिल करता है। यदि स्क्रिप्ट इसे पहचान लेती है, तोAPP_KEYमान प्रदर्शित किया जाता है और.envफ़ाइल./outputनिर्देशिका में सहेजी जाती है (उस फ़ाइल के लिए कस्टम स्थान--output-dirके साथ निर्दिष्ट किया जा सकता है)।
[!CAUTION] बैकअप को पुनर्स्थापित करने से इंस्टेंस से जुड़े सभी उपयोगकर्ता डिस्कनेक्ट हो जाते हैं।
/api/v1/reports/activity रूट को कॉल किया जाता है, जो deserialization को ट्रिगर करता है और Laravel pop chain को निष्पादित करता है।$ python3 exploit.py rce --help
Usage: exploit.py rce [OPTIONS]
Execute RCE attack only (requires existing admin account)
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --url -u TEXT Target Snipe-IT URL [required] │
│ * --admin-user -au TEXT Admin username [required] │
│ * --admin-pass -ap TEXT Admin password [required] │
│ --output-dir -od PATH Output dir for .env file [default: /home/ninja/Téléchargements/snipe-it-advisory/exploit/output] │
│ --shell-ip -si TEXT Reverse shell IP address │
│ --shell-port -sp INTEGER Reverse shell port │
│ --command -c TEXT Custom command (overrides reverse shell) │
│ --proxy -x TEXT HTTP proxy (http://ip:port) │
│ --verbose -v [quiet|normal|verbose] Logging verbosity [default: normal] │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
fullchain उप-कमांड का उद्देश्य XSS और RCE दोनों कमज़ोरियों को एक साथ जोड़ना है। यह एक ऐसे परिदृश्य से मेल खाता है जिसमें आपके पास केवल कम-विशेषाधिकार वाले उपयोगकर्ता की पहुँच होती है और आप रिमोट कोड निष्पादन प्राप्त करना चाहते हैं। यह तभी काम करेगा जब /reports/activity पृष्ठ पर जाने वाला उपयोगकर्ता admin या superadmin हो। वास्तव में, केवल इन्हीं भूमिकाओं के पास बैकअप बनाने और पुनर्स्थापित करने के अधिकार होते हैं, जो डेटाबेस को पॉइज़न करने और बाद में Laravel pop chain को ट्रिगर करने के लिए आवश्यक है।
ऐसा करने के लिए, स्क्रिप्ट निम्न कार्य करेगी:
--command फ़्लैग के साथ व्यक्तिगत रूप से बदल सकते हैं)।User-Agent फ़ील्ड में एक <scr> टैग इंजेक्ट करें।/reports/activity रूट पर जाता है, तो XSS ट्रिगर होता है और दुर्भावनापूर्ण JavaScript पीड़ित के ब्राउज़र द्वारा लोड और निष्पादित की जाती है। इसके बाद, RCE मॉड्यूल में निष्पादित किए गए समान चरण किए जाते हैं, लेकिन JavaScript में।यह मोड कई अतिरिक्त JavaScript लाइब्रेरियों का उपयोग करता है, सभी क्रेडिट उनके संबंधित लेखकों को जाते हैं:
$ python3 exploit.py fullchain --help
Usage: exploit.py fullchain [OPTIONS]
Execute full attack chain: XSS -> Backup manipulation -> RCE
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --url -u TEXT Target Snipe-IT URL [required] │
│ * --login -l TEXT Low-privileged user's username [required] │
│ * --password -p TEXT Low-privileged user's password [required] │
│ * --new-name -n TEXT New name for low-privileged user [required] │
│ --ip -i TEXT HTTP server IP address (default: auto-detect) │
│ * --port -P INTEGER HTTP server port [required] │
│ --admin-user -au TEXT Admin username to create [default: admin_rce] │
│ --admin-pass -ap TEXT Admin password to create [default: password123] │
│ --shell-ip -si TEXT Reverse shell IP address │
│ --shell-port -sp INTEGER Reverse shell port │
│ --command -c TEXT Custom command (overrides reverse shell) │
│ --proxy -x TEXT HTTP proxy (http://ip:port) │
│ --verbose -v [quiet|normal|verbose] Logging verbosity [default: normal] │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
इस स्क्रिप्ट को चलाने के लिए, निम्नलिखित कमांड चलाएँ:
$ git clone https://github.com/synacktiv/CVE-2025-59712_CVE-2025-59713
$ cd CVE-2025-59712_CVE-2025-59713
$ python3 -m venv .venv && source .venv/bin/activate
$ python3 -m pip install -r requirements.txt
स्क्रिप्ट को आज़माने और कमज़ोरी के शोषण को पुनः प्रस्तुत करने के लिए एक Dockerfile भी प्रदान किया गया है। यह Snipe-IT का एक कमज़ोर संस्करण खींचता है, php artisan के साथ डेटाबेस कॉन्फ़िगर करता है, और दो उपयोगकर्ता सेट करता है:
admin जिसका डिफ़ॉल्ट पासवर्ड AdminPassword123! है।lowpriv जिसका डिफ़ॉल्ट पासवर्ड LowPrivUser123! है।कंटेनर चलाने से पहले, .env और snipe-it.conf फ़ाइलों को Snipe-IT इंस्टेंस के URL के साथ अपडेट करना आवश्यक है:
$ sed -i 's|^APP_URL=.*|APP_URL=http://<IP>:<PORT>|' .env
$ sed -i 's|\(ServerName\s*\).*|\1http://<IP>:<PORT>|' snipe-it.conf
फिर कंटेनर को चलाया जा सकता है:
$ docker build . -t "snipe-it-cve"
$ docker run -p 80:80 --name "snipe-it-debian" snipe-it-cve:latest