dissect.target 3.8.dev38__py3-none-any.whl → 3.8.dev40__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -53,4 +53,13 @@ class VelociraptorLoader(DirLoader):
53
53
 
54
54
  def map(self, target: Target) -> None:
55
55
  os_type, dirs = find_fs_directories(self.path)
56
- map_dirs(target, dirs, os_type)
56
+ if os_type == OperatingSystem.WINDOWS:
57
+ # Velociraptor doesn't have the correct filenames for several files, like $J
58
+ map_dirs(
59
+ target,
60
+ dirs,
61
+ os_type,
62
+ usnjrnl_path="$Extend/$UsnJrnl%3A$J",
63
+ )
64
+ else:
65
+ map_dirs(target, dirs, os_type)
@@ -0,0 +1,141 @@
1
+ import ipaddress
2
+ import re
3
+ from collections import defaultdict
4
+ from pathlib import Path
5
+ from typing import Iterator
6
+
7
+ from dissect.sql import SQLite3
8
+ from dissect.util.ts import from_unix
9
+
10
+ from dissect.target.exceptions import UnsupportedPluginError
11
+ from dissect.target.helpers.record import TargetRecordDescriptor
12
+ from dissect.target.plugin import Plugin, export
13
+
14
+ McAfeeMscLogRecord = TargetRecordDescriptor(
15
+ "application/av/mcafee/msc/log",
16
+ [
17
+ ("datetime", "ts"),
18
+ ("string", "threat"),
19
+ ("string", "message"),
20
+ ("string", "keywords"),
21
+ ("string", "fkey"),
22
+ ],
23
+ )
24
+
25
+ McAfeeMscFirewallRecord = TargetRecordDescriptor(
26
+ "application/av/mcafee/msc/firewall",
27
+ [
28
+ ("datetime", "ts"),
29
+ ("net.ipaddress", "ip"),
30
+ ("uint16", "port"),
31
+ ("string", "protocol"),
32
+ ("string", "message"),
33
+ ("string", "keywords"),
34
+ ("string", "fkey"),
35
+ ],
36
+ )
37
+
38
+ re_cdata = re.compile(r"<!\[CDATA\[(.*?)\]\]>", flags=re.M)
39
+ re_strip_tags = re.compile(r"<[^!][^>]*>")
40
+
41
+
42
+ class McAfeePlugin(Plugin):
43
+ __namespace__ = "mcafee"
44
+
45
+ DIRS = [
46
+ "sysvol/ProgramData/McAfee/MSC/Logs", # Windows
47
+ "/opt/McAfee/ens/log/tp", # Linux/Mac according to docs
48
+ "/opt/McAfee/ens/log/esp", # Linux/Mac according to docs
49
+ ]
50
+ LOG_FILE_PATTERN = "*.log"
51
+ TEMPLATE_ID_INFECTION = 102
52
+ MARKER_INFECTION = "%INFECTION_INFO%"
53
+ MARKER_SUSPICIOUS_TCP_CONNECTION = "TCP port "
54
+ MARKER_SUSPICIOUS_UDP_CONNECTION = "UDP port "
55
+ TABLE_LOG = "log"
56
+ TABLE_FIELD = "field"
57
+
58
+ def check_compatible(self) -> bool:
59
+ if not self.get_log_files():
60
+ raise UnsupportedPluginError("No McAfee Log files found")
61
+
62
+ def get_log_files(self) -> Iterator[Path]:
63
+ for path in self.DIRS:
64
+ yield from self.target.fs.path(path).glob(self.LOG_FILE_PATTERN)
65
+
66
+ def _clean_message(self, message: str) -> str:
67
+ return re.sub(re_strip_tags, "", (" ".join(re.findall(re_cdata, message))))
68
+
69
+ @export(record=McAfeeMscLogRecord)
70
+ def msc(self) -> Iterator[McAfeeMscLogRecord]:
71
+ """Return msc log history records from McAfee.
72
+
73
+ Yields McAfeeMscLogRecord with the following fields:
74
+ hostname (string): The target hostname.
75
+ domain (string): The target domain.
76
+ ts (datetime): timestamp.
77
+ ip (net.ipadress): IP of suspicious connection (if available).
78
+ tcp_port (net.tcp.Port): TCP Port of suspicious incoming connection (if available).
79
+ udp_port (net.udp.Port): UDP Port of suspicious incoming connection (if available).
80
+ threat (string): Description of the detected threat (if available).
81
+ message (string): Message as reported in the user interface (might include template slots).
82
+ keywords (string): Unparsed fields that might be visible in user interface.
83
+ fkey (string): Foreign key for reference for further investigation.
84
+ """
85
+
86
+ len_marker = len(self.MARKER_SUSPICIOUS_UDP_CONNECTION)
87
+
88
+ for log_file in self.get_log_files():
89
+ with log_file.open() as open_log:
90
+ database = SQLite3(open_log)
91
+ fields = defaultdict(dict)
92
+ fields_table = database.table(self.TABLE_FIELD)
93
+
94
+ for field in fields_table.rows():
95
+ fields[field.fkey][field.field_id] = field.data
96
+ log_table = database.table(self.TABLE_LOG)
97
+
98
+ for entry in log_table.rows():
99
+ fkey = entry.fkey
100
+ log_fields = fields[fkey]
101
+ ip = None
102
+ protocol = None
103
+ port = None
104
+ threat = None
105
+
106
+ for key, log_field in log_fields.items():
107
+ try:
108
+ ipaddress.ip_address(log_field)
109
+ ip = log_field
110
+ continue
111
+ except ValueError:
112
+ pass
113
+
114
+ if log_field.startswith(
115
+ (self.MARKER_SUSPICIOUS_TCP_CONNECTION, self.MARKER_SUSPICIOUS_UDP_CONNECTION)
116
+ ):
117
+ port = int(log_field[len_marker:])
118
+ protocol = log_field[:3]
119
+ continue
120
+
121
+ if key == self.TEMPLATE_ID_INFECTION and entry.details_info.find(self.MARKER_INFECTION) > -1:
122
+ threat = log_field
123
+
124
+ if threat:
125
+ yield McAfeeMscLogRecord(
126
+ ts=from_unix(entry.date),
127
+ threat=threat,
128
+ message=self._clean_message(entry.details_info),
129
+ keywords=",".join(log_fields.values()),
130
+ fkey=entry.fkey,
131
+ )
132
+ else:
133
+ yield McAfeeMscFirewallRecord(
134
+ ts=from_unix(entry.date),
135
+ ip=ip,
136
+ protocol=protocol,
137
+ port=port,
138
+ message=self._clean_message(entry.details_info),
139
+ keywords=",".join(log_fields.values()),
140
+ fkey=entry.fkey,
141
+ )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dissect.target
3
- Version: 3.8.dev38
3
+ Version: 3.8.dev40
4
4
  Summary: This module ties all other Dissect modules together, it provides a programming API and command line tools which allow easy access to various data sources inside disk images or file collections (a.k.a. targets)
