Пример #1
0
    def testBasicConversion(self):
        conn1 = rdf_client_network.NetworkConnection(
            state=rdf_client_network.NetworkConnection.State.LISTEN,
            type=rdf_client_network.NetworkConnection.Type.SOCK_STREAM,
            local_address=rdf_client_network.NetworkEndpoint(ip="0.0.0.0",
                                                             port=22),
            remote_address=rdf_client_network.NetworkEndpoint(ip="0.0.0.0",
                                                              port=0),
            pid=2136,
            ctime=0)
        conn2 = rdf_client_network.NetworkConnection(
            state=rdf_client_network.NetworkConnection.State.LISTEN,
            type=rdf_client_network.NetworkConnection.Type.SOCK_STREAM,
            local_address=rdf_client_network.NetworkEndpoint(ip="192.168.1.1",
                                                             port=31337),
            remote_address=rdf_client_network.NetworkEndpoint(ip="1.2.3.4",
                                                              port=6667),
            pid=1,
            ctime=0)

        proc = rdf_client.Process(pid=2,
                                  ppid=1,
                                  cmdline=["cmd.exe"],
                                  exe="c:\\windows\\cmd.exe",
                                  ctime=1333718907167083,
                                  connections=[conn1, conn2])

        converter = process.ProcessToExportedNetworkConnectionConverter()
        results = list(converter.Convert(self.metadata, proc))

        self.assertLen(results, 2)
        self.assertEqual(results[0].state,
                         rdf_client_network.NetworkConnection.State.LISTEN)
        self.assertEqual(results[0].type,
                         rdf_client_network.NetworkConnection.Type.SOCK_STREAM)
        self.assertEqual(results[0].local_address.ip, "0.0.0.0")
        self.assertEqual(results[0].local_address.port, 22)
        self.assertEqual(results[0].remote_address.ip, "0.0.0.0")
        self.assertEqual(results[0].remote_address.port, 0)
        self.assertEqual(results[0].pid, 2136)
        self.assertEqual(results[0].ctime, 0)

        self.assertEqual(results[1].state,
                         rdf_client_network.NetworkConnection.State.LISTEN)
        self.assertEqual(results[1].type,
                         rdf_client_network.NetworkConnection.Type.SOCK_STREAM)
        self.assertEqual(results[1].local_address.ip, "192.168.1.1")
        self.assertEqual(results[1].local_address.port, 31337)
        self.assertEqual(results[1].remote_address.ip, "1.2.3.4")
        self.assertEqual(results[1].remote_address.port, 6667)
        self.assertEqual(results[1].pid, 1)
        self.assertEqual(results[1].ctime, 0)
Пример #2
0
  def testWhenFetchingFiltersOutProcessesWithoutExeAndConnectionState(self):
    client_id = self.SetupClient(0)
    p1 = rdf_client.Process(
        pid=2, ppid=1, cmdline=["test_img.dd"], ctime=1333718907167083)

    p2 = rdf_client.Process(
        pid=2,
        ppid=1,
        cmdline=["cmd.exe"],
        exe="c:\\windows\\cmd.exe",
        ctime=1333718907167083,
        connections=[
            rdf_client_network.NetworkConnection(
                family="INET", state="ESTABLISHED")
        ])

    client_mock = action_mocks.ListProcessesMock([p1, p2])

    session_id = flow_test_lib.TestFlowHelper(
        flow_processes.ListProcesses.__name__,
        client_mock,
        fetch_binaries=True,
        client_id=client_id,
        connection_states=["LISTEN"],
        creator=self.test_username)

    # No output matched.
    processes = flow_test_lib.GetFlowResults(client_id, session_id)
    self.assertEmpty(processes)
