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")
示例#3
0
    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