/shell-analyzer

Java内存马查杀GUI工具,实时动态分析,支持本地和远程查杀

Primary LanguageJava

shell-analyzer

注意:请勿在生产环境使用,存在打崩业务的风险,目前适用于自己搭建靶机分析学习

介绍

关于Java Web内存马查杀的文章和工具已经有不少,不过大都不够完善,各有缺点; 于是我做了一款GUI版本的实时内存马查杀工具,支持本地查杀与远程查杀; 仅测试了Tomcat这一种中间件,不过理论上任何实现了Servlet规范的中间件都可以查杀

优势:

  • 实时监控目标JVM
  • 一键反编译分析代码
  • 一键查杀内存马

本地查杀演示视频:https://www.bilibili.com/video/BV1ZM411e7Rr

远程查杀演示视频:https://www.bilibili.com/video/BV1L24y1q7so

本工具的一些介绍:

原理

Agent动态Attach到目标后会开启一个端口(10032)监听:

  • 该端口会反序列化收到的数据,然后处理,我已经给反序列化设置了白名单进行保护
  • 启动Agent时会设置密码,如果客户端连接密码不匹配将无法获得数据
  • 为什么选择 10032 端口,因为这个数字代表一个

该端口用于实时接受指令并处理后返回数据,图中是部分指令(不完全)

支持一键查杀的内存马类型

类型 类名 方法名
Filter javax.servlet.Filter doFilter
Filter javax.servlet.http.HttpFilter doFilter
Servlet javax.servlet.Servlet service
Servlet javax.servlet.http.HttpServlet doGet
Servlet javax.servlet.http.HttpServlet doPost
Servlet javax.servlet.http.HttpServlet doHead
Servlet javax.servlet.http.HttpServlet doPut
Servlet javax.servlet.http.HttpServlet doDelete
Servlet javax.servlet.http.HttpServlet doTrace
Servlet javax.servlet.http.HttpServlet doOptions
Listener javax.servlet.ServletRequestListener requestDestroyed
Listener javax.servlet.ServletRequestListener requestInitialized
Valve org.apache.catalina.Valve invoke

本地使用

提供了三个jar文件:

  • agent.jar是核心文件,请保持与gui.jarremote.jar同目录
  • gui.jar是GUI客户端,本地和远程分析都需要
  • remote.jar用于远程分析,本地分析无需下载

注意使用JDK\bin\java.exe启动并添加tools.jarclasspath

Windows CMD 示例:

"C:\Program Files\Java\jdk1.8.0_131\bin\java.exe" -cp "C:\Program Files\Java\jdk1.8.0_131\lib\tools.jar;gui-0.1.jar" com.n1ar4.Application

Windows Powershell 示例:

& "C:\Program Files\Java\jdk1.8.0_131\bin\java.exe" -cp "C:\Program Files\Java\jdk1.8.0_131\lib\tools.jar;gui-0.1.jar" com.n1ar4.Application

Linux (Ubuntu) 示例:

jdk1.8.0_202/bin/java -cp jdk1.8.0_202/lib/tools.jar:gui-0.1.jar com.n1ar4.Application

Mac OS 示例:

/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home/bin/java -cp /Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home/lib/tools.jar:gui-0.1.jar com.n1ar4.Application

(1) 第一步:检测进程并Attach

为了防止目标被恶意利用,需要输入一个密码

注意:尽管使用了密码保护,但还是存在拒绝服务等风险,请勿在生产环境使用,目前适用于自己搭建靶机分析学习

(2) 第二步:勾选并分析

点击刷新即可获得实时的数据

(3) 双击任意一个类即可Dump并反编译

(4) 复制类名过去即可修复内存马

远程连接

注意:请不要在真实环境/生产环境下使用,存在打崩业务的可能,目前适用于自己搭建靶机分析学习

仅测试了JDK版本为8的情况

客户端java -jar gui.jar即可

(因为不对本地分析,仅用于发送和接收socket数据,所以可以不将tools.jar加入classpath

服务端确保Tomcat端口和 10032 端口开放

可以手动将Oracle JDK 8传过去(没有测试过OpenJDK等版本)

可以前往 Oracle JDK 8 下载

scp /your-path/jdk-8u202-linux-x64.tar.gz root@ip:/
ssh root@ip
cd /
tar -zxvf jdk-8u202-linux-x64.tar.gz

下载并启动目标的Tomcat(测试使用)

cd /
wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.71/bin/apache-tomcat-9.0.71.tar.gz --no-check-certificate
tar -zxvf apache-tomcat-9.0.71.tar.gz
export JAVA_HOME=/jdk1.8.0_202
./apache-tomcat-9.0.71/bin/startup.sh

上传agent.jarremote.jar

scp /your-path/agent.jar root@ip:/agent.jar
scp /your-path/remote.jar root@ip:/remote.jar

可以传过去一个内存马测试

scp /your-path/filter.jsp root@ip:/apache-tomcat-9.0.71/webapps/ROOT/1.jsp

访问http://ip:port/1.jsp注入并测试http://ip:port?cmd=xxx

先使用jps拿到PID然后注入Agent

/jdk1.8.0_202/bin/jps
/jdk1.8.0_202/bin/java -cp /remote.jar:/jdk1.8.0_202/lib/tools.jar com.n1ar4.RemoteLoader [PID] [8位密码]

输出以下内容说明成功

attach pid: [PID]
password: [8位密码]
success

打开本工具,输入IP和上文的8位密码后,进行分析和查杀即可