dploot 2.7.1__tar.gz → 2.7.3__tar.gz

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.
Files changed (41) hide show
  1. {dploot-2.7.1 → dploot-2.7.3}/PKG-INFO +11 -7
  2. {dploot-2.7.1 → dploot-2.7.3}/README.md +10 -6
  3. {dploot-2.7.1 → dploot-2.7.3}/dploot/action/masterkeys.py +8 -10
  4. {dploot-2.7.1 → dploot-2.7.3}/dploot/lib/smb.py +3 -2
  5. {dploot-2.7.1 → dploot-2.7.3}/dploot/lib/target.py +2 -2
  6. {dploot-2.7.1 → dploot-2.7.3}/dploot/triage/certificates.py +2 -1
  7. {dploot-2.7.1 → dploot-2.7.3}/dploot/triage/masterkeys.py +3 -1
  8. {dploot-2.7.1 → dploot-2.7.3}/pyproject.toml +1 -1
  9. {dploot-2.7.1 → dploot-2.7.3}/LICENSE +0 -0
  10. {dploot-2.7.1 → dploot-2.7.3}/dploot/__init__.py +0 -0
  11. {dploot-2.7.1 → dploot-2.7.3}/dploot/action/__init__.py +0 -0
  12. {dploot-2.7.1 → dploot-2.7.3}/dploot/action/backupkey.py +0 -0
  13. {dploot-2.7.1 → dploot-2.7.3}/dploot/action/browser.py +0 -0
  14. {dploot-2.7.1 → dploot-2.7.3}/dploot/action/certificates.py +0 -0
  15. {dploot-2.7.1 → dploot-2.7.3}/dploot/action/credentials.py +0 -0
  16. {dploot-2.7.1 → dploot-2.7.3}/dploot/action/machinecertificates.py +0 -0
  17. {dploot-2.7.1 → dploot-2.7.3}/dploot/action/machinecredentials.py +0 -0
  18. {dploot-2.7.1 → dploot-2.7.3}/dploot/action/machinemasterkeys.py +0 -0
  19. {dploot-2.7.1 → dploot-2.7.3}/dploot/action/machinetriage.py +0 -0
  20. {dploot-2.7.1 → dploot-2.7.3}/dploot/action/machinevaults.py +0 -0
  21. {dploot-2.7.1 → dploot-2.7.3}/dploot/action/mobaxterm.py +0 -0
  22. {dploot-2.7.1 → dploot-2.7.3}/dploot/action/rdg.py +0 -0
  23. {dploot-2.7.1 → dploot-2.7.3}/dploot/action/sccm.py +0 -0
  24. {dploot-2.7.1 → dploot-2.7.3}/dploot/action/triage.py +0 -0
  25. {dploot-2.7.1 → dploot-2.7.3}/dploot/action/vaults.py +0 -0
  26. {dploot-2.7.1 → dploot-2.7.3}/dploot/action/wifi.py +0 -0
  27. {dploot-2.7.1 → dploot-2.7.3}/dploot/entry.py +0 -0
  28. {dploot-2.7.1 → dploot-2.7.3}/dploot/lib/__init__.py +0 -0
  29. {dploot-2.7.1 → dploot-2.7.3}/dploot/lib/crypto.py +0 -0
  30. {dploot-2.7.1 → dploot-2.7.3}/dploot/lib/dpapi.py +0 -0
  31. {dploot-2.7.1 → dploot-2.7.3}/dploot/lib/utils.py +0 -0
  32. {dploot-2.7.1 → dploot-2.7.3}/dploot/lib/wmi.py +0 -0
  33. {dploot-2.7.1 → dploot-2.7.3}/dploot/triage/__init__.py +0 -0
  34. {dploot-2.7.1 → dploot-2.7.3}/dploot/triage/backupkey.py +0 -0
  35. {dploot-2.7.1 → dploot-2.7.3}/dploot/triage/browser.py +0 -0
  36. {dploot-2.7.1 → dploot-2.7.3}/dploot/triage/credentials.py +0 -0
  37. {dploot-2.7.1 → dploot-2.7.3}/dploot/triage/mobaxterm.py +0 -0
  38. {dploot-2.7.1 → dploot-2.7.3}/dploot/triage/rdg.py +0 -0
  39. {dploot-2.7.1 → dploot-2.7.3}/dploot/triage/sccm.py +0 -0
  40. {dploot-2.7.1 → dploot-2.7.3}/dploot/triage/vaults.py +0 -0
  41. {dploot-2.7.1 → dploot-2.7.3}/dploot/triage/wifi.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dploot
