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

Sign up to get free protection for your applications and to get access to all the features.
@@ -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,,