第220-221天:应急响应篇&web内存马查杀&JVM分析&class提取&诊断反编译&日志定性

JAVA Web内存马-JVM分析&日志URL&内存查杀

脚本查杀tomcat-memshell-scanner.jsp

环境搭建的太烦了,复制的博客:

1
https://blog.csdn.net/m0_60571842/article/details/142389679?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522f9a1f02ec270cb378be3f3adb8a2d15f%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=f9a1f02ec270cb378be3f3adb8a2d15f&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-2-142389679-null-null.nonecase&utm_term=%E8%93%9D%E9%98%9F%E6%8A%80%E8%83%BD-%E5%BA%94%E6%80%A5%E5%93%8D%E5%BA%94&spm=1018.2226.3001.4450

部署java和tomcat的环境。

image-20250706164255622

image-20250706164601279

先上传一个普通的jsp后门,然后在使用哥斯拉在这里生成内存马,并且使用jsp脚本扫描内存马。

image-20250706164718533

查杀java内存马:https://github.com/c0ny1/java-memshell-scanner

将这个脚本同样放到tomcat的网站目录就行。

image-20250706164947142

这里就可以看到刚刚生成的内存马:

image-20250706164854187

直接kill掉,发现就没有了:

image-20250706165015991

这里在生成一个,然后重启tomcat看看是否存在?

答:同样是不会存在的

监控项目-arthas

项目地址:https://github.com/alibaba/arthas

1
java -Dserver.port=8081 -jar arthas-tunnel-server-4.0.5-fatjar.jar --http-port 8888 --telnet-port 9999

查看URL路由(看Servlet内存马,Filter看不到)

1
mbean | grep "name=/"

image-20250706195211902

image-20250706195224490

image-20250706195236515

sc查看JVM 已加载的类信息

1
sc *.Filter

image-20250706195301435

image-20250706195322034

image-20250706195332512

image-20250706195342077

image-20250706195352139

image-20250706195402417

1
sc *.Servlet

image-20250706195422284

image-20250706195436070

有怀疑的就可以dump下来去分析源码

jad反编译指定已加载类的源码(在线看)

1
jad --source-only org.apache.coyote.type.PlaceholderForType

image-20250706195503617

image-20250706195512285

dump已加载类的bytecode到特定目录(下载)

1
dump org.apache.coyote.type.PlaceholderForType

image-20250706195532095

image-20250706195541550

image-20250706195552090

能看到源码之后就分析源码中是否有跟webshell有关的代码,如果看不懂或者懒得看,可以把这个源码放到java文件里上传到微步在线分析

image-20250706195624835

image-20250706195641044

image-20250706195652336

image-20250706195702603

GUI项目

项目地址:https://github.com/4ra1n/shell-analyzer
实时监控目标JVM,一键反编译分析代码,一键查杀内存马

image-20250706195734727

image-20250706195747219

image-20250706195800753

Web内存马查杀&Spring框架型&中间件型&JVM分析&Class提取

目前Java内存马具体分类:

1、传统Web应用型内存马

Servlet型内存马:动态注册Servlet及映射路由。

Filter型内存马:动态注册Filter及映射路由。

Listener型内存马:动态注册Listener中的处理逻辑。

哥斯拉是不支持植入Listener型内存马,这里可以用https://github.com/pen4uin/java-memshell-generator项目去生成

image-20250709112903975

同样可以使用analyzer进行查杀

image-20250709113033240

框架型内存马

启动打包的jar包:

image-20250709113624442

1
2
注入内存马(访问这个地址就行):
http://192.168.179.130:8080/addSpringInterceptor

image-20250709113739205

触发链接:

1
http://192.168.179.130:8080/xiaodisec?cmwpzz=calc

image-20250709113833284

使用只能使用arthas监控工具排查

蓝队排查思路:

1
2
3
4
5
6
7
8
9
1:弄清楚当前环境的组织架构,中间件,框架等
2: 对应查找可能类型的内存马技术,如:框架 springboot
3:基于上述信息想到用何种项目工具便于分析,如:项目:arthas(gui脚本不支持)
4:接下来如何进行操作
SpringController型内存马:动态注册Controller及映射路由。
SpringInterceptor型内存马:动态注册Interceptor及映射路由。
Spring Webflux型内存马:动态注册WebFilter及映射路由

arthas检测:有的是基于内存马固定的后缀,名字,文件中常见的关键字去找到可疑类然后去定性。

使用arthas进行检索

1
sc * | grep Controller

image-20250709115007121

1
sc * | grep Interceptor

image-20250709115218549

1
jad --source-only com.example.springinject.demos.web.myInjectController3

image-20250709115247316

对比较可疑的类,对他们的源代码进行查看,发现恶意的传参

1
jad --source-only com.example.springinject.demos.web.testInjectInterceptor

image-20250709115358390

清除:
Jar包中删除对应class文件

image-20250709115425889

Spring Webflux型内存马:动态注册WebFilter及映射路由

Spring WebFlux框架启动(Webflux型内存马)

image-20250709115610724

直接用哥斯拉进行连接(得先访问一下这个链接,随便后面是什么参数):

image-20250709144510423

arthas使用语法:
关键字筛选 常规shell触发代码关键字

1
2
3
memshell shell os runtime

sc * | grep Memshell

image-20250709144704207

1
jad --source-only com.example.webfluxmem.WebFluxFilterMemshell

image-20250709144750664

中间件型内存马

Tomcat Valve型内存马:动态注册Valve。

哥斯拉不支持该类型内存马植入,只能用脚本方式植入

image-20250709150901500

植入的方式同样是访问这个脚本进行触发

image-20250709150934735

然后在执行命令参数。

image-20250709151018182

红框中的地址随机。

image-20250709151052392

使用这个脚本看看能否对这种类型的内存马进行查杀,访问之后查杀脚本都不能进行访问了。

Tomcat其他类型(如Upgrade、Executor、Poller)的内存马

这些内存马会动态替换或添加全局组件。

其他中间件(如Grizzly)的内存马(未讲到)

动态注册Filter及映射路由。其他内存马:

1
2
3
4
WebSocket型内存马:动态注册WebSocket路由及处理逻辑。
Tomcat JSP型内存马:动态注册Tomcat JSP管理逻辑并实现驻留。
线程型内存马:启动一个无法被杀死的线程。
RMI型内存马:动态启动一个RMI Registry。

Agent型内存马(未讲到)
通过Hook并修改关键方法添加恶意逻辑。Agent型内存马在现代webshell管理工具中有广泛实现。

检测项目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
项目1:arthas(实时监控提取方便调试,需要自行排查找到可疑类)
能排查几乎所有内存马技术
`https://github.com/alibaba/arthas`
d:\jdk1.8.0_112\bin\java.exe -jar arthas-boot.jar

项目2:shell-analyzer(自动提取需要自己排查)
`https://github.com/4ra1n/shell-analyzer`
能排查:Filter,Servlet,Listener,Valve类型

项目3:java-memshell-scanner(自动提取排查)
`https://github.com/c0ny1/java-memshell-scanner`
能排查:Filter,Servlet,Listener类型

项目4:(自动提取需要自己排查)
能排查几乎主流内存马技术
`https://github.com/landgrey/copagent`
下载地址:https://github.com/LandGrey/copagent/raw/release/cop.jar
运行:java -jar cop.jar

蓝队内存马大概排查思路

1
2
3
4
5
1、弄清楚当前环境的组织架构:中间件 框架等
2、对应查找可能类型的内存马技术
如:框架 springboot
3、基于上述信息想到用何种项目工具便于分析
如:项目 arthas (gui 脚本其他项目不支持)

注意:
不同内存马类型查杀arthas检测:有的是基于内存马固定的后缀,名字,文件中的常见关键字去找到可疑类然后去定性