5
5
  Author-email: Dissect Team <dissect@fox-it.com>
6
6
  License: Affero General Public License v3
@@ -72,12 +72,13 @@ dissect/target/loaders/tar.py,sha256=55chcbh9CDTczSmSPJ3O1FrfpXaZTTPL28Oqih8rPOA
72
72
  dissect/target/loaders/target.py,sha256=mfkNz586eHb1PuzbwrvRPf9CcoPDLm5wPGFT1_rMH5s,662
73
73
  dissect/target/loaders/vb.py,sha256=CnQcn7bAkMzIB1y-lWLtPPXdIVsyeDaT6hTZEurjkV4,2072
74
74
  dissect/target/loaders/vbox.py,sha256=bOxsUiJ0IKx2GETs12FJkYChXBVatSkvWdLmhR5XPZc,691
75
- dissect/target/loaders/velociraptor.py,sha256=rfZXTDm3eSgz29n1GOOswArdRsOf2ctJmSHb8RvCRQ0,2240
75
+ dissect/target/loaders/velociraptor.py,sha256=X-nks-V1QpuEfzDgI0_MPu_Fi--a4BEL6g8dDn_3lHU,2555
76
76
  dissect/target/loaders/vma.py,sha256=sWjkQrdq3zAJyckInhvJVsVfihoU4wLM25RMT8L2KWo,519
