Java MemShell

前言:花了几天时间整理了一下内存马相关的文章和工具。以下内容仅代表个人观点。轻喷。TAT。
还有很多坑,以后有时间一定补上。

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
release下载的内容
使用方法:
  将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图,仅供参考。
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方式验证。
curl
nc反弹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即可。
Filter部分源码

4.Servlet-api类 Listener型

http://foreversong.cn/archives/1547
使用方法:
  同Filter型,过程一致。

工作原理:
  通过调用StandardContext对象的addApplicationEventListener创建了一个Listener,然后通过ServletRequestListener使Listener对Request的所有内容进行监听。源码中是把cmd当作关键字进行监听(可自行修改监听内容),如果request中有cmd则触发后续逻辑,调用Runtime.getRuntime().exec(),即命令执行函数。
Listener源码

5.Spring类 Controller型

https://landgrey.me/blog/12/

工作原理:
  在Spring的MVC框架下,用RegisterMapping动态注册一个Controller,通过Controller对用户的Request请求进行处理,实现远程命令执行的功能。
RegisterMapping
部分实现源码

6.Spring类 Interceptor型

工作原理:
  拦截器(Interceptor)可以由3种方法实现,preHandle、postHandle、afterCompletion。实现对用户请求的内容进行处理,进而达到命令执行的功能。
Interceptor demo
  其中调用的顺序是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拦截器的使用

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值