mirror of
https://github.com/lgandx/Responder.git
synced 2025-08-22 06:13:39 -07:00
Merge 4fffdd6649
into 0cf1087010
This commit is contained in:
commit
444eb5dee6
30 changed files with 279 additions and 251 deletions
5
.gitignore
vendored
5
.gitignore
vendored
|
@ -1,5 +0,0 @@
|
||||||
# Responder logs
|
|
||||||
*.db
|
|
||||||
*.txt
|
|
||||||
*.log
|
|
||||||
|
|
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()
|
||||||
|
|
BIN
fingerprint.pyc
Normal file
BIN
fingerprint.pyc
Normal file
Binary file not shown.
BIN
odict.pyc
Normal file
BIN
odict.pyc
Normal file
Binary file not shown.
BIN
packets.pyc
Normal file
BIN
packets.pyc
Normal file
Binary file not shown.
BIN
poisoners/LLMNR.pyc
Normal file
BIN
poisoners/LLMNR.pyc
Normal file
Binary file not shown.
BIN
poisoners/MDNS.pyc
Normal file
BIN
poisoners/MDNS.pyc
Normal file
Binary file not shown.
BIN
poisoners/NBTNS.pyc
Normal file
BIN
poisoners/NBTNS.pyc
Normal file
Binary file not shown.
BIN
poisoners/__init__.pyc
Normal file
BIN
poisoners/__init__.pyc
Normal file
Binary file not shown.
|
@ -23,8 +23,8 @@ import struct
|
||||||
def WorkstationFingerPrint(data):
|
def WorkstationFingerPrint(data):
|
||||||
return {
|
return {
|
||||||
"\x04\x00" :"Windows 95",
|
"\x04\x00" :"Windows 95",
|
||||||
"\x04\x10" :"Windows 98",
|
"\x04\x0A" :"Windows 98",
|
||||||
"\x04\x90" :"Windows ME",
|
"\x04\x5A" :"Windows ME",
|
||||||
"\x05\x00" :"Windows 2000",
|
"\x05\x00" :"Windows 2000",
|
||||||
"\x05\x01" :"Windows XP",
|
"\x05\x01" :"Windows XP",
|
||||||
"\x05\x02" :"Windows XP(64-Bit)/Windows 2003",
|
"\x05\x02" :"Windows XP(64-Bit)/Windows 2003",
|
||||||
|
@ -32,7 +32,7 @@ def WorkstationFingerPrint(data):
|
||||||
"\x06\x01" :"Windows 7/Server 2008R2",
|
"\x06\x01" :"Windows 7/Server 2008R2",
|
||||||
"\x06\x02" :"Windows 8/Server 2012",
|
"\x06\x02" :"Windows 8/Server 2012",
|
||||||
"\x06\x03" :"Windows 8.1/Server 2012R2",
|
"\x06\x03" :"Windows 8.1/Server 2012R2",
|
||||||
"\x10\x00" :"Windows 10/Server 2016",
|
"\x0A\x00" :"Windows 10/Server 2016",
|
||||||
}.get(data, 'Unknown')
|
}.get(data, 'Unknown')
|
||||||
|
|
||||||
|
|
||||||
|
|
BIN
servers/Browser.pyc
Normal file
BIN
servers/Browser.pyc
Normal file
Binary file not shown.
BIN
servers/DNS.pyc
Normal file
BIN
servers/DNS.pyc
Normal file
Binary file not shown.
BIN
servers/FTP.pyc
Normal file
BIN
servers/FTP.pyc
Normal file
Binary file not shown.
BIN
servers/HTTP.pyc
Normal file
BIN
servers/HTTP.pyc
Normal file
Binary file not shown.
BIN
servers/HTTP_Proxy.pyc
Normal file
BIN
servers/HTTP_Proxy.pyc
Normal file
Binary file not shown.
BIN
servers/IMAP.pyc
Normal file
BIN
servers/IMAP.pyc
Normal file
Binary file not shown.
BIN
servers/Kerberos.pyc
Normal file
BIN
servers/Kerberos.pyc
Normal file
Binary file not shown.
BIN
servers/LDAP.pyc
Normal file
BIN
servers/LDAP.pyc
Normal file
Binary file not shown.
BIN
servers/MSSQL.pyc
Normal file
BIN
servers/MSSQL.pyc
Normal file
Binary file not shown.
BIN
servers/POP3.pyc
Normal file
BIN
servers/POP3.pyc
Normal file
Binary file not shown.
BIN
servers/Proxy_Auth.pyc
Normal file
BIN
servers/Proxy_Auth.pyc
Normal file
Binary file not shown.
BIN
servers/SMB.pyc
Normal file
BIN
servers/SMB.pyc
Normal file
Binary file not shown.
BIN
servers/SMTP.pyc
Normal file
BIN
servers/SMTP.pyc
Normal file
Binary file not shown.
254
servers/ServersPool.py
Normal file
254
servers/ServersPool.py
Normal file
|
@ -0,0 +1,254 @@
|
||||||
|
from threading import Thread
|
||||||
|
import ssl
|
||||||
|
import struct
|
||||||
|
from utils import *
|
||||||
|
from SocketServer import TCPServer, UDPServer, ThreadingMixIn
|
||||||
|
|
||||||
|
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."
|
||||||
|
|
||||||
|
|
||||||
|
class ServersPool:
|
||||||
|
"""ServersPool provides managing of the threads according current settings."""
|
||||||
|
def __init__(self, settings):
|
||||||
|
self.__threadsPool = []
|
||||||
|
self.__settings = settings
|
||||||
|
self.initServers()
|
||||||
|
|
||||||
|
def start(self):
|
||||||
|
for thread in self.__threadsPool:
|
||||||
|
thread.setDaemon(True)
|
||||||
|
thread.start()
|
||||||
|
|
||||||
|
def initServers(self):
|
||||||
|
# Load (M)DNS, NBNS and LLMNR Poisoners
|
||||||
|
from poisoners.LLMNR import LLMNR
|
||||||
|
from poisoners.NBTNS import NBTNS
|
||||||
|
from poisoners.MDNS import MDNS
|
||||||
|
self.__threadsPool.append(Thread(target=serve_MDNS_poisoner, args=('', 5353, MDNS,)))
|
||||||
|
self.__threadsPool.append(Thread(target=serve_LLMNR_poisoner, args=('', 5355, LLMNR,)))
|
||||||
|
self.__threadsPool.append(Thread(target=serve_NBTNS_poisoner, args=('', 137, NBTNS,)))
|
||||||
|
|
||||||
|
# Load Browser Listener
|
||||||
|
from servers.Browser import Browser
|
||||||
|
self.__threadsPool.append(Thread(target=serve_thread_udp_broadcast, args=('', 138, Browser,)))
|
||||||
|
|
||||||
|
if settings.Config.HTTP_On_Off:
|
||||||
|
from servers.HTTP import HTTP
|
||||||
|
self.__threadsPool.append(Thread(target=serve_thread_tcp, args=('', 80, HTTP,)))
|
||||||
|
|
||||||
|
if settings.Config.SSL_On_Off:
|
||||||
|
from servers.HTTP import HTTPS
|
||||||
|
self.__threadsPool.append(Thread(target=serve_thread_SSL, args=('', 443, HTTPS,)))
|
||||||
|
|
||||||
|
if settings.Config.WPAD_On_Off:
|
||||||
|
from servers.HTTP_Proxy import HTTP_Proxy
|
||||||
|
self.__threadsPool.append(Thread(target=serve_thread_tcp, args=('', 3141, HTTP_Proxy,)))
|
||||||
|
|
||||||
|
if settings.Config.ProxyAuth_On_Off:
|
||||||
|
from servers.Proxy_Auth import Proxy_Auth
|
||||||
|
self.__threadsPool.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
|
||||||
|
self.__threadsPool.append(Thread(target=serve_thread_tcp, args=('', 445, SMB1LM,)))
|
||||||
|
self.__threadsPool.append(Thread(target=serve_thread_tcp, args=('', 139, SMB1LM,)))
|
||||||
|
else:
|
||||||
|
from servers.SMB import SMB1
|
||||||
|
self.__threadsPool.append(Thread(target=serve_thread_tcp, args=('', 445, SMB1,)))
|
||||||
|
self.__threadsPool.append(Thread(target=serve_thread_tcp, args=('', 139, SMB1,)))
|
||||||
|
|
||||||
|
if settings.Config.Krb_On_Off:
|
||||||
|
from servers.Kerberos import KerbTCP, KerbUDP
|
||||||
|
self.__threadsPool.append(Thread(target=serve_thread_udp, args=('', 88, KerbUDP,)))
|
||||||
|
self.__threadsPool.append(Thread(target=serve_thread_tcp, args=('', 88, KerbTCP,)))
|
||||||
|
|
||||||
|
if settings.Config.SQL_On_Off:
|
||||||
|
from servers.MSSQL import MSSQL
|
||||||
|
self.__threadsPool.append(Thread(target=serve_thread_tcp, args=('', 1433, MSSQL,)))
|
||||||
|
|
||||||
|
if settings.Config.FTP_On_Off:
|
||||||
|
from servers.FTP import FTP
|
||||||
|
self.__threadsPool.append(Thread(target=serve_thread_tcp, args=('', 21, FTP,)))
|
||||||
|
|
||||||
|
if settings.Config.POP_On_Off:
|
||||||
|
from servers.POP3 import POP3
|
||||||
|
self.__threadsPool.append(Thread(target=serve_thread_tcp, args=('', 110, POP3,)))
|
||||||
|
|
||||||
|
if settings.Config.LDAP_On_Off:
|
||||||
|
from servers.LDAP import LDAP
|
||||||
|
self.__threadsPool.append(Thread(target=serve_thread_tcp, args=('', 389, LDAP,)))
|
||||||
|
|
||||||
|
if settings.Config.SMTP_On_Off:
|
||||||
|
from servers.SMTP import ESMTP
|
||||||
|
self.__threadsPool.append(Thread(target=serve_thread_tcp, args=('', 25, ESMTP,)))
|
||||||
|
self.__threadsPool.append(Thread(target=serve_thread_tcp, args=('', 587, ESMTP,)))
|
||||||
|
|
||||||
|
if settings.Config.IMAP_On_Off:
|
||||||
|
from servers.IMAP import IMAP
|
||||||
|
self.__threadsPool.append(Thread(target=serve_thread_tcp, args=('', 143, IMAP,)))
|
||||||
|
|
||||||
|
if settings.Config.DNS_On_Off:
|
||||||
|
from servers.DNS import DNS, DNSTCP
|
||||||
|
self.__threadsPool.append(Thread(target=serve_thread_udp, args=('', 53, DNS,)))
|
||||||
|
self.__threadsPool.append(Thread(target=serve_thread_tcp, args=('', 53, DNSTCP,)))
|
BIN
servers/ServersPool.pyc
Normal file
BIN
servers/ServersPool.pyc
Normal file
Binary file not shown.
BIN
servers/__init__.pyc
Normal file
BIN
servers/__init__.pyc
Normal file
Binary file not shown.
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
|
||||||
|
|
BIN
settings.pyc
Normal file
BIN
settings.pyc
Normal file
Binary file not shown.
2
utils.py
2
utils.py
|
@ -176,7 +176,7 @@ def SaveToDb(result):
|
||||||
with open(logfile,"a") as outf:
|
with open(logfile,"a") as outf:
|
||||||
if len(result['cleartext']): # If we obtained cleartext credentials, write them to file
|
if len(result['cleartext']): # If we obtained cleartext credentials, write them to file
|
||||||
outf.write('%s:%s\n' % (result['user'].encode('utf8', 'replace'), result['cleartext'].encode('utf8', 'replace')))
|
outf.write('%s:%s\n' % (result['user'].encode('utf8', 'replace'), result['cleartext'].encode('utf8', 'replace')))
|
||||||
else: # Otherwise, write JtR-style hash string to file
|
else: # Otherwise, write JtR-style hash string to filed
|
||||||
outf.write(result['fullhash'].encode('utf8', 'replace') + '\n')
|
outf.write(result['fullhash'].encode('utf8', 'replace') + '\n')
|
||||||
|
|
||||||
if not count or settings.Config.Verbose: # Print output
|
if not count or settings.Config.Verbose: # Print output
|
||||||
|
|
BIN
utils.pyc
Normal file
BIN
utils.pyc
Normal file
Binary file not shown.
Loading…
Add table
Add a link
Reference in a new issue