前言
随着近几年国内关于攻防比赛、HW的重视度越来越高,攻击队的权限维持手段越来越高明.从一开始的文件落地webshell,到今天基于Filter和Servlet的内存马,真可谓是百花齐放.
Filter内存马&Servlet内存马
Java世界中内存马无非就两种——Filter和Servlet.Filter翻译为拦截器,配合内存马技术Filter可以让任何不存在的路径变为一个webshell,就算是配合流量设备也很难察觉异样.因为大部分流量设备的默认规则只会当做错误日志处理.而基于Servlet的内存马一般需要攻击者指定一个固定路径来访问生效.
以下展示两种内存马.
可以看出攻击者利用一个get参数控制想要变更的命令
可以看出攻击者利用一个设定的路由配合一个header参数控制想要变更的命令
原因在于Filter中提供一个doFilter方法,在该方法中存在一个内置类ServletRequest,该类派生的对象含有一个getParameter方法可用来作为外部传参使用.

而在Servlet中提供的则是service方法,在该方法中同样存在一个内置类,只不过该类是HttpServletRequest.该类派生的对象含有一个getHeader方法可用来作为外部传参使用.

查杀方法
查杀方法需要借用到一款工具——VisualVM.我们使用这款工具时需要在应急的tomcat上提前配置好JMX访问.

在catalina.sh/catalina.bat中找到
# ----- Execute The Requested Command -----------------------------------------字段
在其下方加入该tomcat局域网地址或者公网地址配置示例(加入哪一种网段根据情况而定)
CATALINA_OPTS="$CATALINA_OPTS -Djava.rmi.server.hostname=局域网或公网IP -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=监听端口(推荐19999) -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"
随后启动VisualVM安装一个插件并激活

随后找到本地的tomcat或者远程tomcat

进入Mbean选项卡即可
对于Filter内存马和Servlet内存马都可以在Catalina-Filter/Servlet节点找到一些踪迹
以下为一个正常的Filter/Servlet监控情况
以下为有攻击痕迹的Filter/Servlet监控情况
鸣谢
感谢Ntears提供的技术支持
Reference
tomcat结合shiro无文件webshell的技术研究以及检测方法:
https://www.t00ls.net/thread-56828-1-1.html
VisualVM:
https://visualvm.github.io/download.html



