前言:花了几天时间整理了一下内存马相关的文章和工具。以下内容仅代表个人观点。轻喷。TAT。
还有很多坑,以后有时间一定补上。
0x00 目录
0x01 内存马的类型
1.按攻击思路,大致分为:
(1)Java Instrumentation类(Agent型)
(2)Servlet-api类(Servlet型、Filter型、Listener型)
(3)Spring类(Controller型、Interceptor型)
2.按注入的对象分为:tomcat、weblogic、shiro等类型。
0x02 植入内存马的各种工具
1.Tomcat 无文件内存马(Java Instrumentation类 Agent型)
https://github.com/ydnzol/memshell
使用方法:
将agent.jar和inject.jar放在tomcat服务器上,用java -jar inject.jar执行即可。
工作原理:
在工具源码中attach类import了com.sun.tools.attach.VirtualMachine包,这个包属于1.6版本之后的JDK,可以把外部进程attach到jvm上,并执行一些操作。loadagent方法是载入java的agent,调用agentmain方法,并将内存马植入带有catalina关键字的jvm中,即tomcat容器。
不论是premain还是agentmain模式都是启动Instrumentation的代理,此代理可以使开发者获取并访问JVM运行时的字节码,并提供了对字节码进行编辑的操作,这就意味着开发者可以将自己的代码注入,在运行时完成相应的操作。
2.Godzilla 2.9 (Servlet-api类 servlet型)
https://github.com/BeichenDream/Godzilla
哥斯拉未公开源码。使用方法界面操作即可,比较简单。
工作原理:
注册一个HttpServlet,通过doGet或者doPost方法对GET和POST的Request包做响应。下图为实现HttpServlet的一个demo图,仅供参考。
3.Servlet-api类 Filter型
http://li9hu.top/tomcat%E5%86%85%E5%AD%98%E9%A9%AC%E4%B8%80-%E5%88%9D%E6%8E%A2/
使用方法:
将源码通过jsp文件进行上传后,访问一次,即可植入生效(jsp后续删除也不影响使用,tomcat服务器重启后失效)。之后访问任意路径,加?cmd=后跟命令即可。命令执行无回显,可以用curl或反弹shell方式验证。
工作原理:
我们需要对tomcat植入恶意的Filter,但是如果应用已在启动过程中是无法加入新的Filter的,这时我们需要通过filterChain.addFilter(FilterConfig)方法间接地将恶意Filter加入FilterChain中,这样多个Filter同时使用时,会便利每一个Filter,植入的恶意Filter就可以正常使用了。
具体的利用链如下:
1.构建一个恶意Filter,通过addFilterMapBefore方法将其加入FilterMap中。
2.构造一个恶意的FilterConfig,其格式为FilterName:ApplicationFilterConfig,FilterName由FilterMap获取,ApplicationFilterConfig由FilterDef获取,所以需要新建一个FilterDef存储1中构建的Filter。这样我们就构造了一个恶意的FilterConfig。
3.调用FilterChain.addFilter(FilterConfig),将恶意FilterConfig加载入FilterChain中,进而加载恶意Filter即可。
4.Servlet-api类 Listener型
http://foreversong.cn/archives/1547
使用方法:
同Filter型,过程一致。
工作原理:
通过调用StandardContext对象的addApplicationEventListener创建了一个Listener,然后通过ServletRequestListener使Listener对Request的所有内容进行监听。源码中是把cmd当作关键字进行监听(可自行修改监听内容),如果request中有cmd则触发后续逻辑,调用Runtime.getRuntime().exec(),即命令执行函数。
5.Spring类 Controller型
工作原理:
在Spring的MVC框架下,用RegisterMapping动态注册一个Controller,通过Controller对用户的Request请求进行处理,实现远程命令执行的功能。
6.Spring类 Interceptor型
工作原理:
拦截器(Interceptor)可以由3种方法实现,preHandle、postHandle、afterCompletion。实现对用户请求的内容进行处理,进而达到命令执行的功能。
其中调用的顺序是preHandler、Controller、postHandler、afterCompletion。
0x03 开源工具流量特征
内存马运行于java进程之上,而检测的攻击流量均源于攻击者与内存马之间的交互,实际抓取明文流量发现无明显特征,且在实战中多以加密流量进行交互,进一步提升了检测难度。检测方式最好利用主机agent,通过RASP方式对java进程进行检测及防护。
0x04 检测工具
1.c0ny1开发的内存马检测工具
https://github.com/c0ny1/java-memshell-scanner
针对Filter和Servlet型内存马检测和清除的工具,把jsp文件放在服务器下即可运行。
使用0x02中的攻击工具进行测试,检测到Filter型和Servlet型内存马:
testF为Filter型内存马,/favicon.ico2为Servlet型内存马。
2.VisualVM
https://github.com/oracle/visualvm/releases
需要开启服务器jmx服务,通过工具远程连接到tomcat服务器。使用MBeans插件,查看jvm中的Servlet和Filter使用情况。favicon.ico为哥斯拉生成的内存马。
0x05 参考资料
https://www.cnblogs.com/rebeyond/p/9686213.html rebeyond的工具设计思路
https://www.cnblogs.com/love-jishu/p/3919124.html attach.VirtualMachine支持的操作
https://paper.seebug.org/1041/#31-java-agent javaagent的两种模式
http://lovestblog.cn/blog/2015/09/14/javaagent/ javaagent原理
https://paper.seebug.org/1233/#0x03 宽字节安全关于tomcat Filter内存马的实现
http://www.51gjie.com/javaweb/873.html Java中ServletRequestListener监听器详解
https://xz.aliyun.com/t/7388 基于tomcat的内存 Webshell 无文件攻击技术
https://github.com/Y4er/Y4er.com/blob/master/content/post/javaagent-tomcat-memshell.md agent类型的内存马
https://mp.weixin.qq.com/s/YhiOHWnqXVqvLNH7XSxC9w 介绍3种内存马的利用链
https://www.cnblogs.com/rebeyond/p/9686213.html 无文件不死shell
https://www.chabug.org/tools/1873.html 内存马查杀
https://gv7.me/articles/2020/kill-java-web-filter-memshell/ 查杀Java web filter型内存马
https://blog.csdn.net/wsdfym/article/details/91357391 Spring拦截器的使用