def _parse_headers(self, lines): raw_headers = [line.split(":", 1) for line in lines[1:]] headers = { entry.strip(): header.strip() for entry, header in raw_headers } client_info = {} # Platform-Info is required, fail if not present client_info["Platform-Info"] = headers["Platform-Info"] # Everything else is optional if "Installation-ID" in headers: client_info["Installation-ID"] = headers["Installation-ID"] if "Attack-Probability" in headers: value = float(headers["Attack-Probability"]) if value < 0 or value > 1.0: raise ValueError("Attack-Probability outside range") client_info["Attack-Probability"] = value if "Attacks" in headers: attacks = headers["Attacks"].split(",") attacks = map(str.strip, attacks) client_info["Attacks"] = preconditions.filter_preconditions([ handlers.connection.handlers.map[attack] for attack in attacks if attack in handlers.connection.handlers.map ]) if "Data-Attacks" in headers: attacks = headers["Data-Attacks"].split(",") attacks = map(str.strip, attacks) client_info["Data-Attacks"] = preconditions.filter_preconditions([ handlers.data.handlers.map[attack] for attack in attacks if attack in handlers.data.handlers.map ]) # Store the raw headers as well in case a handler needs something the # client sent in an additional header client_info["headers"] = headers self.info = client_info
def run(): args = parse_args() setup_logging(args) extras.extras_dir = args.extrasdir selector = build_selector(args.all) attack_cls = [handlers.connection.handlers.map[name] for name in args.attacks] attack_cls = preconditions.filter_preconditions(attack_cls, logger) data_cls = [handlers.data.handlers.map[name] for name in args.data] data_cls = preconditions.filter_preconditions(data_cls, logger) ssl_selector = build_ssl_selector(attack_cls, args.probability, args.all) data_selector = build_data_selector(data_cls, args.all, prob_attack=args.probability) logger.info("Starting...") try: signal.signal(signal.SIGTERM, sigterm_handler) mode = modes[args.mode] if mode.setup: mode.setup(args) blame = ( build_blame( args.cport, args.serverssl, args.probability, attack_cls, data_cls)) server = ( build_server( args.port, blame, selector, ssl_selector, data_selector, args.block, args.ipv6, mode.cls)) blame.start_listening() server.start_listening() # Run the main loop looper = MitmLoop(blame, server) looper.run() except KeyboardInterrupt: server.shutdown() blame.shutdown() except Exception as e: logger.exception("Uncaught top level exception!") logger.fatal("EXITING")
def _parse_headers(self, lines): raw_headers = [line.split(":", 1) for line in lines[1:]] headers = {entry.strip(): header.strip() for entry, header in raw_headers} client_info = {} # Platform-Info is required, fail if not present client_info["Platform-Info"] = headers["Platform-Info"] # Everything else is optional if "Installation-ID" in headers: client_info["Installation-ID"] = headers["Installation-ID"] if "Attack-Probability" in headers: value = float(headers["Attack-Probability"]) if value < 0 or value > 1.0: raise ValueError("Attack-Probability outside range") client_info["Attack-Probability"] = value if "Attacks" in headers: attacks = headers["Attacks"].split(",") attacks = map(str.strip, attacks) client_info["Attacks"] = preconditions.filter_preconditions([ handlers.connection.handlers.map[attack] for attack in attacks if attack in handlers.connection.handlers.map]) if "Data-Attacks" in headers: attacks = headers["Data-Attacks"].split(",") attacks = map(str.strip, attacks) client_info["Data-Attacks"] = preconditions.filter_preconditions( [handlers.data.handlers.map[attack] for attack in attacks if attack in handlers.data.handlers.map]) # Store the raw headers as well in case a handler needs something the # client sent in an additional header client_info["headers"] = headers self.info = client_info