Пример #3
0
    def Start(cls, args):
        for proc in psutil.process_iter():
            try:
                connections = proc.connections()
            except (psutil.NoSuchProcess, psutil.AccessDenied):
                continue

            for conn in connections:
                if args.listening_only and conn.status != "LISTEN":
                    continue

                res = rdf_client_network.NetworkConnection()
                res.pid = proc.pid
                res.process_name = proc.name()
                res.family = conn.family
                res.type = conn.type
                try:
                    if conn.status:
                        res.state = conn.status
                except ValueError:
                    logging.warn("Encountered unknown connection status (%s).",
                                 conn.status)

                res.local_address.ip, res.local_address.port = conn.laddr
                if conn.raddr:
                    res.remote_address.ip, res.remote_address.port = conn.raddr

                yield res
Пример #4
0
  def testPaginationNavigation(self):
    flow_args = network.NetstatArgs(listening_only=True)
    flow_id = flow_test_lib.StartFlow(
        network.Netstat,
        creator=self.test_username,
        client_id=self.client_id,
        flow_args=flow_args)

    self.Open(f"/v2/clients/{self.client_id}")
    self.WaitUntil(self.IsElementPresent,
                   "css=result-accordion .title:contains('Listening only')")

    flow_test_lib.AddResultsToFlow(self.client_id, flow_id, [
        rdf_client_network.NetworkConnection(process_name=f"process{i}")
        for i in range(15)
    ])

    self.Click("css=result-accordion .title:contains('Listening only')")
    for i in range(10):
      self.WaitUntil(self.IsElementPresent, f"css=td:contains('process{i}')")
    self.assertEqual(self.GetCssCount("css=td:contains('process')"), 10)

    # Navigation works in both top and bottom paginators.
    self.Click("css=.top-paginator .mat-paginator-navigation-last")
    for i in range(10, 15):
      self.WaitUntil(self.IsElementPresent, f"css=td:contains('process{i}')")
    self.assertEqual(self.GetCssCount("css=td:contains('process')"), 5)

    self.ScrollToBottom()
    self.Click("css=.bottom-paginator .mat-paginator-navigation-previous")
    for i in range(10):
      self.WaitUntil(self.IsElementPresent, f"css=td:contains('process{i}')")
    self.assertEqual(self.GetCssCount("css=td:contains('process')"), 10)
Пример #5
0
  def testSorting(self):
    flow_args = network.NetstatArgs(listening_only=True)
    flow_id = flow_test_lib.StartFlow(
        network.Netstat,
        creator=self.test_username,
        client_id=self.client_id,
        flow_args=flow_args)

    self.Open(f"/v2/clients/{self.client_id}")
    self.WaitUntil(self.IsElementPresent,
                   "css=result-accordion .title:contains('Listening only')")

    flow_test_lib.AddResultsToFlow(self.client_id, flow_id, [
        rdf_client_network.NetworkConnection(process_name=f"process{i}")
        for i in range(3)
    ])

    self.Click("css=result-accordion .title:contains('Listening only')")
    for i in range(3):
      self.WaitUntil(self.IsElementPresent, f"css=td:contains('process{i}')")

    self.Click("css=.mat-sort-header:contains('Process Name')")
    for i in [0, 1, 2]:  # reordered results asc
      self.WaitUntil(self.IsElementPresent, f"css=td:contains('process{i}')")

    self.Click("css=.mat-sort-header:contains('Process Name')")
    for i in [2, 1, 0]:  # reordered results desc
      self.WaitUntil(self.IsElementPresent, f"css=td:contains('process{i}')")
Пример #6
0
def ListNetworkConnectionsFromClient(args):
  """Gather open network connection stats.

  Args:
    args: An `rdf_client_action.ListNetworkConnectionArgs` instance.

  Yields:
    `rdf_client_network.NetworkConnection` instances.
  """
  for proc in psutil.process_iter():
    try:
      connections = proc.connections()
    except (psutil.NoSuchProcess, psutil.AccessDenied):
      continue

    for conn in connections:
      if args.listening_only and conn.status != "LISTEN":
        continue

      res = rdf_client_network.NetworkConnection()
      res.pid = proc.pid
      res.process_name = proc.name()
      res.family = conn.family
      res.type = conn.type
      try:
        if conn.status:
          res.state = conn.status
      except ValueError:
        logging.warn("Encountered unknown connection status (%s).", conn.status)

      res.local_address.ip, res.local_address.port = conn.laddr
      if conn.raddr:
        res.remote_address.ip, res.remote_address.port = conn.raddr

      yield res
