Java利用技巧:通过反射实现webshell编译文件的自删除

VSole2022-02-16 10:11:47

0x00 前言

我们知道,当我们访问jsp文件时,Java环境会先将jsp文件转换成.class字节码文件,再由Java虚拟机进行加载,这导致了Java服务器上会生成对应名称的.class字节码文件。对于webshell,这会留下痕迹。

为了实现自删除.class字节码文件,我们可以通过反射获得.class字节码文件的路径,再进行删除。本文将以Zimbra环境为例,结合AntSword-JSP-Template,分析利用思路。

0x01 简介

本文将要介绍以下内容:

◼通过反射实现webshell编译文件的自删除

◼通过反射实现AntSword-JSP-Template

0x02 通过反射实现webshell编译文件的自删除

根据上篇文章《Java利用技巧——通过反射修改属性》的内容,我们按照映射request->_scope->_servlet->rctxt->jsps,通过多次反射最终能够获得JspServletWrapper实例

查看JspServletWrapper类中的成员,jsps->value->ctxt->servletJavaFileName保存.java编译文件的路径,jsps->value->ctxt->classFileName保存.class编译文件的路径,示例如下图

为了只筛选出当前jsp,可以通过request类的getServletPath()方法获得当前Servlet,如下图

从ctxt对象获取servletJavaFileName可以调用JspCompilationContext类的getServletJavaFileName()方法,如下图

从ctxt对象获取classFileName可以调用JspCompilationContext类的getClassFileName()方法,如下图

综上,由此我们可以得出通过反射获取编译文件路径的实现代码如下:

删除编译文件的代码如下:

0x03 通过反射实现AntSword-JSP-Template

rebeyond在《利用动态二进制加密实现新型一句话木马之Java篇》介绍了Java一句话木马的实现方法,AntSword-JSP-Template也采用了相同的方式

我在测试AntSword-JSP-Template的过程中,发现编译文件会多出一个,例如test.jsp,访问后,生成的编译文件为test_jsp.class和test_jsp.java,如果使用了AntSword-JSP-Template,会额外生成编译文件test_jsp$U.class

rebeyond在《利用动态二进制加密实现新型一句话木马之Java篇》提到:

“正常情况下,Java并没有提供直接解析class字节数组的接口。不过classloader内部实现了一个protected的defineClass方法,可以将byte[]直接转换为Class

因为该方法是protected的,我们没办法在外部直接调用,当然我们可以通过反射来修改保护属性,不过我们选择一个更方便的方法,直接自定义一个类继承classloader,然后在子类中调用父类的defineClass方法。”

这里我打算通过反射修改保护属性,调用ClassLoader类的defineClass()方法

在ClassLoader类中,defineClass()方法有多个重载,如下图

这里选择defineClass(byte[] b, int off, int len)

rebeyond在《利用动态二进制加密实现新型一句话木马之Java篇》还提到:

“如果想要顺利地在equals中调用Request、Response、Seesion这几个对象,还需要考虑一个问题,那就是ClassLoader的问题。JVM是通过ClassLoader+类路径来标识一个类的唯一性的。我们通过调用自定义ClassLoader来defineClass出来的类与Request、Response、Seesion这些类的ClassLoader不是同一个,所以在equals中访问这些类会出现java.lang.ClassNotFoundException异常”

解决方法同样是复写ClassLoader的如下构造函数,传递一个指定的ClassLoader实例进去:

最终,得到通过反射实现AntSword-JSP-Template的核心代码:

访问通过反射实现AntSword-JSP-Template的test.jsp后,额外生成的编译文件为test_jsp$1.class

0x04 小结

本文介绍了通过反射实现webshell编译文件自删除和AntSword-JSP-Template,记录关于反射的学习心得。

webshell
本作品采用《CC 协议》,转载必须注明作者和本文链接
webshell新工具 -- PyShell
2023-07-24 10:21:11
0x01 工具介绍PyShell是多平台Python WebShell。该工具可以帮助您在web服务器上获得shell式的界面,以便远程访问。与其他webshell不同的是,该工具的主要目标是在服务器端使用尽可能少的代码,而不考虑使用的语言或服务器的操作系统。您可以在 Windows 和 Linux 中使用不同类型的 shell,具有命令历史记录、上传和下载文件,甚至可以像在目录中一样移动标准外壳。
场景:己经拿到了一个webshell,但是无法正常执行命令,因为被360安全大脑的主动防御拦截了。由于目标是 java 环境,这里可以尝试利用 jsp 执行系统命令上线,具体做法是先写一个 jsp的脚本然后放到 weblogic 的 webshell 路径下,如果找不到 webshell 可以使用文件查找命令dir c:\ /s /b |find "fuck4.jsp"
Webshell-Sniper是一款使用Python编写的基于终端的Webshell管理器,和以往我们分享的Webshell管理工具有所不同,所有操作都在终端中完成。使用它可对您的网站进行远程管理。虽然它没有图形化的GUI也没有WEB界面,但这样的操作也是另有一翻感觉。功能基于终端的shell交互反向连接shell数据库管理Webshell-Sniper安装与使用环境服务端 :. 需要注意的是,Webshell-Sniper服务端只支持Unix系统环境。
0x01 工具介绍该工具没什么技术含量,学了一点javafx,使用jdk8开发出了几个简单功能用来管理webshell。工具整合并改写了各类webshell,支持各个语言的cmd、蚁剑、冰蝎、哥斯拉,又添加了实际中应用到的一些免杀技巧,以方便实际需要。0x02 安装与使用直接下载releases版即可。
Webshell 检测综述
2022-12-15 09:45:32
通过Webshell,攻击者可以在目标服务器上执行一些命令从而完成信息嗅探、数据窃取或篡改等非法操作,对Web服务器造成巨大危害。Webshell恶意软件是一种长期存在的普遍威胁,能够绕过很多安全工具的检测。许多研究人员在Webshell检测领域进行了深入研究,并提出了一些卓有成效的方法。本文以PHP Webshell为例。
动态函数PHP中支持一个功能叫 variable function ,变量函数的意思。//最终是system;当一个变量后边带括号,那他就被视作一个函数。编译器会解析出变量的值,然后会去找当前是否存在名为“system()”的函数并执行它。这里就不给实例了,很多免杀案例中都用到了这个特性。也是被疯狂查杀的特征。回调函数回调函数,简单来说就是一个函数不是由我直接调用,而是通过另一个函数去调用它。
前言提到webshell免杀,方法无外乎对静态特征的变形,编码,或利用语言特性绕过。计算机中有很多符号,它们在编程语言中占据一席之地,这些符号作为运算符号,标识符号或起到特殊含义。本文以PHP为例介绍一些利用符号免杀方法。免杀WAF检测通过对安全狗、护卫神、D盾等常见软WAF的测试,发现WAF查杀主要依赖两种检测方法1.静态检测:通过匹配特征来查找webshell。如危险函数,文件特征码等。例如 ${$my_var[8]}与${$my_var}[8]的区分${xxx} 括起来的要当成变量处理。
通过URL信息获取如果能获取到恶意请求的URL信息,就可以根据URL信息定位到Webshell文件。URL信息可以通过态势感知、WAF等监测预警系统获取,也可以通过对系统异常时间段的Web日志进行审计获取。通过扫描工具扫描获取通过Webshell查杀工具进行扫描,可以定位到部分免杀能力不强的Webshell文件。默认情况下,Windows将仅在索引位置中查找最近修改的文件。
webshell免杀之传参方式及特征绕过传参方式 在这里解释一下为什么,需要讲述传参方式,由于在很多情况下,以请求头作为参数传递并非waf和人工排查的重中之重且非常误导和隐藏
VSole
网络安全专家