actually add mac_netstat plugin

This commit is contained in:
Andrew Case
2019-02-26 22:20:33 +00:00
committed by ikelos
parent 6d2a5fbfaa
commit c5cc88b245
+102
View File
@@ -0,0 +1,102 @@
"""A module containing a collection of plugins that produce data
typically found in Linux's /proc file system.
"""
import logging
from volatility.framework import exceptions, renderers
from volatility.framework.automagic import mac
from volatility.framework.interfaces import plugins
from volatility.framework.configuration import requirements
from volatility.framework.objects import utility
from volatility.framework.renderers import format_hints
from volatility.plugins.mac import pslist
vollog = logging.getLogger(__name__)
class Netstat(plugins.PluginInterface):
"""Lists all network connections for all processes"""
@classmethod
def get_requirements(cls):
return [requirements.TranslationLayerRequirement(name = 'primary',
description = 'Kernel Address Space',
architectures = ["Intel32", "Intel64"]),
requirements.SymbolRequirement(name = "darwin",
description = "Mac Kernel")]
def _generator(self, tasks):
for task in tasks:
task_name = utility.array_to_string(task.p_comm)
pid = int(task.p_pid)
for filp, _, _ in mac.MacUtilities.files_descriptors_for_process(self.config, self.context,
task):
try:
ftype = filp.f_fglob.get_fg_type()
except exceptions.PagedInvalidAddressException:
continue
if ftype != 'DTYPE_SOCKET':
continue
try:
socket = filp.f_fglob.fg_data.dereference().cast("socket")
except exceptions.PagedInvalidAddressException:
continue
family = int(socket.get_family())
if family == 1:
try:
upcb = socket.so_pcb.dereference().cast("unpcb")
path = utility.array_to_string(upcb.unp_addr.sun_path)
except exceptions.PagedInvalidAddressException:
continue
yield (0, (format_hints.Hex(socket.vol.offset),
"UNIX",
path,
0,
"",
0,
"",
"{}/{:d}".format(task_name, pid)))
elif family in [2, 30]:
state = socket.get_state()
proto = socket.get_protocol_as_string()
vals = socket.get_converted_connection_info()
if vals:
(lip, lport, rip, rport) = vals
yield (0, (format_hints.Hex(socket.vol.offset),
proto,
lip,
lport,
rip,
rport,
state,
"{}/{:d}".format(task_name, pid)))
def run(self):
#mac.MacUtilities.aslr_mask_symbol_table(self.config, self.context)
filter = pslist.PsList.create_filter([self.config.get('pid', None)])
plugin = pslist.PsList.list_tasks
return renderers.TreeGrid(
[("Offset", format_hints.Hex),
("Proto", str),
("Local IP", str),
("Local Port", int),
("Remote IP", str),
("Remote Port", int),
("State", str),
("Process", str)],
self._generator(plugin(self.context,
self.config['primary'],
self.config['darwin'],
filter = filter)))