mirror of
https://github.com/lgandx/Responder.git
synced 2025-08-22 06:13:39 -07:00
Refactoring. Detached Business Logic from Responder to another class(/servers/ServersPool.py).
This commit is contained in:
parent
ae4e084fed
commit
bcf1b09103
2 changed files with 21 additions and 242 deletions
243
Responder.py
243
Responder.py
|
@ -15,12 +15,9 @@
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
import optparse
|
import optparse
|
||||||
import ssl
|
|
||||||
|
|
||||||
from SocketServer import TCPServer, UDPServer, ThreadingMixIn
|
|
||||||
from threading import Thread
|
|
||||||
from utils import *
|
from utils import *
|
||||||
import struct
|
from servers.ServersPool import ServersPool
|
||||||
|
|
||||||
banner()
|
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])
|
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()
|
settings.Config.ExpandIPRanges()
|
||||||
|
|
||||||
if settings.Config.AnalyzeMode:
|
if settings.Config.AnalyzeMode:
|
||||||
print color('[i] Responder is in analyze mode. No NBT-NS, LLMNR, MDNS requests will be poisoned.', 3, 1)
|
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."
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
try:
|
try:
|
||||||
threads = []
|
serversPool = ServersPool(options)
|
||||||
|
print color('[+]', 2, 1) + " Listening for events..."
|
||||||
|
serversPool.start()
|
||||||
|
while True:
|
||||||
|
time.sleep(1)
|
||||||
|
|
||||||
# Load (M)DNS, NBNS and LLMNR Poisoners
|
except KeyboardInterrupt:
|
||||||
from poisoners.LLMNR import LLMNR
|
sys.exit("\r%s Exiting..." % color('[+]', 2, 1))
|
||||||
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))
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
main()
|
main()
|
||||||
|
|
20
settings.py
20
settings.py
|
@ -149,7 +149,7 @@ class Settings:
|
||||||
# Auto Ignore List
|
# Auto Ignore List
|
||||||
self.AutoIgnore = self.toBool(config.get('Responder Core', 'AutoIgnoreAfterSuccess'))
|
self.AutoIgnore = self.toBool(config.get('Responder Core', 'AutoIgnoreAfterSuccess'))
|
||||||
self.CaptureMultipleCredentials = self.toBool(config.get('Responder Core', 'CaptureMultipleCredentials'))
|
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 = []
|
self.AutoIgnoreList = []
|
||||||
|
|
||||||
# CLI options
|
# CLI options
|
||||||
|
@ -169,13 +169,13 @@ class Settings:
|
||||||
self.ProxyAuth_On_Off = options.ProxyAuth_On_Off
|
self.ProxyAuth_On_Off = options.ProxyAuth_On_Off
|
||||||
self.CommandLine = str(sys.argv)
|
self.CommandLine = str(sys.argv)
|
||||||
|
|
||||||
if self.ExternalIP:
|
if self.ExternalIP:
|
||||||
self.ExternalIPAton = socket.inet_aton(self.ExternalIP)
|
self.ExternalIPAton = socket.inet_aton(self.ExternalIP)
|
||||||
|
|
||||||
if self.HtmlToInject is None:
|
if self.HtmlToInject is None:
|
||||||
self.HtmlToInject = ''
|
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.IP_aton = socket.inet_aton(self.Bind_To)
|
||||||
self.Os_version = sys.platform
|
self.Os_version = sys.platform
|
||||||
|
|
||||||
|
@ -208,12 +208,12 @@ class Settings:
|
||||||
self.AnalyzeLogger = logging.getLogger('Analyze Log')
|
self.AnalyzeLogger = logging.getLogger('Analyze Log')
|
||||||
self.AnalyzeLogger.addHandler(ALog_Handler)
|
self.AnalyzeLogger.addHandler(ALog_Handler)
|
||||||
|
|
||||||
NetworkCard = subprocess.check_output(["ifconfig", "-a"])
|
NetworkCard = subprocess.check_output(["ifconfig", "-a"])
|
||||||
DNS = subprocess.check_output(["cat", "/etc/resolv.conf"])
|
DNS = subprocess.check_output(["cat", "/etc/resolv.conf"])
|
||||||
RoutingInfo = subprocess.check_output(["netstat", "-rn"])
|
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)
|
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, Message)
|
||||||
utils.DumpConfig(self.ResponderConfigDump,str(self))
|
utils.DumpConfig(self.ResponderConfigDump,str(self))
|
||||||
|
|
||||||
def init():
|
def init():
|
||||||
global Config
|
global Config
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue