Wat is DPAPI en hoe kunnen we het misbruiken
Dit blogbericht gaat voornamelijk over de fundamentele werking van DPAPI en hoe we DPAPI kunnen misbruiken om credentials te achterhalen. Deze blog bestaat uit 2 delen. Gedurende deze 2 posts leg ik uit hoe DPAPI werkt, hoe de CQTools werken (en waarom) en hoe we de CQTools kunnen gebruiken om DPAPI te hacken en wachtwoorden te achterhalen. De content voor deze en voornamelijk de volgenmde post is grotendeels afkomstig van de CQTools presentatie tijdens “Black Hat Asia 2019”, maar met meer achtergrondinformatie waarmee je direct meer inzicht krijgt in hoe het cryptografische platform van Windows misbruikt kan worden. Let’s get hacking!
Het is weer even geleden sinds we direct de wachtwoorden in Windows hebben aangevallen. Maar let wel even op de disclaimer:
Dus jongens en meisjes… alleen voor educatieve doeleinden gebruiken of om jezelf uit de penarie te helpen als je een wachtwoord vergeten bent!
Dan voordat we de werkelijke hack kunnen starten is het goed om meer informatie te hebben over DPAPI.
DPAPI staat voor “Data Protection Application Programming Interface”. DPAPI is een cryptografische interface welke sinds Windows 2000 aanwezig is. Windows gebruikt de Data Protection API om symmetrische encryptie van diverse soorten gegevens mogelijk maken. Windows gebruikt de DPAPI primair voor het uitvoeren van symmetrische codering van asymmetrische privésleutels, waarbij een user- of system secret wordt gebruikt en eventueel toegevoegde entropy.
Niet elke software gebruikt DPAPI, zelfs niet ieder Windows component gebruikt DPAPI. Feit is dat echter wel steeds meer componenten het DPAPI systeem gebruiken. Denk b.v. aan Windows vingerafdrukken, Certificaten, Google Chrome, VPN, EFS (Encrypting File System), SQL Server TDE, IE7, Outlook S/MIME, IIS SSL/TLS, Windows Rights Management, Credential Manager en nog heel veel meer.
Het is belangrijk om te weten dat DPAPI zelf geen data opslaat. Het enige wat DPAPI doet is plain-tekst ontvangen en omzetten naar ciphertext.
DPAPI-beveiliging is afhankelijk de Windows mogelijkheid om de privésleutel en de RSA private keys te beschermen tegen attacks die deze proberen te achterhalen of aan te passen. Meestal is dit alleen mogelijk indien de gebruikerscredentials correct zijn. De hoofdcode voor encryptie / decryptie wordt afgeleid van het wachtwoord van de gebruiker door de PBKDF2-functie. Zonder de juiste credentials is het theoretisch onmogelijk om de privé sleutels te achterhalen.
De kracht van het DPAPI systeem komt voort uit de moeilijkheid waar alle cryptografische systemen mee te maken hebben en dat is “sleutelbeheer”. Hoe kan de decoderingssleutel veilig worden opgeslagen. Want als de sleutel in platte tekst is opgeslagen heeft elke gebruiker die toegang heeft tot de sleutel toegang tot de gecodeerde gegevens. Als de sleutel moet worden gecodeerd is een andere sleutel nodig, enzovoort. Met DPAPI kunnen ontwikkelaars sleutels coderen met een symmetrische sleutel die is afgeleid van gebruiker- en domein “aanmeldingsgeheimen” (logon credentials).
De DPAPI-sleutels die worden gebruikt voor het coderen van de RSA-sleutels van een gebruiker worden opgeslagen in
%APPDATA%\Microsoft\Protect\{SID} |
De DPAPI-sleutel wordt opgeslagen in hetzelfde bestand als de hoofdsleutel die de persoonlijke sleutels van de gebruiker beschermt. DPAPI sleutels zijn gewoonlijk 64 bytes sleutels van willekeurige gegevens. In de basis werkt DPAPI als volgt:
Hierboven kwamen we de term al tegen, namelijk “entropy”. Deze term zul je in combinatie met DPAPI vaker tegenkomen. De Entropy parameter is een “initializing vector” ofwel IV (vaak logischerwijs maar onterecht vergeleken met een “salt”). De “Entropy” key is een sleutel die toegevoegd kan worden aan het versleutelingsproces van het wachtwoord en wordt meestal alleen gebruikt tijdens het versleutelen van het 1e block van de dataset. De entropy sleutel is een statische sleutel (waarde) die een gebruiker of applicatie mee kan geven. Op die manier kunnen credentials alleen ontsleuteld worden door de gebruiker of applicatie die in het bezit is van deze extra entropy sleutel. Zonder de juiste IV op blok 1 is het onmogelijk om blok 2 te versleutelen.
Het versleutelen zonder IV zou er als volgt uitzien:
Plain_text_block_1 >> Encrypt (block1, key) == Encrypted_text_block_1 Plain_text_block_2 >> Encrypt (block2, key) == Encrypted_text_block_2 |
Het versleutelen met IV ziet era ls volgt uit:
Plain_text_block_1 >> Encrypt (block1, XOR IV, key) == Encrypted_text_block_1 Plain_text_block_2 >> Encrypt (block2, XOR Encrypted_text_block_1, key) == Encrypted_text_block_2 |
Entropy maakt de versleuteling niet sterker maar wel lastiger om te kraken.
Dus hoe werkt DPAPI (in het kort):
- 1. Je wilt een wachtwoord veilig opslaan op de computer.
- 2. Het wachtwoord wordt door de Data Protection API gestuurd.
- 3. DPAPI genereerd een user key op basis van het wachtwoord of andere credentials (zoals smartcard) van de gebruiker.
- 4. DPAPI genereerd een random master key (als deze nog niet aanwezig is) en versleuteld deze met de user key van de gebruiker (stap 3). Alleen deze gebruiker kan deze sleutel succesvol gebruiken omdat alleen deze gebruiker in het bezit is van zijn eigen credentials. Als de master key aangesproken wordt zal deze dus ook ontsleuteld worden met deze user key.
- 5. Om een wachtwoord veilig op te slaan wordt een “CryptProtectData” call gedaan. Iedere keer dat deze call gedaan word zal DPAPI een sessiesleutel genereren. Deze sessiesleutel is afgeleid van de “master key”, willekeurige (statische) data en eventueel (optioneel) de entropy die de gebruiker meegeeft.
- 6. Het wachtwoord wordt versleuteld met deze sessiesleutel. De sessiesleutel zelf wordt niet opgeslagen. Het enige wat opgeslagen wordt is de random data die gebruikt is. DPAPI kan namelijk zelf de data ontsleutelen (bij een CryptUnprotectData” call) doordat hij beschikt over de master key, de random data en eventueel dezelfde entropy mee krijgt.
We hebben dus 3 sleutels, de user key, de master key en de session key. De session key wordt gebruikt om de werkelijke data te versleutelen. De master key wordt gemaakt en versleuteld met de user key. DPAPI en de sleutelsterkte is de laatste jaren regelmatig getweakt maar de werking is gelijk gebleven:
De master key wisselt regelmatig. Deze blijft nog wel actief om decryptie aanvragen te behandelen maar zal geen nieuwe gegevens meer versleutelen. Mocht een master key gekraakt worden dan nog kan deze slechts gebruikt worden op een beperkte hoeveelheid data. Omdat het gebruikerswachtwoord belangrijk is voor het creëren van de master key zal DPAPI de master key opnieuw genereren als de gebruiker zijn wachtwoord veranderd.
De output van DPAPI bevat een aantal onderdelen. Uiteraard de data die versleuteld is. Maar ook het GUID van de master key, de random data, de eventuele entropy en een HMAC signature om er zeker van te zijn dat de data onaangetast is en dus “betrouwbaar” is.
Het DPAPI systeem zorgt er dus voor dat data versleuteld en ontsleuteld kan worden door gebruik te maken van diverse sleutels die in de basis afhankelijk zijn van de user credentials. De enige sleutel die opgeslagen wordt is de DPAPI master key. De sessiesleutel wordt on-the-fly gegenereerd en zo ook de user key. DPAPI slaat zelf de data niet op. Hier zijn de systemen zelf verantwoordelijk.
Tot zover een stukje achtergrondinformatie over DPAPI. Dit is belangrijk omdat we namelijk het DPAPI systeem gaan aanvallen. En dat doen we met toolset van “CQTools”. CQTools is een toolkit van CQURE, een security bedrijf uit Polen onder leiding van CEO “Paula Januszkiewicz”. CQTools is een toolkit met bijna 40 tools voor security professionals en penetration testers. Deze tools zijn afkomstig uit de complete CQURE toolkit die uit meer dan 200 tools bestaat. CQTools is gratis en hier te downloaden: https://cqureacademy.com/blog/no-category/black-hat-asia-2019-tools.
De CQTools bieden diverse tools waaronder sniffing, spoofing en extraction tools alsmede diverse payloads. CQURE heeft zelf DPAPI en DPAPI-NG (nieuwe api welke ook cloud support biedt) onderzocht en reversed-engineerd (is dat een woord?). Hieruit heeft men een eigen toolkit ontwikkeld waarbij informatie kan worden achterhaald. Denk aan wachtwoordextractie, aangepaste shellgeneratie, aangepaste payloadgeneratie, verschillende keyloggers etc.
Wij gaan dus een kijkje nemen naar deze toolkit van CQURE.
Deze toolkit bestaat uit een XX aantal tools:
Laten we eens kijken wat deze tools kunnen doen:
CQARPSpoofer – Voer ARP spoofing uit:
CQArpSpoof /clientip /gwip |
CQDPAPIKeePassDBDecryptor – Maakt het mogelijk om een beveiligde KeePass-database te ontsleutelen. De Decryptor biedt toegang tot alle KeePass-databases van alle gebruikers en gebruikt de DPAPI-gegevens die door CQMasterKeyAD worden gebruikt. CQDPAPIKeePassDBDecryptor gebruikt de gedecodeerde master key van de gebruiker om de sleutel van KeePass te decoderen. Deze tool probeert een opnieuw versleuteld bestand in dezelfde map op te slaan als het origineel. Het wachtwoord dat tijdens het opslaan gebruikt word is “cqure”.
CQDPAPIKeePassDBDecryptor /key /file |
CQElevate – Deze tool exploiteerd de MS16-032 vulnerability.
Elevate-Cmd %command% |
CQETWKeylogger – Keylogger gebaseerd op native Windows software. Deze keylogger gebruikt het “Event Tracking for Windows” ofwel ETW.
CQHashDumpv2 – Dump SAM hashes van het systeem en verander wachtwoorden zowel online als offline.
CQHashDumpV2.exe /samdump |
CQPfxRegenerator – Regenereerd *.PFX bestanden.
PfxRegenerator /inkey /out /in [/in] |
CQPrefetchParser – Deze tool zorgt ervoor dat je prefetch bestanden kunt inspecteren. Windows 10+ prefetch bestanden kunnen uitgepakt worden voor handmatige analyse.
CQPrefetchParser /file /dir /out |
CQRDCache – Achterhaal afbeeldingen van de desktop uit RDP chache.
CQWSLmon – Tool om de interactie tussen Windows en de WSL (Windows Subsystem for Linux) layer te monitoren.
CQCat – Aangepaste CQure Netcat utility om data van netwerkverbindingen te lezen en er naartoe te schrijven. Deze methode omzeilt de meeste virusscanners.
nc [-options] hostname port[s] [ports] |
CQCreateProcessWithParent – Tool die het mogelijk maakt om een “parent process” te verstoppen in een ander proces. Dit maakt forensische analyse lastiger.
CQCreateProcessWithParent /ppid /exe |
CQDPAPIBlobDecrypter – Decrypts een DPAPI blob.
CQDPAPIBlobDecrypter /%masterkey% /%goldenkeyfile% |
CQDPAPIBlobSearcher – Doorzoekt bestanden op DPAPI blobs.
CQDPAPIBlobSearcher /file /outdir |
CQDPAPIEncDec – Versleutelt en ontsleutelt text door gebruik te maken van DPAPI.
CQFindBin – Doorzoekt bestanden op specifieke (binaire) patronen.
CQFindBin <pattern> <file|dir> |
CQHashesCalc – MSDCC2 en NTHash Hash calculator
CQImpersonate – Maakt het mogelijk om een commando te draaien als een geauthentiseerde gebruiker op het systeem. CQImpersonate moet draaien in de LOCAL_SYSTEM context.
CQImpersonate.exe –u DOMAIN\Administrator –c cmd.exe |
CQLsassSecretsDumper – Dump de DPAPI Golden Key (backup key) van LSASS naar PFX bestand. De DPAPI Golden Key is een kopie van de “master key” van de gebruiker wanneer men werkt in een domein omgeving. Als het gebruikerswachtwoord wordt gereset dan wordt de originele master key ontoegankelijk gemaakt voor de gebruiker. De toegang van de gebruiker tot de master key wordt automatisch hersteld met behulp van de golden key. De DPAPI-backup key kan niet worden gewijzigd, waardoor het lekken van de golden key kan resulteren in een complete herconfiguratie van de hele omgeving.
CQLsassSecretsDumper /%file% |
CQMasterKeyDecrypt – Deze tool maakt het mogelijk om een met DPAPI beveiligde “service masterkey” van een SQL server te decrypten. Deze tool maakt het mogelijk om de TDE beveiliging te omzeilen (Transparent Data Encryption).
CQMasterKeyDecrypt /masterkey /goldenkeyfile |
CQMasterKeyEncrypt – Versleuteld de DPAPI masterkey met een nieuwe hash.
CQMasterKeyEncrypt /sid /file /oldhash /newhash |
CQMSGDecode – Decodeerd e-mail (msg) bestanden.
CQMSGDecode <email.msg> |
CQRDCManDecrypter – Decrypt RDCMan .rdg bestanden met de opgegeven masterkey en halt hier gebruikerscredentials uit.
CQRDCManDecrypter /file /master |
CQRegKeyLastWriteTime – Bepaal het moment (dag en tijd) dat een registersleutel voor het laatst beschreven (toegevoegd of gemodificeerd) is. Dit is de x64 tool. De x32 tool is ook aanwezig en heet “CQRegKeyLastWriteTime_32.exe”.
CQRegKeyLastWriteTime.exe %regkey% |
CQRegTool – Register analyser (forensische toepassing)
CQRegTool /path /file |
CQReverseShellGen – Tool om een TCP Reverse Shell .exe bestand te genereren.
CQReverseShellGen /ip /port |
CQRunInAppContainer – Draai applicatie in een special AppContainer.
CQRunInAppContainer /exe /app |
CQSecretsDumper – Extract geheime systeem credentials
CQSecretsDumper /secret /service /sec /sys |
CQSymbolInstaller – Tool om special symbolen te installeren.
CQSymbolInstaller /image /pdb /symstore |
We mogen wel stellen dat di teen zeer complete en geavanceerde toolkit is.
Ik hoop dat deze post je iets meer inzicht heeft gegeven in DPAPI. In de volgende post gaan we kijken hoe we DPAPI kunnen kraken middels deze SQure toolkit. Stay Tuned.