mirror of
https://github.com/byt3bl33d3r/MITMf.git
synced 2025-08-14 02:37:06 -07:00
Revamped logging , plugins will be re-added later once refactored
This commit is contained in:
parent
fb0e8a3762
commit
ff0ada2a39
34 changed files with 351 additions and 2352 deletions
158
mitmf.py
158
mitmf.py
|
@ -18,158 +18,102 @@
|
|||
# USA
|
||||
#
|
||||
|
||||
import logging
|
||||
import argparse
|
||||
import sys
|
||||
import os
|
||||
import logging
|
||||
import threading
|
||||
|
||||
from twisted.web import http
|
||||
from twisted.internet import reactor
|
||||
from core.sslstrip.CookieCleaner import CookieCleaner
|
||||
from core.sergioproxy.ProxyPlugins import ProxyPlugins
|
||||
from core.utils import Banners, SystemConfig, shutdown
|
||||
from core.logger import logger
|
||||
|
||||
from plugins import *
|
||||
|
||||
Banners().printBanner()
|
||||
print Banners().get_banner()
|
||||
|
||||
if os.geteuid() != 0:
|
||||
sys.exit("[-] When man-in-the-middle you want, run as r00t you will, hmm?")
|
||||
sys.exit("[-] The derp is strong with this one")
|
||||
|
||||
mitmf_version = "0.9.7"
|
||||
sslstrip_version = "0.9"
|
||||
sergio_version = "0.2.1"
|
||||
|
||||
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='@')
|
||||
parser = argparse.ArgumentParser(description="MITMf v0.9.8 - 'The Dark Side'", version="0.9.8 - 'The Dark Side'", usage='mitmf.py -i interface [mitmf options] [plugin name] [plugin options]', epilog="Use wisely, young Padawan.")
|
||||
|
||||
#add MITMf options
|
||||
mgroup = parser.add_argument_group("MITMf", "Options for MITMf")
|
||||
mgroup.add_argument("--log-level", type=str,choices=['debug', 'info'], default="info", help="Specify a log level [default: info]")
|
||||
mgroup.add_argument("-i", "--interface", required=True, type=str, metavar="interface" ,help="Interface to listen on")
|
||||
mgroup.add_argument("-c", "--config-file", dest='configfile', type=str, default="./config/mitmf.conf", metavar='configfile', help="Specify config file to use")
|
||||
mgroup.add_argument("-i", dest='interface', required=True, type=str, help="Interface to listen on")
|
||||
mgroup.add_argument("-c", dest='configfile', metavar="CONFIG_FILE", type=str, default="./config/mitmf.conf", help="Specify config file to use")
|
||||
mgroup.add_argument('-m', '--manual-iptables', dest='manualiptables', action='store_true', default=False, help='Do not setup iptables or flush them automatically')
|
||||
|
||||
#add sslstrip options
|
||||
#Add sslstrip options
|
||||
sgroup = parser.add_argument_group("SSLstrip", "Options for SSLstrip library")
|
||||
slogopts = sgroup.add_mutually_exclusive_group()
|
||||
slogopts.add_argument("-p", "--post", action="store_true",help="Log only SSL POSTs. (default)")
|
||||
slogopts.add_argument("-s", "--ssl", action="store_true", help="Log all SSL traffic to and from server.")
|
||||
slogopts.add_argument("-a", "--all", action="store_true", help="Log all SSL and HTTP traffic to and from server.")
|
||||
sgroup.add_argument("-l", "--listen", type=int, metavar="port", default=10000, help="Port to listen on (default 10000)")
|
||||
sgroup.add_argument("-p", "--preserve-cache", action="store_true", help="Don't kill client/server caching")
|
||||
sgroup.add_argument("-l", dest='listen_port', type=int, metavar="PORT", default=10000, help="Port to listen on (default 10000)")
|
||||
sgroup.add_argument("-f", "--favicon", action="store_true", help="Substitute a lock favicon on secure requests.")
|
||||
sgroup.add_argument("-k", "--killsessions", action="store_true", help="Kill sessions in progress.")
|
||||
|
||||
#Initialize plugins
|
||||
plugin_classes = plugin.Plugin.__subclasses__()
|
||||
#Initialize plugins and pass them the parser NameSpace object
|
||||
plugins = [plugin(parser) for plugin in plugin.Plugin.__subclasses__()]
|
||||
|
||||
plugins = []
|
||||
try:
|
||||
for p in plugin_classes:
|
||||
plugins.append(p())
|
||||
except Exception as e:
|
||||
print "[-] Failed to load plugin class {}: {}".format(p, e)
|
||||
|
||||
|
||||
arg_dict = dict() #dict containing a plugin's optname with it's relative options
|
||||
|
||||
#Give subgroup to each plugin with options
|
||||
try:
|
||||
for p in plugins:
|
||||
if p.desc == "":
|
||||
sgroup = parser.add_argument_group(p.name,"Options for {}.".format(p.name))
|
||||
else:
|
||||
sgroup = parser.add_argument_group(p.name, p.desc)
|
||||
|
||||
sgroup.add_argument("--{}".format(p.optname), action="store_true",help="Load plugin {}".format(p.name))
|
||||
|
||||
if p.has_opts:
|
||||
p.pluginOptions(sgroup)
|
||||
|
||||
arg_dict[p.optname] = vars(sgroup)['_group_actions']
|
||||
|
||||
except NotImplementedError:
|
||||
sys.exit("[-] {} plugin claimed option support, but didn't have it.".format(p.name))
|
||||
|
||||
if len(sys.argv) is 1:
|
||||
if len(sys.argv) == 1:
|
||||
parser.print_help()
|
||||
sys.exit(1)
|
||||
|
||||
args = parser.parse_args()
|
||||
options = parser.parse_args()
|
||||
|
||||
# Definitely a better way to do this, will need to clean this up in the future
|
||||
# Checks to see if we called a plugin's options without first invoking the actual plugin
|
||||
for plugin, options in arg_dict.iteritems():
|
||||
if vars(args)[plugin] is False:
|
||||
for option in options:
|
||||
if vars(args)[option.dest]:
|
||||
sys.exit("[-] Called plugin options without invoking the actual plugin (--{})".format(plugin))
|
||||
#Check to see if we supplied a valid interface, pass the IP and MAC to the NameSpace object
|
||||
options.ip = SystemConfig.getIP(options.interface)
|
||||
options.mac = SystemConfig.getMAC(options.interface)
|
||||
|
||||
#check to see if we supplied a valid interface
|
||||
myip = SystemConfig.getIP(args.interface)
|
||||
mymac = SystemConfig.getMAC(args.interface)
|
||||
#Set the log level
|
||||
logger().log_level = logging.__dict__[options.log_level.upper()]
|
||||
formatter = logging.Formatter("%(asctime)s %(message)s", datefmt="%Y-%m-%d %H:%M:%S")
|
||||
log = logger().setup_logger('mitmf', formatter)
|
||||
|
||||
#Start logging
|
||||
log_level = logging.__dict__[args.log_level.upper()]
|
||||
|
||||
logging.basicConfig(level=log_level, format="%(asctime)s %(message)s", datefmt="%Y-%m-%d %H:%M:%S")
|
||||
logFormatter = logging.Formatter("%(asctime)s %(message)s", datefmt="%Y-%m-%d %H:%M:%S")
|
||||
mitmf_logger = logging.getLogger('mitmf')
|
||||
fileHandler = logging.FileHandler("./logs/mitmf.log")
|
||||
fileHandler.setFormatter(logFormatter)
|
||||
mitmf_logger.addHandler(fileHandler)
|
||||
|
||||
#####################################################################################################
|
||||
|
||||
#All our options should be loaded now, initialize the plugins
|
||||
print "[*] MITMf v{} online... initializing plugins".format(mitmf_version)
|
||||
|
||||
for p in plugins:
|
||||
|
||||
#load only the plugins that have been called at the command line
|
||||
if vars(args)[p.optname] is True:
|
||||
|
||||
print "|_ {} v{}".format(p.name, p.version)
|
||||
if p.tree_info:
|
||||
for line in xrange(0, len(p.tree_info)):
|
||||
print "| |_ {}".format(p.tree_info.pop())
|
||||
|
||||
p.initialize(args)
|
||||
|
||||
if p.tree_info:
|
||||
for line in xrange(0, len(p.tree_info)):
|
||||
print "| |_ {}".format(p.tree_info.pop())
|
||||
|
||||
ProxyPlugins.getInstance().addPlugin(p)
|
||||
|
||||
#Plugins are ready to go, let's rock & roll
|
||||
from core.sslstrip.CookieCleaner import CookieCleaner
|
||||
from core.sergioproxy.ProxyPlugins import ProxyPlugins
|
||||
from core.sslstrip.StrippingProxy import StrippingProxy
|
||||
from core.sslstrip.URLMonitor import URLMonitor
|
||||
|
||||
URLMonitor.getInstance().setFaviconSpoofing(args.favicon)
|
||||
CookieCleaner.getInstance().setEnabled(args.killsessions)
|
||||
URLMonitor.getInstance().setFaviconSpoofing(options.favicon)
|
||||
CookieCleaner.getInstance().setEnabled(options.killsessions)
|
||||
|
||||
strippingFactory = http.HTTPFactory(timeout=10)
|
||||
strippingFactory.protocol = StrippingProxy
|
||||
|
||||
reactor.listenTCP(args.listen, strippingFactory)
|
||||
reactor.listenTCP(options.listen_port, strippingFactory)
|
||||
|
||||
for p in ProxyPlugins.getInstance().plist:
|
||||
#All our options should be loaded now, start initializing the plugins
|
||||
print "[*] MITMf v0.9.8 - 'The Dark Side'"
|
||||
for plugin in plugins:
|
||||
|
||||
p.pluginReactor(strippingFactory) #we pass the default strippingFactory, so the plugins can use it
|
||||
p.startConfigWatch()
|
||||
#load only the plugins that have been called at the command line
|
||||
if vars(options)[plugin.optname] is True:
|
||||
|
||||
if hasattr(p, 'startThread'):
|
||||
t = threading.Thread(name='{}-Thread'.format(p.name), target=p.startThread)
|
||||
t.setDaemon(True)
|
||||
t.start()
|
||||
print "|_ {} v{}".format(plugin.name, plugin.version)
|
||||
if plugin.tree_info:
|
||||
for line in xrange(0, len(plugin.tree_info)):
|
||||
print "| |_ {}".format(plugin.tree_info.pop())
|
||||
|
||||
plugin.initialize(options)
|
||||
|
||||
if plugin.tree_info:
|
||||
for line in xrange(0, len(plugin.tree_info)):
|
||||
print "| |_ {}".format(plugin.tree_info.pop())
|
||||
|
||||
ProxyPlugins.getInstance().addPlugin(plugin)
|
||||
plugin.reactor(strippingFactory)
|
||||
plugin.setup_logger()
|
||||
plugin.start_config_watch()
|
||||
|
||||
print "|"
|
||||
print "|_ Sergio-Proxy v{} online".format(sergio_version)
|
||||
print "|_ SSLstrip v{} by Moxie Marlinspike online".format(sslstrip_version)
|
||||
print "|_ Sergio-Proxy v0.2.1 online"
|
||||
print "|_ SSLstrip v0.9 by Moxie Marlinspike online"
|
||||
|
||||
#Start Net-Creds
|
||||
from core.netcreds.NetCreds import NetCreds
|
||||
NetCreds().start(args.interface, myip)
|
||||
NetCreds().start(options.interface)
|
||||
print "|_ Net-Creds v{} online".format(NetCreds.version)
|
||||
|
||||
#Start DNSChef
|
||||
|
@ -184,8 +128,8 @@ print "|_ DNSChef v{} online".format(DNSChef.version)
|
|||
|
||||
#Start the SMB server
|
||||
from core.servers.smb.SMBserver import SMBserver
|
||||
print "|_ SMB server online [Mode: {}] (Impacket {}) \n".format(SMBserver.getInstance().server_type, SMBserver.getInstance().impacket_ver)
|
||||
SMBserver.getInstance().start()
|
||||
print "|_ SMB server online [Mode: {}] (Impacket {}) \n".format(SMBserver.getInstance().server_type, SMBserver.getInstance().impacket_ver)
|
||||
|
||||
#start the reactor
|
||||
reactor.run()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue