dissect.target 3.20.2.dev18__py3-none-any.whl → 3.20.2.dev20__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.
@@ -315,9 +315,18 @@ class JournalFile:
315
315
  offset = self.header.entry_array_offset
316
316
  while offset != 0:
317
317
  self.fh.seek(offset)
318
+ object_type = self.fh.read(1)[0]
318
319
 
319
- if self.fh.read(1)[0] != c_journal.ObjectType.OBJECT_ENTRY_ARRAY:
320
- raise ValueError(f"Expected OBJECT_ENTRY_ARRAY at offset {offset}")
320
+ if object_type == c_journal.ObjectType.OBJECT_UNUSED:
321
+ self.target.log.warning(
322
+ "ObjectType OBJECT_UNUSED encountered for next OBJECT_ENTRY_ARRAY offset at 0x%X. "
323
+ "This indicates allocated space in the journal file which is not used yet.",
324
+ offset,
325
+ )
326
+ break
327
+
328
+ elif object_type != c_journal.ObjectType.OBJECT_ENTRY_ARRAY:
329
+ raise ValueError(f"Expected OBJECT_ENTRY_ARRAY or OBJECT_UNUSED at offset {offset}")
321
330
 
322
331
  if self.header.incompatible_flags & c_journal.IncompatibleFlag.HEADER_INCOMPATIBLE_COMPACT:
323
332
  entry_array_object = c_journal.EntryArrayObject_Compact(self.fh)
@@ -0,0 +1,118 @@
1
+ from typing import Iterator
2
+
3
+ from dissect.util.ts import wintimestamp
4
+ from flow.record.fieldtypes import windows_path
5
+
6
+ from dissect.target.exceptions import UnsupportedPluginError
7
+ from dissect.target.helpers.descriptor_extensions import (
8
+ RegistryRecordDescriptorExtension,
9
+ UserRecordDescriptorExtension,
10
+ )
11
+ from dissect.target.helpers.record import create_extended_descriptor
12
+ from dissect.target.helpers.regutil import RegistryKey, RegistryValueNotFoundError
13
+ from dissect.target.plugin import Plugin, export
14
+ from dissect.target.target import Target
15
+
16
+ CamRecord = create_extended_descriptor([RegistryRecordDescriptorExtension, UserRecordDescriptorExtension])(
17
+ "windows/registry/cam",
18
+ [
19
+ ("datetime", "ts"),
20
+ ("string", "device"),
21
+ ("string", "app_name"),
22
+ ("path", "path"),
23
+ ("datetime", "last_started"),
24
+ ("datetime", "last_stopped"),
25
+ ("varint", "duration"),
26
+ ],
27
+ )
28
+
29
+
30
+ class CamPlugin(Plugin):
31
+ """Plugin that iterates various Capability Access Manager registry key locations."""
32
+
33
+ CONSENT_STORES = [
34
+ "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\CapabilityAccessManager\\ConsentStore",
35
+ "HKLM\\Software\\Microsoft\\Windows\\CurrentVersion\\CapabilityAccessManager\\ConsentStore",
36
+ ]
37
+
38
+ def __init__(self, target: Target):
39
+ super().__init__(target)
40
+ self.app_regf_keys = self._find_apps()
41
+
42
+ def _find_apps(self) -> list[RegistryKey]:
43
+ apps = []
44
+ for store in self.target.registry.keys(self.CONSENT_STORES):
45
+ for key in store.subkeys():
46
+ apps.append(key)
47
+
48
+ return apps
49
+
50
+ def check_compatible(self) -> None:
51
+ if not self.app_regf_keys:
52
+ raise UnsupportedPluginError("No Capability Access Manager keys found")
53
+
54
+ def yield_apps(self) -> Iterator[RegistryKey]:
55
+ for app in self.app_regf_keys:
56
+ for key in app.subkeys():
57
+ if key.name == "NonPackaged": # NonPackaged registry key has more apps, so yield those apps
58
+ yield from key.subkeys()
59
+ else:
60
+ yield key
61
+
62
+ @export(record=CamRecord)
63
+ def cam(self) -> Iterator[CamRecord]:
64
+ """Iterate Capability Access Manager key locations.
65
+
66
+ The Capability Access Manager keeps track of processes that access I/O devices, like the webcam or microphone.
67
+ Applications are divided into packaged and non-packaged applications meaning Microsoft or
68
+ non-Microsoft applications.
69
+
70
+ References:
71
+ - https://docs.velociraptor.app/exchange/artifacts/pages/windows.registry.capabilityaccessmanager/
72
+ - https://svch0st.medium.com/can-you-track-processes-accessing-the-camera-and-microphone-7e6885b37072
73
+
74
+ Yields ``CamRecord`` with the following fields:
75
+
76
+ .. code-block:: text
77
+
78
+ hostname (string): The target hostname.
79
+ domain (string): The target domain.
80
+ ts (datetime): The modification timestamp of the registry key.
81
+ device (string): Name of the device privacy permission where asked for.
82
+ app_name (string): The name of the application.
83
+ path (path): The possible path to the application.
84
+ last_started (datetime): When the application last started using the device.
85
+ last_stopped (datetime): When the application last stopped using the device.
86
+ duration (datetime): How long the application used the device (seconds).
87
+ """
88
+
89
+ for key in self.yield_apps():
90
+ last_started = None
91
+ last_stopped = None
92
+ duration = None
93
+
94
+ try:
95
+ last_started = wintimestamp(key.value("LastUsedTimeStart").value)
96
+ except RegistryValueNotFoundError:
97
+ self.target.log.warning("No LastUsedTimeStart for application: %s", key.name)
98
+
99
+ try:
100
+ last_stopped = wintimestamp(key.value("LastUsedTimeStop").value)
101
+ except RegistryValueNotFoundError:
102
+ self.target.log.warning("No LastUsedTimeStop for application: %s", key.name)
103
+
104
+ if last_started and last_stopped:
105
+ duration = (last_stopped - last_started).seconds
106
+
107
+ yield CamRecord(
108
+ ts=key.ts,
109
+ device=key.path.split("\\")[-2],
110
+ app_name=key.name,
111
+ path=windows_path(key.name.replace("#", "\\")) if "#" in key.name else None,
112
+ last_started=last_started,
113
+ last_stopped=last_stopped,
114
+ duration=duration,
115
+ _target=self.target,
116
+ _key=key,
117
+ _user=self.target.registry.get_user(key),
118
+ )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: dissect.target
3
- Version: 3.20.2.dev18
3
+ Version: 3.20.2.dev20
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
@@ -272,7 +272,7 @@ dissect/target/plugins/os/unix/log/atop.py,sha256=zjG5eKS-X0mpBXs-Sg2f7RfQvtjt0T
272
272
  dissect/target/plugins/os/unix/log/audit.py,sha256=rZwxC90Q0FOB5BZxplTJwCTIp0hdVpaps1e3C1fRYaM,3754
273
273
  dissect/target/plugins/os/unix/log/auth.py,sha256=MNfPoGo_pGFMizbF5ZyW6bi-QWCxuaB7OVAeIJAAC6M,13068
274
274
  dissect/target/plugins/os/unix/log/helpers.py,sha256=3_UNw36isxlmIRs0EreU4Oe5UrKOPl-mApjvfRXmYtQ,1775
275
- dissect/target/plugins/os/unix/log/journal.py,sha256=hhsvKs78BPv0vJN360fKVHqyBCdLUWxdv6ZUa4tqpD8,17795
275
+ dissect/target/plugins/os/unix/log/journal.py,sha256=yqkJZz5A8FnICT9dmBDL_hZCR_W8J-vPz-mNWhiE50g,18229
276
276
  dissect/target/plugins/os/unix/log/lastlog.py,sha256=Wr3-2n1-GwckN9mSx-yM55N6_L0PQyx6TGHoEvuc6c0,2515
277
277
  dissect/target/plugins/os/unix/log/messages.py,sha256=GjHqbbyoqXxIlD6cxK552Gv00LK399dU3u9NISGIVno,5787
278
278
  dissect/target/plugins/os/unix/log/utmp.py,sha256=k2A69s2qUT2JunJrH8GO6nQ0zMDotXMTaj8OzQ7ljj8,7336
@@ -339,6 +339,7 @@ dissect/target/plugins/os/windows/regf/applications.py,sha256=AZwaLXsVmqMjoZYI3d
339
339
  dissect/target/plugins/os/windows/regf/appxdebugkeys.py,sha256=X8MYLcD76pIZoIWwS_DgUp6q6pi2WO7jhZeoc4uGLak,3966
340
340
  dissect/target/plugins/os/windows/regf/auditpol.py,sha256=vTqWw0_vu9p_emWC8FuYcYQpOXhEFQQDLV0K6-18i9c,5208
341
341
  dissect/target/plugins/os/windows/regf/bam.py,sha256=jJ0i-82uteBU0hPgs81f8NV8NCeRtIklK82Me2S_ro0,2131
342
+ dissect/target/plugins/os/windows/regf/cam.py,sha256=e0y4mhWBfgMIRvOxybLFGZ3ztH3tyqvv5wY5uVEDatI,4717
342
343
  dissect/target/plugins/os/windows/regf/cit.py,sha256=WYuwzTJKSR8Ki0582zpTpRUApx_J3OIYFWivKgqH-Is,39178
343
344
  dissect/target/plugins/os/windows/regf/clsid.py,sha256=ellokL8H7TR8XkGqqWraJ3bL0qP5RJrjNsp4JeBLU7A,3810
344
345
  dissect/target/plugins/os/windows/regf/firewall.py,sha256=86JvlBc418nHB5l3IkbEnTw6zr-H5pEGEoZ8fBhmeLE,3231
@@ -383,10 +384,10 @@ dissect/target/volumes/luks.py,sha256=OmCMsw6rCUXG1_plnLVLTpsvE1n_6WtoRUGQbpmu1z
383
384
  dissect/target/volumes/lvm.py,sha256=wwQVR9I3G9YzmY6UxFsH2Y4MXGBcKL9aayWGCDTiWMU,2269
384
385
  dissect/target/volumes/md.py,sha256=7ShPtusuLGaIv27SvEETtgsuoQyAa4iAAeOR1NEaajI,1689
385
386
  dissect/target/volumes/vmfs.py,sha256=-LoUbn9WNwTtLi_4K34uV_-wDw2W5hgaqxZNj4UmqAQ,1730
386
- dissect.target-3.20.2.dev18.dist-info/COPYRIGHT,sha256=m-9ih2RVhMiXHI2bf_oNSSgHgkeIvaYRVfKTwFbnJPA,301
387
- dissect.target-3.20.2.dev18.dist-info/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
388
- dissect.target-3.20.2.dev18.dist-info/METADATA,sha256=00TFdFOMCgSoK2idKSkrM1feUK6d3CjowDYf0zIcOpE,13184
389
- dissect.target-3.20.2.dev18.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
390
- dissect.target-3.20.2.dev18.dist-info/entry_points.txt,sha256=yQwLCWUuzHgS6-sfCcRk66gAfoCfqXdCjqKjvhnQW8o,537
391
- dissect.target-3.20.2.dev18.dist-info/top_level.txt,sha256=Mn-CQzEYsAbkxrUI0TnplHuXnGVKzxpDw_po_sXpvv4,8
392
- dissect.target-3.20.2.dev18.dist-info/RECORD,,
387
+ dissect.target-3.20.2.dev20.dist-info/COPYRIGHT,sha256=m-9ih2RVhMiXHI2bf_oNSSgHgkeIvaYRVfKTwFbnJPA,301
388
+ dissect.target-3.20.2.dev20.dist-info/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
389
+ dissect.target-3.20.2.dev20.dist-info/METADATA,sha256=Xh9BV6ePzGHHJ7vBbCfvDhl3glgksX268sM4k1Jb9D0,13184
390
+ dissect.target-3.20.2.dev20.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
391
+ dissect.target-3.20.2.dev20.dist-info/entry_points.txt,sha256=yQwLCWUuzHgS6-sfCcRk66gAfoCfqXdCjqKjvhnQW8o,537
392
+ dissect.target-3.20.2.dev20.dist-info/top_level.txt,sha256=Mn-CQzEYsAbkxrUI0TnplHuXnGVKzxpDw_po_sXpvv4,8
393
+ dissect.target-3.20.2.dev20.dist-info/RECORD,,