"Geheimnisse" DPAPI oder DPAPI für Pentester

Der zweite Artikel basiert auf den Ergebnissen der Leistung unseres Teams bei OFFZONE-2018. Betrachten Sie diesmal ein Gespräch mit MainTrack „Windows DPAPI„ Sekretiki “oder DPAPI für Pentester“.

Achtung! Viele Buchen!

Bei der Durchführung von RedTeam-Kampagnen möchte ich weniger Gründe für die Reaktion von BlueTeam angeben, aber es kann viele geben. Führen Sie beispielsweise mimikatz aus, um Benutzerkennwörter oder Zertifikate abzurufen. Selbst wenn wir ihn von Kaspersky aus „otmazyvat“ konnten, kann BlueTeam mithilfe spezieller Tools wie Sysmon, Microsoft ATA usw. nachverfolgen. Gleichzeitig möchte ich die maximalen Informationen von einem kompromittierten Benutzercomputer erhalten. Im Verlauf von Kampagnen, die RedTeam wiederholt durchführte, um echten BlueTeam-Teams entgegenzuwirken, kamen wir zu dem Schluss, dass Maßnahmen, die als Indikatoren für Systemkompromisse dienen können, maximal vermieden werden müssen. Um dieses Ziel zu erreichen, können rechtliche Mechanismen und Maßnahmen verwendet werden, die das Betriebssystem für den Benutzer bereitstellt.

Eines dieser rechtlichen Tools ist der DPAPI-Mechanismus (Windows Data Protection API), mit dem das Betriebssystem und verschiedene Anwendungen vertrauliche Benutzerdaten (hauptsächlich Kennwörter, kryptografische Schlüssel usw.) verschlüsseln. Für den Endbenutzer und seine Anwendungen sieht DPAPI äußerst einfach aus : Es gibt nur 2 Funktionen - "Daten verschlüsseln" und "Daten entschlüsseln". In diesem Artikel möchte ich untersuchen, wie nützlich ein solcher Mechanismus für Pentester während RedTeam-Kampagnen ist.

Was ist DPAPI? Nur kurz und auf Russisch


Seit dem Jahr 2000 verwenden alle Windows-Betriebssysteme die DPAPI-Engine, um die Sicherheit der Benutzerdaten zu gewährleisten.

Wenn wir die gesamte Kryptografie überspringen, die wir im Bericht untersucht haben, benötigen wir zum Entschlüsseln der über DPAPI verschlüsselten Daten: einen Hauptschlüssel, eine Benutzer-SID, einen Benutzerpasswort-Hash und einen DPAPI-Blob selbst (DPAPI-verschlüsselte Daten).

Im Allgemeinen sieht der Prozess folgendermaßen aus:



In unserem "kryptografischen Hut" gibt es viele verschiedene Kryptomechanismen, die wir in diesem Artikel nicht berücksichtigen werden, um den Leser nicht zu überlasten. Wir stellen nur fest, dass der Hauptteil von DPAPI der sogenannte Masterkey (Hauptschlüssel) ist. In einfachen Worten, der Hauptschlüssel besteht aus 64 Bytes zufälliger Daten, die mit dem Prekey verschlüsselt wurden und aus dem Kennwort des Benutzers und seiner SID generiert werden.


Zusätzliche Parameter nehmen ebenfalls an der Prekey-Generierung teil: die Anzahl der Iterationen (IterN), Salt und HMAC, die von Fall zu Fall variieren können. Die Werte dieser Parameter werden zusammen mit dem Hauptschlüssel in einer Datei gespeichert.

Wenn wir also das Passwort des Benutzers, seine SID kennen und die Generierungsparameter aus der Hauptschlüsseldatei (HMAC, Salt, InterN) lesen, können wir einen Vorschlüssel erzeugen und den Hauptschlüssel entschlüsseln, d.h. Holen Sie sich die sehr zufälligen 64 Bytes, die wir zum Entschlüsseln von DPAPI-Blobs verwenden.

Was ist, wenn ich mein Passwort ändere?


Normalerweise ändern sich Benutzerkennwörter in regelmäßigen Abständen. Was passiert, wenn der Benutzer das Passwort ändert? Wo ist der vorherige hingegangen? Um den Hauptschlüssel zu entschlüsseln, müssen Sie das Benutzerkennwort kennen, und das erneute Verschlüsseln aller Benutzerhauptschlüssel ist jedes Mal zu teuer. In diesem Fall ist alles in Windows durchdacht.

Es gibt eine spezielle Datei (CREDHIST), deren Aufgabe darin besteht, alle vorherigen Benutzerkennwörter zu speichern. Es wird auch mit dem aktuellen Kennwort des Benutzers verschlüsselt und auf dem Stapel gespeichert. Wenn das System den Hauptschlüssel plötzlich nicht mehr entschlüsselt, geht es wie folgt vor: Mit dem aktuellen Kennwort entschlüsselt es den ersten Datensatz in CREDHIST. Das Kennwort versucht erneut, den Hauptschlüssel zu entschlüsseln usw., bis die Kennwörter in der Kette abgelaufen sind oder der Hauptschlüssel entschlüsselt ist.

Ein bisschen über die privaten Schlüssel eines Domänencontrollers


Wie Sie vielleicht vermutet haben, wird DPAPI auf alle Benutzer angewendet, einschließlich Domänenbenutzer. Um das Passwort auf einen Benutzer zurücksetzen zu können, der es nach einer Party am Freitagabend erfolgreich vergessen hat, benötigen Sie einen Ersatzschlüssel, der an einem sicheren Ort aufbewahrt wird. Laut Microsoft ist ein so zuverlässiger Ort ein Domänencontroller.

Der Mechanismus zum Entschlüsseln des Hauptschlüssels nach dem Zurücksetzen des Benutzerkennworts besteht im Wesentlichen wie folgt: Auf dem Domänencontroller wird ein Paar RSA-Schlüssel - privat und öffentlich - erstellt. Der private Schlüssel wird auf dem Domänencontroller in der NTDS-Datenbank gespeichert und heißt BCKUPKEY_xxxx (siehe Abbildung unten). Der öffentliche Schlüssel wird an alle Domänensysteme verteilt und zum Generieren eines Duplikats des Hauptschlüssels verwendet.

Nach dem Erstellen eines Hauptschlüssels auf einem Domänencomputer wird auch dessen Duplikat erstellt (oder besser gesagt, das Hauptschlüsselmaterial sind seine 64 Bytes), das zusammen mit dem Hauptschlüssel in einer Datei gespeichert wird und als Domänenschlüssel bezeichnet wird. Wenn Sie den Hauptschlüssel verlieren, d.h. Beim Zurücksetzen des Benutzerkennworts sendet das System ein Duplikat davon an den Domänencontroller und fordert Sie auf, es zu entschlüsseln. Nachdem der Controller den Benutzer autorisiert hat, entschlüsselt er das Duplikat und gibt es an das System zurück. Danach wird das Hauptschlüsselmaterial bereits wieder mit einem neuen Kennwort verschlüsselt.



Mit den entsprechenden Berechtigungen in der Domäne (meistens Administrator) können Sie diese privaten RSA-Schlüssel über den Replikationsmechanismus vom Domänencontroller abrufen und zur weiteren Entschlüsselung der auf den Domänencomputern erstellten Hauptschlüssel verwenden. Dies kann mit Mimikatz oder DSInternals erfolgen. Weitere Informationen hierzu finden Sie im Mimikatz-Wiki oder im DSInternals- Blog.

Wo sind die Hauptschlüssel gespeichert und was sind sie?


Der Hauptschlüssel kann Benutzer und System sein, je nachdem, wessen Geheimnisse verschlüsselt sind. Der Benutzerstammschlüssel wird folgendermaßen im Benutzerprofil gespeichert:

Users\%USER%\AppData\Roaming\Microsoft\Protect\%SID%\

Für alle Fälle speichert das System alle Hauptschlüssel, die jemals vom Benutzer verwendet wurden. Schließlich weiß sie nicht im Voraus, welcher Master etwas mit einem Schlüssel entschlüsseln muss. Die GUID des aktuell verwendeten Schlüssels wird in der Preferred-Datei gespeichert.



Systemhauptschlüssel werden folgendermaßen gespeichert:
windows\system32\Microsoft\Protect\S-1-5-18\

Ähnlich wie beim Benutzer wird ein Hauptschlüssel verwendet, dessen Name in der bevorzugten Datei enthalten ist, in der alle jemals verwendeten Schlüssel gespeichert sind.



Was kann diese DPAPI dem Pentester geben?


Da DPAPI ein legaler und einfacher Mechanismus ist, versuchen verschiedene Anwendungen, ihn zu verwenden. Weil es bequem und sicher ist. Vorerst natürlich.

Beispielsweise wird DPAPI verwendet, um private Schlüssel von Client- und Systemzertifikaten, WIFI-Schlüsseln, Chrome (Cookies, Kennwörter), DropBox, Skype und RSA SecurID (eine Softwareanwendung, die einmalige Schlüssel generiert) zu verschlüsseln. Und dies ist keineswegs eine vollständige Liste.

Die Aufgabe des Pentesters ist es, die erforderlichen Blobs zu entschlüsseln und Passwörter, Cookies usw. zu erhalten.

Es gibt verschiedene Möglichkeiten, dies zu tun. Auf die eine oder andere Weise beschränken sich alle auf zwei Transkripte - online und offline. Bei der Online-Entschlüsselung rufen wir auf dem Computer des Benutzers einfach die Systemfunktionen zum Entschlüsseln der Daten auf und übergeben den DPAPI-Blob an das System. Das System erledigt alles selbst - es sucht nach dem Hauptschlüssel, mit dem der Blob verschlüsselt wurde, und entschlüsselt ihn mithilfe der SID des Benutzers und einen Passwort-Hash, der im LSASS-Speicher gespeichert ist.

Die folgende Abbildung zeigt ein Beispiel für den Aufruf von DPAPI-Funktionen zur Ver- und Entschlüsselung auf Powershell.



Zuerst verschlüsseln wir unser Geheimnis (in diesem Fall das Wort „Passwort“), indem wir die Funktion [Security.Cryptography.ProtectedData] :: Protect () aufrufen. Und das zweimal - im ersten Fall mit dem Hauptschlüssel des Benutzers (Parameter CurrentUser) und im zweiten mit dem Systemhauptschlüssel (Parameter LocalMachine). Dann können wir die resultierenden Blobs entschlüsseln, indem wir die Umkehrfunktion aufrufen - [Security.Cryptography.ProtectedData] :: UnProtect ().

Darüber hinaus spielt in diesem Fall der Wert des Parameters CurrentUser oder LocalMachine keine Rolle, da Das System selbst findet einen Hauptschlüssel, der zum Dekodieren des Blobs geeignet ist, und erledigt alles Notwendige. In beiden Fällen erhalten wir unser erstes Geheimnis - das Wort „Passwort“ (seine byteweise Darstellung).

Beim Online-Entschlüsseln ist es wichtig zu verstehen, in welchem ​​Kontext Sie die Funktion UnProtect () aufrufen. Damit die Entschlüsselung erfolgreich ist, müssen Sie sich in einer Benutzersitzung befinden oder sich unter einer neuen Sitzung anmelden. Die Sache ist der Passwort-Hash, der im LSASS-Speicher gespeichert ist. Wenn Sie außerhalb der Sitzung des Benutzers einen Anruf tätigen (z. B. Sie haben sich über das Netzwerk über psexec oder meterpreter beim System angemeldet), benötigen Sie dementsprechend keinen Kennwort-Hash, um den Hauptschlüssel zu entschlüsseln. Er ist natürlich in der nächsten Sitzung, aber LSASS wird es Ihnen nicht geben, weil Dies ist eine weitere Sitzung, obwohl sie unter demselben Benutzer erstellt wurde. Für eine erfolgreiche Online-Entschlüsselung müssen Sie entweder zu einem Prozess migrieren, der von dem über die GUI angemeldeten Benutzer gestartet wurde, oder sich vollständig über RDP beim System anmelden.

Eine Alternative zu Powershell für die Online-Entschlüsselung von DPAPI-Blobs kann ein Aufruf von mimiktaz :: blob mit dem Parameter / unprotect sein. Bei der Eingabe erhält er eine Binärdatei mit einem DPAPI-Blob, und bei der Ausgabe erhalten wir entschlüsselte Daten. Weitere Fälle mit Mimikatz sind im HarmJ0y- Blog beschrieben .

Der Spielball fiel. Was mache ich mit meiner Farm mit Vidyuhi?


Aufgrund der Tatsache, dass DPAPI-Hauptschlüssel mit dem Kennwort des Benutzers verschlüsselt sind, können Sie den umgekehrten Vorgang versuchen - Brute Force das Kennwort des Benutzers durch seinen Hauptschlüssel. Zum Beispiel haben wir eine umgekehrte Verbindung von unserem Makro oder DDE aus der gesendeten docx-Datei erhalten. Wir können den Hauptschlüssel des Benutzers nehmen und das Kennwort des Benutzers wiederherstellen, ohne dass es zu einer Eskalation von Berechtigungen und Mimikatz-Starts kommt.

Kann ich Hashcat oder JohnTheRipper für Passwort Bruteforce verwenden? Zuvor müssen Sie jedoch die Parameter für Brute Force aus der Komposition von John mit dem entsprechenden Skript abrufen:

 ./DPAPImk2john.py –S <sid> -mk <masterkey> -c <domain|local> 

Dann können wir das Ergebnis des Skripts bereits mit Grafikkarten an unsere Farm senden und hoffen, dass der Benutzer ein schwaches Passwort hat, weil Die Brute-Force-Geschwindigkeit des Hauptschlüssels ist ungefähr vergleichbar mit der WPA2-Aufzählungsgeschwindigkeit, d.h. ziemlich langsam.

Hierbei ist zu beachten, dass für den Fall, dass ein Hauptschlüssel unter Windows 10 generiert wird, der Prekey-Generierung weitere 10.000 Runden PBKDF2-Algorithmus hinzugefügt werden. Schlimmer noch, weder Hashcat noch JohnTheRipper wissen davon (zumindest zum Zeitpunkt dieses Schreibens), was bedeutet, dass sie das Passwort nicht von einem solchen Hauptschlüssel entfernen können.

"Um alles, was schlecht ist, wegzunehmen und es dann herauszufinden ..."


Wie bereits erwähnt, kann die Ausführung verdächtiger Aktionen auf dem Computer des Benutzers zusätzliches Interesse beim Blueteam-Team hervorrufen. Dies ist dementsprechend mit der Tatsache behaftet, dass das gesamte RedTeam dort endet. Ein Beispiel ist der Start von Powershell auf dem Computer eines Buchhalters oder einer Sekretärin, gefolgt von einer Untersuchung des Vorfalls. Um keinen unnötigen Verdacht zu erregen, ist es besser, Offline-Methoden zum Dekodieren von DPAPI-Blobs zu verwenden. Dazu müssen Sie zuerst alles, was Sie brauchen, von der Maschine abholen, nämlich:

  • Benutzerhauptschlüssel
  • Systemhauptschlüssel
  • CREDHIST-Datei (wenn es sich nicht um einen Domänencomputer handelt);
  • Benutzerkennwort (oder dessen sha1 / ntlm-Hash);
  • SID des Benutzers;
  • DPAPI-Blobs, die wir entschlüsseln möchten.

Bei der Entschlüsselung im Offline-Modus können wir nicht auf spezielle Tools verzichten. Solche Werkzeuge können sein:

  • Mimikatz;
  • Impacket (ab der 18. Version mit DPAPI-Funktionalität);
  • Dpapick Framework.

Es geht um das dpapick-Framework, über das wir ausführlicher sprechen werden.

Das Python-dpapick-Framework selbst wurde 2014 vom Forscher Jean-Michel Pikode erstellt und ist eine Implementierung von DPAPI-Mechanismen in Python-Kryptobibliotheken. Die Verwendung von Python sowie die Struktur des Frameworks ermöglichen eine einfache Anpassung an verschiedene DPAPI-Mechanismen. In der ursprünglichen Version konnte dpapick den Domänensicherungsschlüssel nicht zum Entschlüsseln von Hauptschlüsseln verwenden, und es gab keine Mechanismen zum Entschlüsseln von Hauptschlüsseln, die unter Windows 10 im Domänencomputermodus erstellt wurden.

Nachdem diese Mängel behoben und die Funktionalität zum Entschlüsseln von DPAPI-Blobs erweitert worden war, entwickelte sich dpapick zu einem ziemlich guten Tool für die Offline-Dekodierung von DPAPI. Im Folgenden werden als Beispiele die Optionen für die Verwendung dieses Frameworks zum Entschlüsseln von über DPAPI verschlüsselten Benutzerdaten gezeigt.

Chrome - Cookies und Passwörter nehmen und entschlüsseln


Chrome- %localappdata%\Google\Chrome\User Data\Default\Cookies werden in der Datei %localappdata%\Google\Chrome\User Data\Default\Cookies gespeichert
Die %localappdata%\Google\Chrome\User Data\Default\Login Data befinden sich in der Datei %localappdata%\Google\Chrome\User Data\Default\Login Data

Beide Dateien sind SQLite3-Datenbanken, in denen vertrauliche Daten als DPAPI-Blobs gespeichert sind. Als Teil von dpapick gibt es einen vorgefertigten Dissektor (Parser) dieser Daten (examples / chrome.py). Für eine erfolgreiche Entschlüsselung muss er das Verzeichnis mit den Hauptschlüsseln, die Benutzerseite, sein Kennwort oder den Speicherort des privaten Schlüssels des Domänencontrollers sowie die sqlite3-Datei aus Chrome (Cookie- oder Anmeldedaten) angeben.

Offline-Entschlüsselung von Chrome-Cookies mit Benutzerkennwort

 ./chrome.py --cookie <cookiefile> --sid <SID> --password <..> --masterkey <masterkeydir> 

Offline-Entschlüsselung eines Chrome-Cookies mithilfe eines Hash aus dem Kennwort eines Benutzers

 ./chrome.py --cookie <cookiefile> --sid <SID> --hash <..> --masterkey <masterkeydir> 

Offline-Entschlüsselung von Chrome-Kennwörtern mithilfe eines privaten Schlüssels von einem Domänencontroller

 ./chrome.py --chrome <login file> --pkey <rsa-priv.pem> --masterkey <masterkeydir> 

DPAPI für Client-Zertifikate


Client-Zertifikate werden häufig verwendet, um - OTP, EFS oder Authentifizierung in VPN, Webanwendungen usw. zu generieren.

Die Public-Key-Zertifikate selbst werden im Benutzerprofil gespeichert:
%APPDATA%\Microsoft\SystemCertificates\My\Certificates\
Und private Schlüssel, mit deren Hilfe die Signatur tatsächlich ausgeführt wird, oder andere kryptografische Operationen werden über DPAPI verschlüsselt und befinden sich auch im Benutzerprofil entlang des Pfads:

 %APPDATA%\Roaming\Microsoft\Crypto\RSA\<SID>\ 

Um private Zertifikatschlüssel erfolgreich zu entschlüsseln und anschließend PFX-Dateien neu zu erstellen, benötigen wir zusätzlich zu den oben genannten Dateien auch die Hauptschlüssel des Benutzers sowie seine SID und sein Kennwort (oder einen privaten RSA-Schlüssel vom Controller).

Mit Dpapick und dem Benutzerpasswort entschlüsseln wir Folgendes:

 ./efs.py --certificates <cert dir> --rsakyes <RSA dir> --sid <..> --password <..> --masterkey <masterkeydir> 



Mit dem optionalen Parameter rsaout im Screenshot können Sie zusätzlich entschlüsselte RSA-Schlüssel im PEM-Format exportieren. Das Ergebnis des Skripts ist eine neu erstellte PFX-Datei ohne Kennwort, die bereits in sich selbst importiert und für den vorgesehenen Zweck verwendet werden kann. Wenn sich in den oben genannten Verzeichnissen mehrere Zertifikate und private Schlüssel befinden, versucht dpapick, jedes davon zu entschlüsseln und mehrere pfx-Dateien zu erstellen.

Dieselben Aktionen können mit einem privaten Domänenschlüssel ausgeführt werden, um den Hauptschlüssel durch Angabe des entsprechenden Parameters zu entschlüsseln:

 ./efs.py --certificates <cert dir> --rsakyes <RSA dir> --masterkey <masterkeydir> --pkey <domain bkp key> 

Ein bisschen mehr über die "Chips" der Domain


In Bezug auf die Active Directory-Domäne ist eine wunderbare Funktion wie das Roaming von Anmeldeinformationen zu erwähnen - eine Domänenfunktion, wenn Hauptschlüssel, verschlüsselte Kennwörter und Zertifikate für den Benutzer in der gesamten Active Directory-Domäne „übertragen“ werden. Sie sind nicht an einen bestimmten Computer gebunden und werden auf dem Computer "ankommen", auf dem sich der Domänenbenutzer anmeldet.

Wenn diese "Funktion" aktiviert ist, werden alle vom Benutzer importierten Zertifikate sowie alle seine privaten Schlüssel und Kennwörter in AD übertragen und in den entsprechenden Kontoattributen gespeichert: msPKIAccountCrdentailas und msPKIDPAPIMasterKeys.

Sie können sehen, wie es in AD aussieht, zum Beispiel durch ldapsearch:

 ldapsearch -x -h dc1.lab.local -D “user1@lab.local" -s sub "samAccountname=user1" ldapsearch -x -h dc1.lab.local -D "admin@lab.local" -s sub "samAccountname=anyuser" 



Standardmäßig kann ein Benutzer nur DPAPI-Attribute für sein Konto empfangen. Mit erhöhten Berechtigungen kann dies jedoch für jedes Konto durchgeführt werden, einschließlich eines Computerkontos.

Credential Roaming ist eine sehr praktische Technologie, nicht nur für Administratoren, sondern auch für Pentester. Nachdem Sie über ldap auf den Domänencontroller zugegriffen haben, können Sie alle Benutzerzertifikate, seine Hauptschlüssel und Kennwörter zusammenführen, die über DPAPI verschlüsselt sind (z. B. Kennwörter für die Verbindung mit Netzwerklaufwerken).

Und warum nicht solche Funktionen zu dpapick hinzufügen, dachten wir - und lehrten es, Zertifikate automatisch von einem Domänencontroller über ldap zu extrahieren, sie zu entschlüsseln und pfx-Dateien zu generieren.

 ./efs.py –ldap-server <..> --ldap-connect admin:Passw0rd@lab.local --ldap-user user1 --password Password1 ./efs.py –ldap-server <..> --ldap-connect admin:Passw0rd@lab.local --ldap-user user1 --pkey <rsa-priv.pem> 



Um das Skript auszuführen, müssen Sie den Domänencontroller als LDAP-Server, die Details der Verbindung, den Namen des Kontos, für das wir Zertifikate erhalten, und ein Kennwort zum Entschlüsseln des Hauptschlüssels (oder eines privaten Sicherungsschlüssels des Controllers) angeben.

Dropbox In 60 Sekunden verschwunden ...


Dropbox ist ein weiteres Beispiel für die Verwendung von DPAPI zum Speichern von Benutzergeheimnissen. Autorisierungstoken für Dropbox werden in folgenden Dateien gespeichert:

 c:\users\<username>\Appdata\Local\Dropbox\instance1\config.dbx c:\users\<username>\Appdata\Local\Dropbox\instance_db\instanse.dbx 

Dies sind verschlüsselte SQLite3-Datenbanken, die Daten für die Verbindung enthalten. Für die Verschlüsselung wird ein symmetrischer Schlüssel verwendet, der wiederum über DPAPI verschlüsselt und in der Registrierung gespeichert wird:

HKCU\SOFTWARE\Dropbox\ks
HKCU\SOFTWARE\Dropbox\ks1


Daher ist die allgemeine Reihenfolge der Dropbox-Entführung wie folgt:

  1. Wir nehmen zwei Datenbankdateien vom Computer.
  2. Wir holen die Schlüssel aus der Registrierung und entschlüsseln sie mit dpapick.
  3. Mit DPAPI verschlüsseln wir die empfangenen Schlüssel auf unserem Computer und legen sie in der Registrierung ab.
  4. Auf unserem Computer ersetzen wir die Datenbankdateien und führen Dropbox aus.

Beachten Sie, dass für die oben genannten Registrierungszweige spezielle Berechtigungen festgelegt sind. Sie können nur vom Benutzer gelesen werden. Weder der Administrator noch das System können sie lesen. Wenn Sie also im Namen eines anderen Benutzers (sogar eines Administrators) auf die Registrierung zugreifen, müssen Sie zuerst die entsprechenden Berechtigungen für die angegebenen Registrierungszweige festlegen. Zum Beispiel so (Powershell):

 $Sid="S-1-5-21-3463664321-2923530833-3546627382-1000"; $key=[Microsoft.Win32.Registry]::USERS.OpenSubKey("$sid\SOFTWARE\Dropbox\ks",[Microsoft.Win32.RegistryKeyPermissionCheck]::ReadWriteSubTree,[System.Security.AccessControl.RegistryRights]::ChangePermissions); $acl = $key.GetAccessControl(); $rule = New-Object System.Security.AccessControl.RegistryAccessRule ("administrator","FullControl","Allow"); $acl.SetAccessRule($rule); $key.SetAccessControl($acl); $key_path = "REGISTRY::HKEY_USERS\$Sid\SOFTWARE\Dropbox\ks"; (Get-ItemProperty -Path $key_path -Name Client).Client; 

Die Schlüssel ks und ks1 enthalten den Header (8 Byte) der DBX-Version vor dem DPAPI-Blob und dem md5-HMAC-DPAPI-Blob (letzte 16 Byte). Der DPAPI-Blob selbst beginnt mit dem 9. Byte 0x01000000D0 ... Diese Bytes müssen im Base64-Format in eine Datei kopiert werden, die dann über dpapick entschlüsselt wird:

 ./filegeneric.py --sid <..> --password <..> --masterkey <..> --base64file <..> 

Dann müssen Sie auf Ihrem Computer die in der letzten Phase erhaltenen Schlüssel mit unserem Hauptschlüssel verschlüsseln und das Ergebnis in die entsprechenden Registrierungszweige einfügen.

Für die Verschlüsselung ist es am bequemsten, Powershell zu verwenden:

 $hdata="4efebbdf394d4003317fc5c357beac4b"; [Byte[]] $dv0_entropy = 0xd1,0x14,0xa5,0x52,0x12,0x65,0x5f,0x74,0xbd,0x77,0x2e,0x37,0xe6,0x4a,0xee,0x9b; $data = ($hdata -split "(?<=\G\w{2})(?=\w{2})" | %{ [Convert]::ToByte( $_, 16 ) }); Add-Type -AssemblyName System.Security; $dk1 = [system.security.cryptography.protecteddata]::Protect($data,$dv0_entropy,[System.Security.Cryptography.DataProtectionScope]::CurrentUser); $pr=([System.BitConverter]::ToString($dk1));$pr $OBJ_hmac = New-Object System.Security.Cryptography.HMACMD5 $hmac = $OBJ_hmac.ComputeHash($dk1) $pr=([System.BitConverter]::ToString($hmac));$pr 

In diesem Fall ist hdata der Schlüssel, der in der Entschlüsselungsphase empfangen wurde. dv0_entropy ist die Entropiekonstante, die von DBOX in DPAPI verwendet wird. Dem resultierenden Blob müssen Sie der Vorderseite einen 8-Byte-Header 0x00000000F6000000 und der Rückseite HMACMD5 + 0x00 zuweisen
Danach können Sie Daten in die entsprechenden Registrierungsschlüssel schreiben.

DPAPI und RSA SecurID


RSA SecurID ist ein Client-Programm, mit dem ein von RSA entwickeltes Einmalkennwort generiert wird.

Es ist eine sehr beliebte Sache für große Unternehmen und verwendet auch DPAPI, nur ein wenig komplizierter. In diesem Fall beschlossen die RSA-Ingenieure, verwirrt zu werden, und wendeten komplexere DPAPI-Schemata an.

Token-Daten werden in der Datei %LOCALAPPDATA%\RSA\SecurIDStorage , bei der es sich um die sqlite3-Datenbank handelt. Jedes verschlüsselte Token enthält seine verschlüsselte EnTokenSid (Parameter für die anfängliche Initialisierung des Codegenerierungsalgorithmus). EnTokenSid wird auf der Basis von DBKey, der SID des Tokens und der Benutzer-SID generiert, und DBKey wird bereits durch die DPAPI-Entschlüsselung DBKeyEnc in der folgenden Reihenfolge generiert:
DBKeyEnc = DPAPI(CurrenUser, DPAPI(LocalSystem(DBKey))

Das heißt, Zuerst wird der DB-Schlüssel mit dem Systemhauptschlüssel verschlüsselt, und dann wird der resultierende DPAPI-Blob erneut mit dem Benutzerhauptschlüssel verschlüsselt.

Ebenfalls in der Datenbank befindet sich CryptoCheckSum von CheckSum:
CryptoCheckSum = DPAPI-Blob (CurrenUser)

Damit der zusammengeführte SecurIDStorage auf Ihrem Computer funktioniert, müssen Sie:

  1. Aufgrund der Tatsache, dass die SID des Benutzers an der Bildung der EncTokenSid beteiligt ist, muss die aktuelle Benutzer-SID in der virtuellen Maschine auf denselben Wert wie die SID des Benutzers festgelegt werden, von dem die SecurIDStorage-Basis stammt. Das NewSid-Dienstprogramm von SysInternals hilft uns dabei.
  2. Entschlüsseln Sie DBKeyEnc mit dem Hauptschlüssel und dem Kennwort des Benutzers oder dem privaten Domänenschlüssel (falls der Computer eine Domäne ist).
  3. Entschlüsseln Sie das Ergebnis der vorherigen Entschlüsselung mit dem Systemhauptschlüssel und dem Wert des Parameters DPAPI_SYSTEM.
  4. Entschlüsseln Sie CryptoCheckSum mit dem Hauptschlüssel des Benutzers
  5. Verschlüsseln Sie die empfangenen DBKey- und CheckSum-Werte bereits auf Ihrer virtuellen Maschine in umgekehrter Reihenfolge.
  6. In einigen Versionen von SecurID müssen Sie außerdem die Festplattengröße der virtuellen Maschine auf die gleiche Größe wie die Festplattengröße der Quellmaschine einstellen Das Programm überprüft es beim Start.

Wie oben erwähnt, benötigen wir zum Entschlüsseln von DBKeyEnc zusätzlich zum Hauptschlüssel des Benutzers einen Systemhauptschlüssel sowie den Wert DPAPI_SYSTEM, mit dem die Systemhauptschlüssel entschlüsselt werden. DAPPI_SYSTEM ist tatsächlich ein bereits gebildeter Prekey, der an der Bildung von Systemhauptschlüsseln beteiligt ist. Sie können es aus dem LSASS-Speicher (über Mimikatz oder durch Analyse des Prozess-Dumps) oder aus den entsprechenden Registrierungszweigen (HKLM \ SYSTEM, HKLM \ SECURITY) abrufen, sichern und dasselbe Impacket analysieren.

Dann können wir das erhaltene DPAPI_SYSTEM verwenden, um die erforderlichen Blobs mit dpapick zu entschlüsseln (der Parser ist examples / filegeneric.py), wie in den folgenden Screenshots gezeigt:

1) DPAPI_SYSTEM über mimikatz offline abrufen



2) DPAPI_SYSTEM über Impacket offline abrufen



3) DPAPIck-Entschlüsselung mit Benutzer- und Systemhauptschlüsseln



Spickzettel


Damit Sie den Ort bestimmter Daten nicht vergessen, werden wir sie in einen separaten Abschnitt einfügen:

Benutzerdefinierte Hauptschlüssel

 %APPDATA%\Microsoft\Protect\<SID>\* 

Systemstammtasten

 Windows\System32\Microsoft\Protect\* 

DPAPI_SYSTEM

 LSASecrets – online SYSTEM, SECURITY (reg save …, system\backup, etc) 

Benutzerzertifikate

 %APPDATA%\Microsoft\SystemCertificates\My\Certificates\ %APPDATA%\Microsoft\Crypto\RSA\<SID>\ 

Systemzertifikate

 HKLM:\SOFTWARE\Microsoft\SystemCertificates\MY\Certificates\* C:\Programdata\Microsoft\Crypto\RSA\MachineKeys\ 

Chrome

 %localappdata%\Google\Chrome\User Data\Default\Cookies %localappdata%\Google\Chrome\User Data\Default\Login Data 

Dropbox

 HKCU\SOFTWARE\Dropbox\ks HKCU\SOFTWARE\Dropbox\ks1 %APPDATA%\Local\Dropbox\instance1\config.dbx %APPDATA%\Local\Dropbox\instance_db\instanse.dbx 

Rsa sicher

 %LOCALAPPDATA%\RSA\SecurIDStorage 

Kleine Schlussfolgerung


DPAPI ist eine großartige Sache - die Hauptsache ist zu verstehen, wie es bei der Durchführung von Pentests und RedTeam-Studien verwendet werden kann.

In diesem Artikel haben wir uns nur einige Beispiele angesehen, bei denen die DPAPI-Entschlüsselung angewendet werden kann. In der Tat ist der Umfang viel breiter. Beispielsweise haben wir RDP (* .rdg), Icloud (pList-Datei), Skype (*. Xml) und Schlüssel für die Verbindung mit Wi-Fi nicht berücksichtigt. Überall wird DPAPI angewendet und die entsprechenden Parser werden als Teil des dpapick-Frameworks implementiert.

Eine modifizierte Version von dpapick ist auf unserem GitHub verfügbar. Wir empfehlen Ihnen dringend, dieses Tool zum Entschlüsseln von DPAPI zu verwenden, und wir werden für die Weiterentwicklung von dpapick dankbar sein.

Und einige interessante Informationen finden Sie in unserem Kanal in Telegrammen . Wir erzählen von IB mit den Augen von RedTeam.

PS Danke an die Organisatoren von OFFZONE-2018 für eine coole Konferenz!

PPS Der zweite Teil des Artikels hier

Source: https://habr.com/ru/post/de434514/


All Articles