import socket import threading import struct import logging from SocketServer import UDPServer, TCPServer, ThreadingMixIn, BaseRequestHandler mitmf_logger = logging.getLogger("mitmf") class KERBServer(): def serve_thread_udp(self, host, port, handler): try: server = ThreadingUDPServer((host, port), handler) server.serve_forever() except Exception, e: mitmf_logger.debug("[KERBServer] Error starting UDP server on port 88: {}:".format(e)) def serve_thread_tcp(self, host, port, handler): try: server = ThreadingTCPServer((host, port), handler) server.serve_forever() except Exception, e: mitmf_logger.debug("[KERBServer] Error starting TCP server on port 88: {}:".format(e)) #Function name self-explanatory def start(self): mitmf_logger.debug("[KERBServer] online") t1 = threading.Thread(name="KERBServerUDP", target=self.serve_thread_udp, args=("0.0.0.0", 88,KerbUDP)) t2 = threading.Thread(name="KERBServerTCP", target=self.serve_thread_tcp, args=("0.0.0.0", 88, KerbTCP)) for t in [t1,t2]: t.setDaemon(True) t.start() class ThreadingUDPServer(ThreadingMixIn, UDPServer): allow_reuse_address = 1 def server_bind(self): UDPServer.server_bind(self) class ThreadingTCPServer(ThreadingMixIn, TCPServer): allow_reuse_address = 1 def server_bind(self): TCPServer.server_bind(self) class KerbTCP(BaseRequestHandler): def handle(self): try: data = self.request.recv(1024) KerbHash = ParseMSKerbv5TCP(data) if KerbHash: mitmf_logger.info('[KERBServer] MSKerbv5 complete hash is: {}'.format(KerbHash)) except Exception: raise class KerbUDP(BaseRequestHandler): def handle(self): try: data, soc = self.request KerbHash = ParseMSKerbv5UDP(data) if KerbHash: mitmf_logger.info('[KERBServer] MSKerbv5 complete hash is: {}'.format(KerbHash)) except Exception: raise def ParseMSKerbv5TCP(Data): MsgType = Data[21:22] EncType = Data[43:44] MessageType = Data[32:33] if MsgType == "\x0a" and EncType == "\x17" and MessageType =="\x02": if Data[49:53] == "\xa2\x36\x04\x34" or Data[49:53] == "\xa2\x35\x04\x33": HashLen = struct.unpack('