dissect.target 3.20.dev18__py3-none-any.whl → 3.20.dev20__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
File without changes
@@ -0,0 +1,61 @@
1
+ from typing import Iterator
2
+
3
+ from dissect.target.exceptions import UnsupportedPluginError
4
+ from dissect.target.helpers.descriptor_extensions import UserRecordDescriptorExtension
5
+ from dissect.target.helpers.fsutil import TargetPath
6
+ from dissect.target.helpers.record import create_extended_descriptor
7
+ from dissect.target.plugin import Plugin, alias, export
8
+ from dissect.target.plugins.general.users import UserDetails
9
+ from dissect.target.target import Target
10
+
11
+ VmwareDragAndDropRecord = create_extended_descriptor([UserRecordDescriptorExtension])(
12
+ "virtualization/vmware/clipboard",
13
+ [
14
+ ("datetime", "ts"),
15
+ ("path", "path"),
16
+ ],
17
+ )
18
+
19
+ VMWARE_DND_PATHS = [
20
+ # Windows
21
+ "AppData/Local/Temp/VmwareDND",
22
+ # Linux
23
+ ".cache/vmware/drag_and_drop",
24
+ ]
25
+
26
+
27
+ class VmwareWorkstationPlugin(Plugin):
28
+ """VMware Workstation plugin."""
29
+
30
+ __namespace__ = "vmware"
31
+
32
+ def __init__(self, target: Target):
33
+ super().__init__(target)
34
+ self.dnd_dirs = list(self.find_dnd_dirs())
35
+
36
+ def check_compatible(self) -> None:
37
+ if not self.dnd_dirs:
38
+ raise UnsupportedPluginError("No VMware Workstation DnD artifact(s) found")
39
+
40
+ def find_dnd_dirs(self) -> Iterator[tuple[UserDetails, TargetPath]]:
41
+ for user_details in self.target.user_details.all_with_home():
42
+ for dnd_path in VMWARE_DND_PATHS:
43
+ if (dnd_dir := user_details.home_path.joinpath(dnd_path)).exists():
44
+ yield user_details, dnd_dir
45
+
46
+ @alias("draganddrop")
47
+ @export(record=VmwareDragAndDropRecord)
48
+ def clipboard(self) -> Iterator[VmwareDragAndDropRecord]:
49
+ """Yield cached VMware Workstation drag-and-drop file artifacts."""
50
+
51
+ for user_details, dnd_dir in self.dnd_dirs:
52
+ for file in dnd_dir.rglob("*/*"):
53
+ if file.is_dir():
54
+ continue
55
+
56
+ yield VmwareDragAndDropRecord(
57
+ ts=file.lstat().st_mtime,
58
+ path=file,
59
+ _user=user_details.user,
60
+ _target=self.target,
61
+ )
@@ -1,29 +1,44 @@
1
+ from typing import Iterator
2
+
1
3
  from dissect.target.exceptions import UnsupportedPluginError
4
+ from dissect.target.helpers.fsutil import TargetPath
2
5
  from dissect.target.helpers.record import ChildTargetRecord
3
6
  from dissect.target.plugin import ChildTargetPlugin
7
+ from dissect.target.target import Target
8
+
9
+ INVENTORY_PATHS = [
10
+ # Windows
11
+ "AppData/Roaming/VMware/inventory.vmls",
12
+ # Linux
13
+ ".vmware/inventory.vmls",
14
+ ]
15
+
16
+
17
+ def find_vm_inventory(target: Target) -> Iterator[TargetPath]:
18
+ """Search for inventory.vmls files in user home folders.
4
19
 
20
+ Does not support older vmAutoStart.xml or vmInventory.xml formats."""
5
21
 
6
- def find_vm_inventory(target):
7
22
  for user_details in target.user_details.all_with_home():
8
- inv_file = user_details.home_path.joinpath("AppData/Roaming/VMware/inventory.vmls")
9
- if inv_file.exists():
10
- yield inv_file
23
+ for inv_path in INVENTORY_PATHS:
24
+ if (inv_file := user_details.home_path.joinpath(inv_path)).exists():
25
+ yield inv_file
11
26
 
12
27
 
13
- class WorkstationChildTargetPlugin(ChildTargetPlugin):
28
+ class VmwareWorkstationChildTargetPlugin(ChildTargetPlugin):
14
29
  """Child target plugin that yields from VMware Workstation VM inventory."""
15
30
 
16
31
  __type__ = "vmware_workstation"
17
32
 
18
- def __init__(self, target):
33
+ def __init__(self, target: Target):
19
34
  super().__init__(target)
20
35
  self.inventories = list(find_vm_inventory(target))
21
36
 
22
37
  def check_compatible(self) -> None:
23
- if not len(self.inventories):
38
+ if not self.inventories:
24
39
  raise UnsupportedPluginError("No VMWare inventories found")
25
40
 
26
- def list_children(self):
41
+ def list_children(self) -> Iterator[ChildTargetRecord]:
27
42
  for inv in self.inventories:
28
43
  for line in inv.open("rt"):
29
44
  line = line.strip()
@@ -1410,29 +1410,38 @@ def build_pipe_stdout(pipe_parts: list[str]) -> Iterator[TextIO]:
1410
1410
  yield pipe_stdin
1411
1411
 
1412
1412
 
1413
- def open_shell(targets: list[str | pathlib.Path], python: bool, registry: bool) -> None:
1413
+ def open_shell(targets: list[str | pathlib.Path], python: bool, registry: bool, commands: list[str] | None) -> None:
1414
1414
  """Helper method for starting a regular, Python or registry shell for one or multiple targets."""
1415
1415
  targets = list(Target.open_all(targets))
1416
1416
 
1417
1417
  if python:
1418
- python_shell(targets)
1418
+ python_shell(targets, commands=commands)
1419
1419
  else:
1420
1420
  cli_cls = RegistryCli if registry else TargetCli
1421
- target_shell(targets, cli_cls=cli_cls)
1421
+ target_shell(targets, cli_cls=cli_cls, commands=commands)
1422
1422
 
1423
1423
 
1424
- def target_shell(targets: list[Target], cli_cls: type[TargetCmd]) -> None:
1424
+ def target_shell(targets: list[Target], cli_cls: type[TargetCmd], commands: list[str] | None) -> None:
1425
1425
  """Helper method for starting a :class:`TargetCli` or :class:`TargetHubCli` for one or multiple targets."""
1426
1426
  if cli := create_cli(targets, cli_cls):
1427
+ if commands is not None:
1428
+ for command in commands:
1429
+ cli.onecmd(command)
1430
+ return
1427
1431
  run_cli(cli)
1428
1432
 
1429
1433
 
1430
- def python_shell(targets: list[Target]) -> None:
1434
+ def python_shell(targets: list[Target], commands: list[str] | None) -> None:
1431
1435
  """Helper method for starting a (I)Python shell with multiple targets."""
1432
1436
  banner = "Loaded targets in 'targets' variable. First target is in 't'."
1433
1437
  ns = {"targets": targets, "t": targets[0]}
1434
1438
 
1435
1439
  try:
1440
+ if commands is not None:
1441
+ for command in commands:
1442
+ eval(command, ns)
1443
+ return
1444
+
1436
1445
  import IPython
1437
1446
 
1438
1447
  IPython.embed(header=banner, user_ns=ns, colors="linux")
@@ -1512,7 +1521,7 @@ def main() -> None:
1512
1521
  default=None,
1513
1522
  help="select a specific loader (i.e. vmx, raw)",
1514
1523
  )
1515
-
1524
+ parser.add_argument("-c", "--commands", action="store", nargs="*", help="commands to execute")
1516
1525
  configure_generic_arguments(parser)
1517
1526
  args, rest = parser.parse_known_args()
1518
1527
  args.targets = args_to_uri(args.targets, args.loader, rest) if args.loader else args.targets
@@ -1537,7 +1546,7 @@ def main() -> None:
1537
1546
  )
1538
1547
 
1539
1548
  try:
1540
- open_shell(args.targets, args.python, args.registry)
1549
+ open_shell(args.targets, args.python, args.registry, args.commands)
1541
1550
  except TargetError as e:
1542
1551
  log.error(e)
1543
1552
  log.debug("", exc_info=e)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dissect.target
3
- Version: 3.20.dev18
3
+ Version: 3.20.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
@@ -141,6 +141,8 @@ dissect/target/plugins/apps/ssh/ssh.py,sha256=d3U8PJbtMvOV3K0wV_9KzGt2oRs-mfNQz1
141
141
  dissect/target/plugins/apps/texteditor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
142
142
  dissect/target/plugins/apps/texteditor/texteditor.py,sha256=h-tF1x2hLlgeNM3W-0Z9g0mjjkb9ietT1D5c-9GaMr8,543
143
143
  dissect/target/plugins/apps/texteditor/windowsnotepad.py,sha256=BXGhcwWIW6zlQyD_nHpc1r5Lxt6WMvhfqY2PWf0A6pw,14852
144
+ dissect/target/plugins/apps/virtualization/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
145
+ dissect/target/plugins/apps/virtualization/vmware_workstation.py,sha256=7G-MRZCMN6aSYfs5NpaW2wkezqlx_EXq9-GzdbvtRrk,2088
144
146
  dissect/target/plugins/apps/vpn/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
145
147
  dissect/target/plugins/apps/vpn/openvpn.py,sha256=d-DGINTIHP_bvv3T09ZwbezHXGctvCyAhJ482m2_-a0,7654
146
148
  dissect/target/plugins/apps/vpn/wireguard.py,sha256=SoAMED_bwWJQ3nci5qEY-qV4wJKSSDZQ8K7DoJRYq0k,6521
@@ -160,7 +162,7 @@ dissect/target/plugins/child/hyperv.py,sha256=R2qVeu4p_9V53jO-65znN0LwX9v3FVA-9j
160
162
  dissect/target/plugins/child/parallels.py,sha256=jeBT_NvTQbQBaUjqGWTy2I5Q5OWlrogoyWHRXjOhLis,2255
161
163
  dissect/target/plugins/child/qemu.py,sha256=vNzQwzFO964jYaI67MlX8vpWyHxpegjIU5F29zHKOGI,791
162
164
  dissect/target/plugins/child/virtuozzo.py,sha256=Mx4ZxEl21g7IYkzraw4FBZup5EfrkFDv4WuTE3hxguw,1206
163
- dissect/target/plugins/child/vmware_workstation.py,sha256=8wkA_tSufvBUyp4XQHzRzFETf5ROlyyO_MVS3TExyfw,1570
165
+ dissect/target/plugins/child/vmware_workstation.py,sha256=eLvgi_aFUaMN1tC5X4RN85nKQdsuRQygrFYtNMAERTc,2030
164
166
  dissect/target/plugins/child/wsl.py,sha256=IssQgYET1T-XR5ZX2lGlNFJ_u_3QECpMF_7kXu09HTE,2469
165
167
  dissect/target/plugins/filesystem/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
166
168
  dissect/target/plugins/filesystem/acquire_handles.py,sha256=-pX_akH5GrYe0HofXOa2Il75knZH6ZKgru4BFcrElkM,1731
@@ -351,7 +353,7 @@ dissect/target/tools/logging.py,sha256=5ZnumtMWLyslxfrUGZ4ntRyf3obOOhmn8SBjKfdLc
351
353
  dissect/target/tools/mount.py,sha256=8GRYnu4xEmFBHxuIZAYhOMyyTGX8fat1Ou07DNiUnW4,3945
352
354
  dissect/target/tools/query.py,sha256=e-yAN9zdQjuOiTuoOQoo17mVEQGGcOgaA9YkF4GYpkM,15394
353
355
  dissect/target/tools/reg.py,sha256=FDsiBBDxjWVUBTRj8xn82vZe-J_d9piM-TKS3PHZCcM,3193
354
- dissect/target/tools/shell.py,sha256=0RqcPmOmFEQ0-5Efqm8ZdGbTeZw2OXFFaCGNyCCzUVs,53714
356
+ dissect/target/tools/shell.py,sha256=EBGuQS2PDfDgLPghgAjK1G7zoAjm2Gu6eZ9yz0qsuk4,54198
355
357
  dissect/target/tools/utils.py,sha256=JJZDSso1CEK2sv4Z3HJNgqxH6G9S5lbmV-C3h-XmcMo,12035
356
358
  dissect/target/tools/yara.py,sha256=70k-2VMulf1EdkX03nCACzejaOEcsFHOyX-4E40MdQU,2044
357
359
  dissect/target/tools/dump/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -366,10 +368,10 @@ dissect/target/volumes/luks.py,sha256=OmCMsw6rCUXG1_plnLVLTpsvE1n_6WtoRUGQbpmu1z
366
368
  dissect/target/volumes/lvm.py,sha256=wwQVR9I3G9YzmY6UxFsH2Y4MXGBcKL9aayWGCDTiWMU,2269
367
369
  dissect/target/volumes/md.py,sha256=7ShPtusuLGaIv27SvEETtgsuoQyAa4iAAeOR1NEaajI,1689
368
370
  dissect/target/volumes/vmfs.py,sha256=-LoUbn9WNwTtLi_4K34uV_-wDw2W5hgaqxZNj4UmqAQ,1730
369
- dissect.target-3.20.dev18.dist-info/COPYRIGHT,sha256=m-9ih2RVhMiXHI2bf_oNSSgHgkeIvaYRVfKTwFbnJPA,301
370
- dissect.target-3.20.dev18.dist-info/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
371
- dissect.target-3.20.dev18.dist-info/METADATA,sha256=mgzYr9ayweYe6lsopWNXI3cfGRMDemWb8ydUGkZayvU,12897
372
- dissect.target-3.20.dev18.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
373
- dissect.target-3.20.dev18.dist-info/entry_points.txt,sha256=BWuxAb_6AvUAQpIQOQU0IMTlaF6TDht2AIZK8bHd-zE,492
374
- dissect.target-3.20.dev18.dist-info/top_level.txt,sha256=Mn-CQzEYsAbkxrUI0TnplHuXnGVKzxpDw_po_sXpvv4,8
375
- dissect.target-3.20.dev18.dist-info/RECORD,,
371
+ dissect.target-3.20.dev20.dist-info/COPYRIGHT,sha256=m-9ih2RVhMiXHI2bf_oNSSgHgkeIvaYRVfKTwFbnJPA,301
372
+ dissect.target-3.20.dev20.dist-info/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
373
+ dissect.target-3.20.dev20.dist-info/METADATA,sha256=qcWPvlyV_0KYf8HyQw-3mgtk1fjvjHv9cWtY9-ab4GM,12897
374
+ dissect.target-3.20.dev20.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
375
+ dissect.target-3.20.dev20.dist-info/entry_points.txt,sha256=BWuxAb_6AvUAQpIQOQU0IMTlaF6TDht2AIZK8bHd-zE,492
376
+ dissect.target-3.20.dev20.dist-info/top_level.txt,sha256=Mn-CQzEYsAbkxrUI0TnplHuXnGVKzxpDw_po_sXpvv4,8
377
+ dissect.target-3.20.dev20.dist-info/RECORD,,