import socket import threading import struct import logging from core.logger import logger from SocketServer import UDPServer, TCPServer, ThreadingMixIn, BaseRequestHandler formatter = logging.Formatter("%(asctime)s [KERBserver] %(message)s", datefmt="%Y-%m-%d %H:%M:%S") log = logger().setup_logger("KERBserver", formatter) class KERBserver(): def serve_thread_udp(self, host, port, handler): try: server = ThreadingUDPServer((host, port), handler) server.serve_forever() except Exception as e: log.debug("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 as e: log.debug("Error starting TCP server on port 88: {}:".format(e)) def start(self): log.debug("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: log.info('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: log.info('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('