77
77
  dissect/target/loaders/vmx.py,sha256=By8AmbBmVd3U13oIZs9_0mVV3tpWNPoJBLmHZXqs1GE,740
78
78
  dissect/target/loaders/xva.py,sha256=66rsZGPwrLOaHtzou5oicYuOdIWQOeKtvvXsGm89dqg,544
79
79
  dissect/target/plugins/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
80
80
  dissect/target/plugins/apps/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
81
+ dissect/target/plugins/apps/av/mcafee.py,sha256=GkMLeprZo5mNqH-Ic1bml8tjoau_10vm7HDmE9nHF5Y,5403
81
82
  dissect/target/plugins/apps/av/trendmicro.py,sha256=v1Gf2CjZVwtr1xOJjHOEiMtfngMkIc84lITgOHXtjB4,4649
82
83
  dissect/target/plugins/apps/containers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
83
84
  dissect/target/plugins/apps/containers/docker.py,sha256=Tro1bR4Mvub3lZlsfIocgr8Is3R7kS-g9iztA9jzObs,6289
@@ -252,10 +253,10 @@ dissect/target/volumes/bde.py,sha256=gYGg5yF9MNARwNzEkrEfZmKkxyZW4rhLkpdnPJCbhGk
252
253
  dissect/target/volumes/disk.py,sha256=95grSsPt1BLVpKwTclwQYzPFGKTkFFqapIk0RoGWf38,968
253
254
  dissect/target/volumes/lvm.py,sha256=zXAfszxNR6tOGrKAtAa_E-JhjI-sXQyR4VYLXD-kqCw,1616
254
255
  dissect/target/volumes/vmfs.py,sha256=mlAJ8278tYaoRjk1u6tFFlCaDQUrVu5ZZE4ikiFvxi8,1707
255
- dissect.target-3.8.dev38.dist-info/COPYRIGHT,sha256=m-9ih2RVhMiXHI2bf_oNSSgHgkeIvaYRVfKTwFbnJPA,301
256
- dissect.target-3.8.dev38.dist-info/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
257
- dissect.target-3.8.dev38.dist-info/METADATA,sha256=ew1Pz3eT-39Um5bKsvAjLbzcwhskP19Dw_2AqAabVZA,9752
258
- dissect.target-3.8.dev38.dist-info/WHEEL,sha256=pkctZYzUS4AYVn6dJ-7367OJZivF2e8RA9b_ZBjif18,92
259
- dissect.target-3.8.dev38.dist-info/entry_points.txt,sha256=tvFPa-Ap-gakjaPwRc6Fl6mxHzxEZ_arAVU-IUYeo_s,447
260
- dissect.target-3.8.dev38.dist-info/top_level.txt,sha256=Mn-CQzEYsAbkxrUI0TnplHuXnGVKzxpDw_po_sXpvv4,8
261
- dissect.target-3.8.dev38.dist-info/RECORD,,
256
+ dissect.target-3.8.dev40.dist-info/COPYRIGHT,sha256=m-9ih2RVhMiXHI2bf_oNSSgHgkeIvaYRVfKTwFbnJPA,301
257
+ dissect.target-3.8.dev40.dist-info/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
258
+ dissect.target-3.8.dev40.dist-info/METADATA,sha256=6qDgBpgS4hDq07AxHuGwssySQBk0doDOKqPsjtADqx4,9752
259
+ dissect.target-3.8.dev40.dist-info/WHEEL,sha256=pkctZYzUS4AYVn6dJ-7367OJZivF2e8RA9b_ZBjif18,92
260
+ dissect.target-3.8.dev40.dist-info/entry_points.txt,sha256=tvFPa-Ap-gakjaPwRc6Fl6mxHzxEZ_arAVU-IUYeo_s,447
261
+ dissect.target-3.8.dev40.dist-info/top_level.txt,sha256=Mn-CQzEYsAbkxrUI0TnplHuXnGVKzxpDw_po_sXpvv4,8
262
+ dissect.target-3.8.dev40.dist-info/RECORD,,