3
- Version: 2.7.1
3
+ Version: 2.7.3
4
4
  Summary: DPAPI looting remotely in Python
5
5
  Home-page: https://github.com/zblurx/dploot
6
6
  License: MIT
@@ -66,18 +66,22 @@ If you don't know what is DPAPI, [check out this post](https://posts.specterops.
66
66
 
67
67
  ## Installation
68
68
 
69
- You can install dploot directly from PyPI:
69
+ You can install dploot directly from PyPI with [pipx](https://github.com/pypa/pipx):
70
70
 
71
71
  ```text
72
- pip install dploot
72
+ pipx install git+https://github.com/zblurx/dploot.git
73
73
  ```
74
74
 
75
75
  OR
76
76
 
77
77
  ```text
78
- git clone https://github.com/zblurx/dploot.git
79
- cd dploot
80
- make
78
+ pipx install dploot
79
+ ```
80
+
81
+ On [Kali Linux](https://www.kali.org/), you can install dploot from the repositories:
82
+
83
+ ```text
84
+ sudo apt install python3-dploot
81
85
  ```
82
86
 
83
87
  ## Usage
@@ -749,7 +753,7 @@ The **mobaxterm** command will extract MobaXterm secrets and masterpassword key
749
753
  With `pvk`:
750
754
 
751
755
  ```text
752
- dploot rdg -d waza.local -u jsmith -p 'Password#123' 192.168.56.14 -pvk key.pvk
756
+ dploot mobaxterm -d waza.local -u jsmith -p 'Password#123' 192.168.56.14 -pvk key.pvk
753
757
  [*] Connected to 192.168.56.14 as waza.local\jsmith (admin)
754
758
 
755
759
  [*] Triage ALL USERS masterkeys
@@ -40,18 +40,22 @@ If you don't know what is DPAPI, [check out this post](https://posts.specterops.
40
40
 
41
41
  ## Installation
42
42
 
43
- You can install dploot directly from PyPI:
43
+ You can install dploot directly from PyPI with [pipx](https://github.com/pypa/pipx):
44
44
 
45
45
  ```text
46
- pip install dploot
46
+ pipx install git+https://github.com/zblurx/dploot.git
47
47
  ```
48
48
 
49
49
  OR
50
50
 
51
51
  ```text
52
- git clone https://github.com/zblurx/dploot.git
53
- cd dploot
54
- make
52
+ pipx install dploot
53
+ ```
54
+
55
+ On [Kali Linux](https://www.kali.org/), you can install dploot from the repositories:
56
+
57
+ ```text
58
+ sudo apt install python3-dploot
55
59
  ```
56
60
 
57
61
  ## Usage
@@ -723,7 +727,7 @@ The **mobaxterm** command will extract MobaXterm secrets and masterpassword key
723
727
  With `pvk`:
724
728
 
725
729
  ```text
726
- dploot rdg -d waza.local -u jsmith -p 'Password#123' 192.168.56.14 -pvk key.pvk
730
+ dploot mobaxterm -d waza.local -u jsmith -p 'Password#123' 192.168.56.14 -pvk key.pvk
727
731
  [*] Connected to 192.168.56.14 as waza.local\jsmith (admin)
728
732
 
729
733
  [*] Triage ALL USERS masterkeys
@@ -77,7 +77,9 @@ def entry(options: argparse.Namespace) -> None:
77
77
  a.run()
78
78
 
79
79
  def parse_masterkeys_options(options: argparse.Namespace, target: Target) -> Tuple[bytes,Dict[str,str],Dict[str,str]]:
80
- pvkbytes = passwords = nthashes = None
80
+ pvkbytes = None
81
+ passwords = {}
82
+ nthashes = {}
81
83
  if hasattr(options,'pvk') and options.pvk is not None:
82
84
  try:
83
85
  pvkbytes = open(options.pvk, 'rb').read()
@@ -98,16 +100,12 @@ def parse_masterkeys_options(options: argparse.Namespace, target: Target) -> Tup
98
100
  except Exception as e:
99
101
  logging.error(str(e))
100
102
  sys.exit(1)
103
+ if target.username:
104
+ if target.password != '':
105
+ passwords[target.username] = target.password
101
106
 
102
- if target.password != '':
103
- if passwords is None:
104
- passwords = dict()
105
- passwords[target.username] = target.password
106
-
107
- if target.nthash != '':
108
- if nthashes is None:
109
- nthashes = dict()
110
- nthashes[target.username] = target.nthash.lower()
107
+ if target.nthash != '':
108
+ nthashes[target.username] = target.nthash.lower()
111
109
 
112
110
  if nthashes is not None:
113
111
  nthashes = {k.lower():v.lower() for k, v in nthashes.items()}
@@ -71,9 +71,9 @@ class DPLootSMBConnection:
71
71
  if "STATUS_NOT_SUPPORTED" in str(e):
72
72
  no_ntlm = True
73
73
  pass
74
- hostname = self.smb_session.getServerName() if not no_ntlm else self.target.address
74
+ hostname = self.smb_session.getServerDNSHostName() if not no_ntlm else self.target.address
75
75
  self.smb_session.close()
76
- self.target.address = hostname + "." + self.target.domain
76
+ self.target.address = hostname
77
77
  logging.debug("Connecting to %s" % self.target.address)
78
78
  if not self.create_conn_obj(self.target.address):
79
79
  return None
@@ -88,6 +88,7 @@ class DPLootSMBConnection:
88
88
  kdcHost=self.target.kdcHost,
89
89
  useCache=self.target.use_kcache,
90
90
  )
91
+ self.target.username = self.smb_session.getCredentials()[0]
91
92
  else:
92
93
  logging.debug("Connecting to %s" % self.target.address)
93
94
  if not self.create_conn_obj():
@@ -53,7 +53,7 @@ class Target:
53
53
  options.dc_ip = options.target
54
54
 
55
55
  self.domain = domain
56
- self.username = username
56
+ self.username = username if username is not None else ""
57
57
  self.password = password
58
58
  self.address = options.target
59
59
  self.lmhash = lmhash
@@ -68,7 +68,7 @@ class Target:
68
68
 
69
69
  @staticmethod
70
70
  def create(domain: str = None,
71
- username: str = None,
71
+ username: str = "",
72
72
  password: str = None,
73
73
  target: str = None,
74
74
  hashes: str = None,
@@ -210,6 +210,7 @@ class CertificatesTriage:
210
210
  logging.debug("Found match between %s certificate and %s private key !" % (name, pkey[0]))
211
211
  key = load_der_private_key(pkey[1].export_key('DER'), password=None)
212
212
  pfx = self.create_pfx(key=key,cert=cert)
213
+ # TODO CAN BE NULL self.get_id_from_certificate(certificate=cert)[1]
213
214
  username = self.get_id_from_certificate(certificate=cert)[1].replace('@','_')
214
215
  clientauth = False
215
216
  for i in cert.extensions.get_extension_for_oid(oid=ExtensionOID.EXTENDED_KEY_USAGE).value:
@@ -255,7 +256,7 @@ class CertificatesTriage:
255
256
  except Exception:
256
257
  pass
257
258
 
258
- return None, None
259
+ return "", "SAN not found"
259
260
 
260
261
  @property
261
262
  def users(self) -> List[str]:
@@ -41,7 +41,7 @@ class MasterkeysTriage:
41
41
  system_masterkeys_generic_path = 'Windows\\System32\\Microsoft\\Protect'
42
42
  share = 'C$'
43
43
 
44
- def __init__(self, target: Target, conn: DPLootSMBConnection, pvkbytes: bytes = None, passwords: Dict[str,str] = None, nthashes: Dict[str,str] = None, dpapiSystem: Dict[str,str] = {}) -> None:
44
+ def __init__(self, target: Target, conn: DPLootSMBConnection, pvkbytes: bytes = None, passwords: Dict[str,str] = None, nthashes: Dict[str,str] = None, dpapiSystem: Dict[str,str] = None) -> None:
45
45
  self.target = target
46
46
  self.conn = conn
47
47
  self.pvkbytes = pvkbytes
@@ -51,6 +51,8 @@ class MasterkeysTriage:
51
51
  self._users = None
52
52
  self.looted_files = dict()
53
53
  self.dpapiSystem = dpapiSystem
54
+ if self.dpapiSystem is None:
55
+ self.dpapiSystem = {}
54
56
  # should be {"MachineKey":"key","Userkey":"key"}
55
57
 
56
58
  def triage_system_masterkeys(self) -> List[Masterkey]:
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "dploot"
3
- version = "2.7.1"
3
+ version = "2.7.3"
4
4
  description = "DPAPI looting remotely in Python"
5
5
  readme = "README.md"
6
6
  homepage = "https://github.com/zblurx/dploot"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes