From bcf1b091039d017a7d683000dcbd0ec4bb3e45ab Mon Sep 17 00:00:00 2001 From: Tommy White Date: Mon, 19 Sep 2016 07:20:13 +0300 Subject: [PATCH] Refactoring. Detached Business Logic from Responder to another class(/servers/ServersPool.py). --- Responder.py | 243 +++------------------------------------------------ settings.py | 20 ++--- 2 files changed, 21 insertions(+), 242 deletions(-) diff --git a/Responder.py b/Responder.py index 996fc28..c57676e 100755 --- a/Responder.py +++ b/Responder.py @@ -15,12 +15,9 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . import optparse -import ssl - -from SocketServer import TCPServer, UDPServer, ThreadingMixIn -from threading import Thread from utils import * -import struct +from servers.ServersPool import ServersPool + banner() parser = optparse.OptionParser(usage='python %prog -I eth0 -w -r -f\nor:\npython %prog -I eth0 -wrf', version=settings.__version__, prog=sys.argv[0]) @@ -60,236 +57,18 @@ StartupMessage() settings.Config.ExpandIPRanges() if settings.Config.AnalyzeMode: - print color('[i] Responder is in analyze mode. No NBT-NS, LLMNR, MDNS requests will be poisoned.', 3, 1) - -class ThreadingUDPServer(ThreadingMixIn, UDPServer): - def server_bind(self): - if OsInterfaceIsSupported(): - try: - self.socket.setsockopt(socket.SOL_SOCKET, 25, settings.Config.Bind_To+'\0') - except: - pass - UDPServer.server_bind(self) - -class ThreadingTCPServer(ThreadingMixIn, TCPServer): - def server_bind(self): - if OsInterfaceIsSupported(): - try: - self.socket.setsockopt(socket.SOL_SOCKET, 25, settings.Config.Bind_To+'\0') - except: - pass - TCPServer.server_bind(self) - -class ThreadingTCPServerAuth(ThreadingMixIn, TCPServer): - def server_bind(self): - if OsInterfaceIsSupported(): - try: - self.socket.setsockopt(socket.SOL_SOCKET, 25, settings.Config.Bind_To+'\0') - except: - pass - self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER, struct.pack('ii', 1, 0)) - TCPServer.server_bind(self) - -class ThreadingUDPMDNSServer(ThreadingMixIn, UDPServer): - def server_bind(self): - MADDR = "224.0.0.251" - - self.socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR, 1) - self.socket.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 255) - - Join = self.socket.setsockopt(socket.IPPROTO_IP,socket.IP_ADD_MEMBERSHIP, socket.inet_aton(MADDR) + settings.Config.IP_aton) - - if OsInterfaceIsSupported(): - try: - self.socket.setsockopt(socket.SOL_SOCKET, 25, settings.Config.Bind_To+'\0') - except: - pass - UDPServer.server_bind(self) - -class ThreadingUDPLLMNRServer(ThreadingMixIn, UDPServer): - def server_bind(self): - MADDR = "224.0.0.252" - - self.socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) - self.socket.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 255) - - Join = self.socket.setsockopt(socket.IPPROTO_IP,socket.IP_ADD_MEMBERSHIP,socket.inet_aton(MADDR) + settings.Config.IP_aton) - - if OsInterfaceIsSupported(): - try: - self.socket.setsockopt(socket.SOL_SOCKET, 25, settings.Config.Bind_To+'\0') - except: - pass - UDPServer.server_bind(self) - -ThreadingUDPServer.allow_reuse_address = 1 -ThreadingTCPServer.allow_reuse_address = 1 -ThreadingUDPMDNSServer.allow_reuse_address = 1 -ThreadingUDPLLMNRServer.allow_reuse_address = 1 -ThreadingTCPServerAuth.allow_reuse_address = 1 - -def serve_thread_udp_broadcast(host, port, handler): - try: - server = ThreadingUDPServer(('', port), handler) - server.serve_forever() - except: - print color("[!] ", 1, 1) + "Error starting UDP server on port " + str(port) + ", check permissions or other servers running." - -def serve_NBTNS_poisoner(host, port, handler): - serve_thread_udp_broadcast(host, port, handler) - -def serve_MDNS_poisoner(host, port, handler): - try: - server = ThreadingUDPMDNSServer((host, port), handler) - server.serve_forever() - except: - print color("[!] ", 1, 1) + "Error starting UDP server on port " + str(port) + ", check permissions or other servers running." - -def serve_LLMNR_poisoner(host, port, handler): - try: - server = ThreadingUDPLLMNRServer((host, port), handler) - server.serve_forever() - except: - print color("[!] ", 1, 1) + "Error starting UDP server on port " + str(port) + ", check permissions or other servers running." - -def serve_thread_udp(host, port, handler): - try: - if OsInterfaceIsSupported(): - server = ThreadingUDPServer((settings.Config.Bind_To, port), handler) - server.serve_forever() - else: - server = ThreadingUDPServer((host, port), handler) - server.serve_forever() - except: - print color("[!] ", 1, 1) + "Error starting UDP server on port " + str(port) + ", check permissions or other servers running." - -def serve_thread_tcp(host, port, handler): - try: - if OsInterfaceIsSupported(): - server = ThreadingTCPServer((settings.Config.Bind_To, port), handler) - server.serve_forever() - else: - server = ThreadingTCPServer((host, port), handler) - server.serve_forever() - except: - print color("[!] ", 1, 1) + "Error starting TCP server on port " + str(port) + ", check permissions or other servers running." - -def serve_thread_tcp_auth(host, port, handler): - try: - if OsInterfaceIsSupported(): - server = ThreadingTCPServerAuth((settings.Config.Bind_To, port), handler) - server.serve_forever() - else: - server = ThreadingTCPServerAuth((host, port), handler) - server.serve_forever() - except: - print color("[!] ", 1, 1) + "Error starting TCP server on port " + str(port) + ", check permissions or other servers running." - -def serve_thread_SSL(host, port, handler): - try: - - cert = os.path.join(settings.Config.ResponderPATH, settings.Config.SSLCert) - key = os.path.join(settings.Config.ResponderPATH, settings.Config.SSLKey) - - if OsInterfaceIsSupported(): - server = ThreadingTCPServer((settings.Config.Bind_To, port), handler) - server.socket = ssl.wrap_socket(server.socket, certfile=cert, keyfile=key, server_side=True) - server.serve_forever() - else: - server = ThreadingTCPServer((host, port), handler) - server.socket = ssl.wrap_socket(server.socket, certfile=cert, keyfile=key, server_side=True) - server.serve_forever() - except: - print color("[!] ", 1, 1) + "Error starting SSL server on port " + str(port) + ", check permissions or other servers running." + print color('[i] Responder is in analyze mode. No NBT-NS, LLMNR, MDNS requests will be poisoned.', 3, 1) def main(): - try: - threads = [] + try: + serversPool = ServersPool(options) + print color('[+]', 2, 1) + " Listening for events..." + serversPool.start() + while True: + time.sleep(1) - # Load (M)DNS, NBNS and LLMNR Poisoners - from poisoners.LLMNR import LLMNR - from poisoners.NBTNS import NBTNS - from poisoners.MDNS import MDNS - threads.append(Thread(target=serve_LLMNR_poisoner, args=('', 5355, LLMNR,))) - threads.append(Thread(target=serve_MDNS_poisoner, args=('', 5353, MDNS,))) - threads.append(Thread(target=serve_NBTNS_poisoner, args=('', 137, NBTNS,))) - - # Load Browser Listener - from servers.Browser import Browser - threads.append(Thread(target=serve_thread_udp_broadcast, args=('', 138, Browser,))) - - if settings.Config.HTTP_On_Off: - from servers.HTTP import HTTP - threads.append(Thread(target=serve_thread_tcp, args=('', 80, HTTP,))) - - if settings.Config.SSL_On_Off: - from servers.HTTP import HTTPS - threads.append(Thread(target=serve_thread_SSL, args=('', 443, HTTPS,))) - - if settings.Config.WPAD_On_Off: - from servers.HTTP_Proxy import HTTP_Proxy - threads.append(Thread(target=serve_thread_tcp, args=('', 3141, HTTP_Proxy,))) - - if settings.Config.ProxyAuth_On_Off: - from servers.Proxy_Auth import Proxy_Auth - threads.append(Thread(target=serve_thread_tcp_auth, args=('', 3128, Proxy_Auth,))) - - if settings.Config.SMB_On_Off: - if settings.Config.LM_On_Off: - from servers.SMB import SMB1LM - threads.append(Thread(target=serve_thread_tcp, args=('', 445, SMB1LM,))) - threads.append(Thread(target=serve_thread_tcp, args=('', 139, SMB1LM,))) - else: - from servers.SMB import SMB1 - threads.append(Thread(target=serve_thread_tcp, args=('', 445, SMB1,))) - threads.append(Thread(target=serve_thread_tcp, args=('', 139, SMB1,))) - - if settings.Config.Krb_On_Off: - from servers.Kerberos import KerbTCP, KerbUDP - threads.append(Thread(target=serve_thread_udp, args=('', 88, KerbUDP,))) - threads.append(Thread(target=serve_thread_tcp, args=('', 88, KerbTCP,))) - - if settings.Config.SQL_On_Off: - from servers.MSSQL import MSSQL - threads.append(Thread(target=serve_thread_tcp, args=('', 1433, MSSQL,))) - - if settings.Config.FTP_On_Off: - from servers.FTP import FTP - threads.append(Thread(target=serve_thread_tcp, args=('', 21, FTP,))) - - if settings.Config.POP_On_Off: - from servers.POP3 import POP3 - threads.append(Thread(target=serve_thread_tcp, args=('', 110, POP3,))) - - if settings.Config.LDAP_On_Off: - from servers.LDAP import LDAP - threads.append(Thread(target=serve_thread_tcp, args=('', 389, LDAP,))) - - if settings.Config.SMTP_On_Off: - from servers.SMTP import ESMTP - threads.append(Thread(target=serve_thread_tcp, args=('', 25, ESMTP,))) - threads.append(Thread(target=serve_thread_tcp, args=('', 587, ESMTP,))) - - if settings.Config.IMAP_On_Off: - from servers.IMAP import IMAP - threads.append(Thread(target=serve_thread_tcp, args=('', 143, IMAP,))) - - if settings.Config.DNS_On_Off: - from servers.DNS import DNS, DNSTCP - threads.append(Thread(target=serve_thread_udp, args=('', 53, DNS,))) - threads.append(Thread(target=serve_thread_tcp, args=('', 53, DNSTCP,))) - - for thread in threads: - thread.setDaemon(True) - thread.start() - - print color('[+]', 2, 1) + " Listening for events..." - - while True: - time.sleep(1) - - except KeyboardInterrupt: - sys.exit("\r%s Exiting..." % color('[+]', 2, 1)) + except KeyboardInterrupt: + sys.exit("\r%s Exiting..." % color('[+]', 2, 1)) if __name__ == '__main__': main() diff --git a/settings.py b/settings.py index 5edf890..972501f 100644 --- a/settings.py +++ b/settings.py @@ -149,7 +149,7 @@ class Settings: # Auto Ignore List self.AutoIgnore = self.toBool(config.get('Responder Core', 'AutoIgnoreAfterSuccess')) self.CaptureMultipleCredentials = self.toBool(config.get('Responder Core', 'CaptureMultipleCredentials')) - self.CaptureMultipleHashFromSameHost = self.toBool(config.get('Responder Core', 'CaptureMultipleHashFromSameHost')) + self.CaptureMultipleHashFromSameHost = self.toBool(config.get('Responder Core', 'CaptureMultipleHashFromSameHost')) self.AutoIgnoreList = [] # CLI options @@ -169,13 +169,13 @@ class Settings: self.ProxyAuth_On_Off = options.ProxyAuth_On_Off self.CommandLine = str(sys.argv) - if self.ExternalIP: - self.ExternalIPAton = socket.inet_aton(self.ExternalIP) + if self.ExternalIP: + self.ExternalIPAton = socket.inet_aton(self.ExternalIP) if self.HtmlToInject is None: self.HtmlToInject = '' - self.Bind_To = utils.FindLocalIP(self.Interface, self.OURIP) + self.Bind_To = utils.FindLocalIP(self.Interface, self.OURIP) self.IP_aton = socket.inet_aton(self.Bind_To) self.Os_version = sys.platform @@ -208,12 +208,12 @@ class Settings: self.AnalyzeLogger = logging.getLogger('Analyze Log') self.AnalyzeLogger.addHandler(ALog_Handler) - NetworkCard = subprocess.check_output(["ifconfig", "-a"]) - DNS = subprocess.check_output(["cat", "/etc/resolv.conf"]) - RoutingInfo = subprocess.check_output(["netstat", "-rn"]) - Message = "Current environment is:\nNetwork Config:\n%s\nDNS Settings:\n%s\nRouting info:\n%s\n\n"%(NetworkCard,DNS,RoutingInfo) - utils.DumpConfig(self.ResponderConfigDump, Message) - utils.DumpConfig(self.ResponderConfigDump,str(self)) + NetworkCard = subprocess.check_output(["ifconfig", "-a"]) + DNS = subprocess.check_output(["cat", "/etc/resolv.conf"]) + RoutingInfo = subprocess.check_output(["netstat", "-rn"]) + Message = "Current environment is:\nNetwork Config:\n%s\nDNS Settings:\n%s\nRouting info:\n%s\n\n"%(NetworkCard,DNS,RoutingInfo) + utils.DumpConfig(self.ResponderConfigDump, Message) + utils.DumpConfig(self.ResponderConfigDump,str(self)) def init(): global Config