Пример #7
0
    def testProcessListingFilterConnectionState(self):
        client_id = self.SetupClient(0)
        p1 = rdf_client.Process(pid=2,
                                ppid=1,
                                cmdline=["cmd.exe"],
                                exe="c:\\windows\\cmd.exe",
                                ctime=1333718907167083,
                                connections=[
                                    rdf_client_network.NetworkConnection(
                                        family="INET", state="CLOSED")
                                ])
        p2 = rdf_client.Process(pid=3,
                                ppid=1,
                                cmdline=["cmd2.exe"],
                                exe="c:\\windows\\cmd2.exe",
                                ctime=1333718907167083,
                                connections=[
                                    rdf_client_network.NetworkConnection(
                                        family="INET", state="LISTEN")
                                ])
        p3 = rdf_client.Process(pid=4,
                                ppid=1,
                                cmdline=["missing_exe.exe"],
                                ctime=1333718907167083,
                                connections=[
                                    rdf_client_network.NetworkConnection(
                                        family="INET", state="ESTABLISHED")
                                ])
        client_mock = action_mocks.ListProcessesMock([p1, p2, p3])

        flow_urn = flow.StartFlow(
            client_id=client_id,
            flow_name=flow_processes.ListProcesses.__name__,
            connection_states=["ESTABLISHED", "LISTEN"],
            token=self.token)
        session_id = flow_test_lib.TestFlowHelper(flow_urn,
                                                  client_mock,
                                                  client_id=client_id,
                                                  token=self.token)

        processes = flow.GRRFlow.ResultCollectionForFID(session_id)
        self.assertEqual(len(processes), 2)
        states = set()
        for process in processes:
            states.add(str(process.connections[0].state))
        self.assertItemsEqual(states, ["ESTABLISHED", "LISTEN"])
Пример #8
0
 def Listener(ip, port, family):
     conn = rdf_client_network.NetworkConnection()
     conn.state = rdf_client_network.NetworkConnection.State.LISTEN
     conn.family = family
     conn.type = rdf_client_network.NetworkConnection.Type.SOCK_STREAM
     conn.local_address.ip = ip
     conn.port = port
     return conn
Пример #9
0
 def AddListener(self, ip, port, family="INET", sock_type="SOCK_STREAM"):
   """Create a network connection."""
   conn = rdf_client_network.NetworkConnection()
   conn.state = "LISTEN"
   conn.family = family
   conn.type = sock_type
   conn.local_address = rdf_client_network.NetworkEndpoint(ip=ip, port=port)
   return conn
Пример #10
0
  def testProcessListingFilterConnectionState(self):
    client_id = self.SetupClient(0)
    p1 = rdf_client.Process(
        pid=2,
        ppid=1,
        cmdline=["cmd.exe"],
        exe="c:\\windows\\cmd.exe",
        ctime=1333718907167083,
        connections=[
            rdf_client_network.NetworkConnection(family="INET", state="CLOSED")
        ])
    p2 = rdf_client.Process(
        pid=3,
        ppid=1,
        cmdline=["cmd2.exe"],
        exe="c:\\windows\\cmd2.exe",
        ctime=1333718907167083,
        connections=[
            rdf_client_network.NetworkConnection(family="INET", state="LISTEN")
        ])
    p3 = rdf_client.Process(
        pid=4,
        ppid=1,
        cmdline=["missing_exe.exe"],
        ctime=1333718907167083,
        connections=[
            rdf_client_network.NetworkConnection(
                family="INET", state="ESTABLISHED")
        ])
    client_mock = action_mocks.ListProcessesMock([p1, p2, p3])

    session_id = flow_test_lib.TestFlowHelper(
        compatibility.GetName(flow_processes.ListProcesses),
        client_mock,
        client_id=client_id,
        creator=self.test_username,
        connection_states=["ESTABLISHED", "LISTEN"])

    processes = flow_test_lib.GetFlowResults(client_id, session_id)
    self.assertLen(processes, 2)
    states = set()
    for process in processes:
      states.add(str(process.connections[0].state))
    self.assertCountEqual(states, ["ESTABLISHED", "LISTEN"])
