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.
- {dploot-2.7.1 → dploot-2.7.3}/PKG-INFO +11 -7
- {dploot-2.7.1 → dploot-2.7.3}/README.md +10 -6
- {dploot-2.7.1 → dploot-2.7.3}/dploot/action/masterkeys.py +8 -10
- {dploot-2.7.1 → dploot-2.7.3}/dploot/lib/smb.py +3 -2
- {dploot-2.7.1 → dploot-2.7.3}/dploot/lib/target.py +2 -2
- {dploot-2.7.1 → dploot-2.7.3}/dploot/triage/certificates.py +2 -1
- {dploot-2.7.1 → dploot-2.7.3}/dploot/triage/masterkeys.py +3 -1
- {dploot-2.7.1 → dploot-2.7.3}/pyproject.toml +1 -1
- {dploot-2.7.1 → dploot-2.7.3}/LICENSE +0 -0
- {dploot-2.7.1 → dploot-2.7.3}/dploot/__init__.py +0 -0
- {dploot-2.7.1 → dploot-2.7.3}/dploot/action/__init__.py +0 -0
- {dploot-2.7.1 → dploot-2.7.3}/dploot/action/backupkey.py +0 -0
- {dploot-2.7.1 → dploot-2.7.3}/dploot/action/browser.py +0 -0
- {dploot-2.7.1 → dploot-2.7.3}/dploot/action/certificates.py +0 -0
- {dploot-2.7.1 → dploot-2.7.3}/dploot/action/credentials.py +0 -0
- {dploot-2.7.1 → dploot-2.7.3}/dploot/action/machinecertificates.py +0 -0
- {dploot-2.7.1 → dploot-2.7.3}/dploot/action/machinecredentials.py +0 -0
- {dploot-2.7.1 → dploot-2.7.3}/dploot/action/machinemasterkeys.py +0 -0
- {dploot-2.7.1 → dploot-2.7.3}/dploot/action/machinetriage.py +0 -0
- {dploot-2.7.1 → dploot-2.7.3}/dploot/action/machinevaults.py +0 -0
- {dploot-2.7.1 → dploot-2.7.3}/dploot/action/mobaxterm.py +0 -0
- {dploot-2.7.1 → dploot-2.7.3}/dploot/action/rdg.py +0 -0
- {dploot-2.7.1 → dploot-2.7.3}/dploot/action/sccm.py +0 -0
- {dploot-2.7.1 → dploot-2.7.3}/dploot/action/triage.py +0 -0
- {dploot-2.7.1 → dploot-2.7.3}/dploot/action/vaults.py +0 -0
- {dploot-2.7.1 → dploot-2.7.3}/dploot/action/wifi.py +0 -0
- {dploot-2.7.1 → dploot-2.7.3}/dploot/entry.py +0 -0
- {dploot-2.7.1 → dploot-2.7.3}/dploot/lib/__init__.py +0 -0
- {dploot-2.7.1 → dploot-2.7.3}/dploot/lib/crypto.py +0 -0
- {dploot-2.7.1 → dploot-2.7.3}/dploot/lib/dpapi.py +0 -0
- {dploot-2.7.1 → dploot-2.7.3}/dploot/lib/utils.py +0 -0
- {dploot-2.7.1 → dploot-2.7.3}/dploot/lib/wmi.py +0 -0
- {dploot-2.7.1 → dploot-2.7.3}/dploot/triage/__init__.py +0 -0
- {dploot-2.7.1 → dploot-2.7.3}/dploot/triage/backupkey.py +0 -0
- {dploot-2.7.1 → dploot-2.7.3}/dploot/triage/browser.py +0 -0
- {dploot-2.7.1 → dploot-2.7.3}/dploot/triage/credentials.py +0 -0
- {dploot-2.7.1 → dploot-2.7.3}/dploot/triage/mobaxterm.py +0 -0
- {dploot-2.7.1 → dploot-2.7.3}/dploot/triage/rdg.py +0 -0
- {dploot-2.7.1 → dploot-2.7.3}/dploot/triage/sccm.py +0 -0
- {dploot-2.7.1 → dploot-2.7.3}/dploot/triage/vaults.py +0 -0
- {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.
|
|
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
|
-
|
|
72
|
+
pipx install git+https://github.com/zblurx/dploot.git
|
|
73
73
|
```
|
|
74
74
|
|
|
75
75
|
OR
|
|
76
76
|
|
|
77
77
|
```text
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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
|
|
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
|
-
|
|
46
|
+
pipx install git+https://github.com/zblurx/dploot.git
|
|
47
47
|
```
|
|
48
48
|
|
|
49
49
|
OR
|
|
50
50
|
|
|
51
51
|
```text
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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
|
|
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 =
|
|
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
|
-
|
|
103
|
-
|
|
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.
|
|
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
|
|
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 =
|
|
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
|
|
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] =
|
|
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]:
|
|
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
|
|
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
|