示例#1
0
文件: Fuzzer.py 项目: binarever/tools
    def __init__(self, options):
        self.genReq = options.get("genreq")

        # Get active plugins
        lplugins = None
        if options.get("script_string"):
            lplugins = Facade().get_parsers(options.get("script_string"))

            if not lplugins:
                raise FuzzException(
                    FuzzException.FATAL,
                    "No plugin selected, check the --script name or category introduced."
                )

        recursive = lplugins or options.get("rlevel") > 0
        filtering = options.get('filter_params')['active'] is True

        # Create queues (in reverse order)
        # genReq ---> seed_queue -> http_queue -> [round_robin] -> [plugins_queue] * N -> process_queue -> [routing_queue] -> [filter_queue]---> results_queue
        self.results_queue = MyPriorityQueue()
        self.filter_queue = FilterQ(options.get("filter_params"),
                                    self.results_queue) if filtering else None
        self.routing_queue = RoutingQ(
            None, self.filter_queue
            if filtering else self.results_queue) if recursive else None
        self.process_queue = ProcessorQ(
            options.get("rlevel"), self.genReq.stats,
            self.routing_queue if recursive else
            self.filter_queue if filtering else self.results_queue)
        self.plugins_queue = None
        if lplugins:
            cache = HttpCache()
            self.plugins_queue = RoundRobin([
                JobMan(lplugins, cache, self.process_queue),
                JobMan(lplugins, cache, self.process_queue),
                JobMan(lplugins, cache, self.process_queue)
            ])
        self.http_queue = HttpQueue(
            options, self.plugins_queue if lplugins else self.process_queue)
        self.seed_queue = SeedQ(self.genReq, options.get("sleeper"),
                                self.http_queue)

        # recursion routes
        if recursive:
            self.routing_queue.set_routes({
                "<class 'framework.fuzzer.fuzzobjects.FuzzRequest'>":
                self.seed_queue,
                "framework.plugins.pluginobjects.PluginRequest":
                self.http_queue,
                "framework.fuzzer.fuzzobjects.FuzzResult":
                self.filter_queue if filtering else self.results_queue
            })

        ## initial seed request
        self.seed_queue.put_priority(1, self.genReq)