Пример #11
0
  def ListNetworkConnections(self, _):
    """Returns fake connections."""
    conn1 = rdf_client_network.NetworkConnection(
        state=rdf_client_network.NetworkConnection.State.CLOSED,
        type=rdf_client_network.NetworkConnection.Type.SOCK_STREAM,
        local_address=rdf_client_network.NetworkEndpoint(ip="0.0.0.0", port=22),
        remote_address=rdf_client_network.NetworkEndpoint(ip="0.0.0.0", port=0),
        pid=2136,
        ctime=0)
    conn2 = rdf_client_network.NetworkConnection(
        state=rdf_client_network.NetworkConnection.State.LISTEN,
        type=rdf_client_network.NetworkConnection.Type.SOCK_STREAM,
        local_address=rdf_client_network.NetworkEndpoint(
            ip="192.168.1.1", port=31337),
        remote_address=rdf_client_network.NetworkEndpoint(
            ip="1.2.3.4", port=6667),
        pid=1,
        ctime=0)

    return [conn1, conn2]
Пример #12
0
  def testFiltering(self):
    flow_id = flow_test_lib.StartFlow(
        network.Netstat, creator=self.test_username, client_id=self.client_id)

    self.Open(f"/v2/clients/{self.client_id}")
    self.WaitUntil(self.IsElementPresent,
                   "css=result-accordion .title:contains('All connections')")

    flow_test_lib.AddResultsToFlow(self.client_id, flow_id, [
        rdf_client_network.NetworkConnection(process_name=f"process{i}")
        for i in range(10)
    ])

    self.Click("css=result-accordion .title:contains('All connections')")
    for i in range(10):
      self.WaitUntil(self.IsElementPresent, f"css=td:contains('process{i}')")

    self.Type("css=.filter-input input", "process0")
    self.WaitUntil(self.IsElementPresent, "css=td:contains('process0')")
    self.assertEqual(self.GetCssCount("css=td:contains('process')"), 1)
Пример #13
0
  def testPaginationSize(self):
    flow_args = network.NetstatArgs(listening_only=False)
    flow_id = flow_test_lib.StartFlow(
        network.Netstat,
        creator=self.test_username,
        client_id=self.client_id,
        flow_args=flow_args)

    self.Open(f"/v2/clients/{self.client_id}")
    self.WaitUntil(self.IsElementPresent,
                   "css=result-accordion .title:contains('All connections')")

    flow_test_lib.AddResultsToFlow(self.client_id, flow_id, [
        rdf_client_network.NetworkConnection(process_name=f"process{i}")
        for i in range(15)
    ])

    self.Click("css=result-accordion .title:contains('All connections')")
    for i in range(10):
      self.WaitUntil(self.IsElementPresent, f"css=td:contains('process{i}')")
    self.assertEqual(self.GetCssCount("css=td:contains('process')"), 10)

    # Select one paginator updates the other paginator as well as the displayed
    # rows.
    self.MatSelect("css=.bottom-paginator mat-select", "50")
    self.WaitUntilContains("50", self.GetText, "css=.top-paginator mat-select")
    self.WaitUntilContains("50", self.GetText,
                           "css=.bottom-paginator mat-select")
    for i in range(15):
      self.WaitUntil(self.IsElementPresent, f"css=td:contains('process{i}')")
    self.assertEqual(self.GetCssCount("css=td:contains('process')"), 15)

    self.MatSelect("css=.top-paginator mat-select", "10")
    self.WaitUntilContains("10", self.GetText, "css=.top-paginator mat-select")
    self.WaitUntilContains("10", self.GetText,
                           "css=.bottom-paginator mat-select")
    for i in range(10):
      self.WaitUntil(self.IsElementPresent, f"css=td:contains('process{i}')")
    self.assertEqual(self.GetCssCount("css=td:contains('process')"), 10)