예제 #1
0
  def CreateHunt(self,
                 flow_runner_args=None,
                 flow_args=None,
                 client_rule_set=None,
                 original_object=None,
                 client_rate=0,
                 duration=None,
                 token=None,
                 **kwargs):
    # Only initialize default flow_args value if default flow_runner_args value
    # is to be used.
    if not flow_runner_args:
      flow_args = (
          flow_args or transfer.GetFileArgs(
              pathspec=rdf_paths.PathSpec(
                  path="/tmp/evil.txt",
                  pathtype=rdf_paths.PathSpec.PathType.OS)))

    flow_runner_args = (
        flow_runner_args or
        rdf_flow_runner.FlowRunnerArgs(flow_name=transfer.GetFile.__name__))

    client_rule_set = (client_rule_set or self._CreateForemanClientRuleSet())

    if data_store.RelationalDBEnabled():
      token = token or self.token

      hunt_args = rdf_hunt_objects.HuntArguments(
          hunt_type=rdf_hunt_objects.HuntArguments.HuntType.STANDARD,
          standard=rdf_hunt_objects.HuntArgumentsStandard(
              flow_name=flow_runner_args.flow_name, flow_args=flow_args))

      hunt_obj = rdf_hunt_objects.Hunt(
          creator=token.username,
          client_rule_set=client_rule_set,
          original_object=original_object,
          client_rate=client_rate,
          duration=duration,
          args=hunt_args,
          **kwargs)
      hunt.CreateHunt(hunt_obj)

      return hunt_obj.hunt_id

    return implementation.StartHunt(
        hunt_name=standard.GenericHunt.__name__,
        flow_runner_args=flow_runner_args,
        flow_args=flow_args,
        client_rule_set=client_rule_set,
        client_rate=client_rate,
        original_object=original_object,
        token=token or self.token,
        **kwargs)
예제 #2
0
파일: hunt.py 프로젝트: secureonelabs/grr
  def Handle(self, args: ApiCreatePerClientFileCollectionHuntArgs,
             context: api_call_context.ApiCallContext):
    if len(args.per_client_args) > self.MAX_CLIENTS:
      raise ValueError(f"At most {self.MAX_CLIENTS} clients can be specified "
                       "in a per-client file collection hunt.")

    if sum(len(pca.paths) for pca in args.per_client_args) > self.MAX_FILES:
      raise ValueError(f"At most {self.MAX_FILES} file paths can be specified "
                       "in a per-client file collection hunt.")

    hunt_obj = rdf_hunt_objects.Hunt(
        args=self._ArgsToHuntArgs(args),
        description=args.description,
        duration=args.duration_secs,
        creator=context.username,
        client_rate=0,
    )
    hunt.CreateHunt(hunt_obj)

    return ApiHunt().InitFromHuntObject(hunt_obj, with_full_summary=True)
예제 #3
0
파일: hunt.py 프로젝트: secureonelabs/grr
  def Handle(self, args, context=None):
    hra = args.hunt_runner_args

    hunt_obj = rdf_hunt_objects.Hunt(
        args=rdf_hunt_objects.HuntArguments.Standard(
            flow_name=args.flow_name,
            flow_args=rdf_structs.AnyValue.Pack(args.flow_args)),
        description=hra.description,
        client_rule_set=hra.client_rule_set,
        client_limit=hra.client_limit,
        crash_limit=hra.crash_limit,
        avg_results_per_client_limit=hra.avg_results_per_client_limit,
        avg_cpu_seconds_per_client_limit=hra.avg_cpu_seconds_per_client_limit,
        avg_network_bytes_per_client_limit=hra
        .avg_network_bytes_per_client_limit,
        duration=hra.expiry_time,
        client_rate=hra.client_rate,
        per_client_cpu_limit=hra.per_client_cpu_limit,
        per_client_network_bytes_limit=hra.per_client_network_limit_bytes,
        creator=context.username,
    )

    if args.original_hunt and args.original_flow:
      raise ValueError(
          "A hunt can't be a copy of a flow and a hunt at the same time.")

    if args.original_hunt:
      ref = rdf_hunts.FlowLikeObjectReference.FromHuntId(
          args.original_hunt.hunt_id)
      hunt_obj.original_object = ref
    elif args.original_flow:
      ref = rdf_hunts.FlowLikeObjectReference.FromFlowIdAndClientId(
          args.original_flow.flow_id, args.original_flow.client_id)
      hunt_obj.original_object = ref

    if hra.HasField("output_plugins"):
      hunt_obj.output_plugins = hra.output_plugins

    hunt.CreateHunt(hunt_obj)

    return ApiHunt().InitFromHuntObject(hunt_obj, with_full_summary=True)
예제 #4
0
    def testHangingClientsAreCorrectlyAccountedFor(self):
        client_ids = self.SetupClients(10)

        hunt_obj = rdf_hunt_objects.Hunt(
            client_rule_set=foreman_rules.ForemanClientRuleSet(),
            client_rate=0,
            args=self.GetFileHuntArgs())
        hunt.CreateHunt(hunt_obj)
        hunt_obj = hunt.StartHunt(hunt_obj.hunt_id)

        foreman_obj = foreman.Foreman()
        for client_id in client_ids:
            foreman_obj.AssignTasksToClient(client_id)

        client_mock = hunt_test_lib.SampleHuntMock(failrate=2)
        hunt_test_lib.TestHuntHelper(client_mock, client_ids[1:9])

        hunt_counters = data_store.REL_DB.ReadHuntCounters(hunt_obj.hunt_id)
        self.assertEqual(hunt_counters.num_clients, 10)
        self.assertEqual(hunt_counters.num_successful_clients, 4)
        self.assertEqual(hunt_counters.num_failed_clients, 4)
예제 #5
0
    def CreateHunt(self,
                   flow_runner_args=None,
                   flow_args=None,
                   client_rule_set=None,
                   original_object=None,
                   client_rate=0,
                   duration=None,
                   creator=None,
                   **kwargs):
        # Only initialize default flow_args value if default flow_runner_args value
        # is to be used.
        if not flow_runner_args:
            flow_args = (flow_args
                         or transfer.GetFileArgs(pathspec=rdf_paths.PathSpec(
                             path="/tmp/evil.txt",
                             pathtype=rdf_paths.PathSpec.PathType.OS)))

        flow_runner_args = (flow_runner_args or rdf_flow_runner.FlowRunnerArgs(
            flow_name=transfer.GetFile.__name__))

        client_rule_set = (client_rule_set
                           or self._CreateForemanClientRuleSet())

        hunt_args = rdf_hunt_objects.HuntArguments.Standard(
            flow_name=flow_runner_args.flow_name,
            flow_args=rdf_structs.AnyValue.Pack(flow_args))

        hunt_obj = rdf_hunt_objects.Hunt(creator=creator,
                                         client_rule_set=client_rule_set,
                                         original_object=original_object,
                                         client_rate=client_rate,
                                         duration=duration,
                                         args=hunt_args,
                                         **kwargs)
        hunt.CreateHunt(hunt_obj)

        return hunt_obj.hunt_id
예제 #6
0
    def _CreateHunt(self, **kwargs):
        hunt_obj = rdf_hunt_objects.Hunt(creator=self.test_username, **kwargs)
        hunt.CreateHunt(hunt_obj)
        hunt_obj = hunt.StartHunt(hunt_obj.hunt_id)

        return hunt_obj.hunt_id