【Java内存马 原理、实战与查杀】

Java内存马 原理

目标:1. 掌握内存马的注入、利用原理 2. 掌握常见内存马类型的注入方式 3. 掌握内存马的查杀思路和工具使用

一、实验环境准备

工具准备
jdk 1.8.0_74/jdk-11.0.11
《143-Win10配置JDK8,启动BP.docx》
maven 3.6.3
《159-IDEA配置Maven.docx》
tomcat 8.5.72(端口8080会和Bp冲突)
IDEA 2022.3.3
《158-IDEA安装和破解.docx》
Burp Suite 2021+
Behinder_v4.0.6(冰蝎)

1.1 工程:ServletJspProject

工程描述:演示Servlet基本功能和相关类型
的内存马,部署到tomcat中运行。
(注意修改端口号避免冲突)

1.2 工程:SpringMemShell

工程描述:演示Spring Controller内存马注入,
部署到tomcat运行。
Spring的配置文件:applicationContext.xml
SpringMVC的配置文件:dispatcherServlet.xml
web工程的配置文件:web.xml
TestController提供了几个接口。
ApiController是一个正常接口,用来演示隐藏马

1.3 工程:shirodemo

工程描述:servlet+shiro的web工程。shiro版本
1.2.4。部署到tomcat运行。
里面包含了shiro的反序列化漏洞。

1.4 工程:shiroattck

工程描述:这里面包含了恶意的代码
1、需要注入的内存马。
2、包含把内存马序列化、加密、base64编码的
工具。与shirodemo配套使用。

1.5 工程:JavaInstrument-main

工程描述:用来演示agent类型的内存马。多
module的工程。
用到:
1、AgentDemo:演示Java Agent的基本使用
2、TargetApp:演示被注入的工程。与上述工程
配套使用。

1.6 工程:memShell_for_windows_v0.2

工程描述:冰蝎作者提供的注入tomcat的agent
内存马,只要tomcat启动就可以在本机注入

二、webshell的演变

2.1 小马

作用:专门用来上传(写入)文件
文件名:xiaoma.jsp
描述:指定路径、内容,可以写入木马到任意路

启动ServletJspProject工程
请求:http://localhost:8076/upload/xiaoma.jsp

2.2 大马

作用:丰富的网站管理功能
文件名:dama.jsp
访问密码:password
启动ServletJspProject工程
访问地址:http://localhost:8076/upload/dama.jsp

2.3 一句话木马

作用:执行操作系统命令
文件名:shell.jsp
访问密码:password
启动ServletJspProject工程
访问地址:http://localhost:8076/upload/shell.jsp?pwd=admin&cmd=whoami

2.4 加密一句话木马

作用:执行操作系统命令
文件名:behinder.jsp
程序:Behinder_v4.0.6
连接密码:rebeyond
启动ServletJspProject工程
http://localhost:8076/upload/behinder.jsp

2.5 webshell合集

https://github.com/tennc/webshell
传统webshell防御措施:
1、终端:文件监控
2、后门:流量监控
3、网络:禁止外连

2.6 文件马运行流程

【Java内存马 原理、实战与查杀】_第1张图片

2.7 内存马原理

1、获取上下文环境Context对象
2、调用Context的方法,动态添加对象
【Java内存马 原理、实战与查杀】_第2张图片

// 获取到applicationcontextFacade
ServletContext servletContext = request.getServletContext();
// 利用反射获取ApplicationContext对象
Field fieldApplicationContext  = servletContext.getClass().getDeclaredField("context");
//使私有可获取
fieldApplicationContext.setAccessible(true);
// 获取到ApplicationContext对象
ApplicationContext  applicationContext = (ApplicationContext) fieldApplicationContext.get(servletContext);
//利用反射获取StandardContext对象
Field fieldStandardContext  = applicationContext.getClass().getDeclaredField("context");
//使私有可获取
 fieldStandardContext.setAccessible(true);
 //获取到StandardContext对象
 StandardContext standardContext = (StandardContext ) fieldStandardContext.get(applicationContext );

2.8 内存马使用场景

  1. 禁止外连,不能反弹shell的情况
  2. 禁止写入文件的情况
  3. 写入文件会告警的情况
  4. 不支持.jsp文件解析的情况

三、Servlet基础知识回顾

3.1 Servlet是什么?

http://c.biancheng.net/servlet2/what-is-servlet.html
Servlet——Spring(MVC)——Spring Boot
DispatcherServlet

开发

  1. pom依赖
  2. extends HttpServlet
  3. doPost和doGet方法
  4. web.xml或者注解注册
    案例:UploadServlet.java

3.2 Servlet和JSP的关系?

JSP(全称Java Server Pages)
JSP经过转换编译以后还是会变成Servlet,支持前
端语法。
View:JSP,负责内容显示
Controller:Servlet,负责处理请求

3.3 Servlet和Tomcat的关系

  1. Tomcat里面有Servlet容器(引擎)
  2. Tomcat可以提供HTTP访问
  3. Tomcat可以把HTTP请求转换为HttpServletRequest对象,并调用doGet/doPost,并且把HttpServletResponse转换为HTTP响应内容

tomcat工作机制
【Java内存马 原理、实战与查杀】_第3张图片

3.4 Filter

过滤器,过滤请求、过滤响应

  1. implements Filter
  2. 实现doFilter()
  3. web.xml或者注解注册,定义拦截路径

案例演示:http://localhost:8076/upload.jsp

3.5 Filter调用链

【Java内存马 原理、实战与查杀】_第4张图片

3.6 Filter用途举例

  1. 权限验证
  2. 过滤非法请求内容
  3. 对请求解密;对响应压缩
  4. 记录用户访问日志

3.7 Listener类型

类型 触发事件 说明
ServletContext监听器 服务器的启动跟停止时触发 Context就是Tomcat容器
Session 监听器 浏览器第一次连接、浏览器关闭时触发 不同的浏览器是不同的Session
Request监听器 访问服务时触发 Request就是一个请求,存在于请求和响应之间。服务器响应完,Request就销毁了。

Listener应用举例

  1. 统计当前在线人数
  2. 统计网站总访问量
  3. 监控访问记录

3.8 Servlet开发总结

【Java内存马 原理、实战与查杀】_第5张图片

四、内存马分类和演示

4.1 Servlet内存马演示

内存马分类

  • Servlet型内存马,Servlet、Filter、Listener
  • 框架类型内存马,Spring Controller、Interceptor
  • Agent类型内存马
  • 其他……

4.2 Spring内存马演示

Spring普通马演示

  • 查看已有的mappings http://localhost:8093/mappings
  • 注册Controller内存马 http://localhost:8093/test1
  • 执行命令 http://localhost:8093/good?cmd=whoami
  • 检测注入 http://localhost:8093/mappings

Spring劫持(隐形)马演示

  • 访问普通接口 http://localhost:8093/api
  • 注册隐藏内存马 http://localhost:8093/test2
  • 不带参数访问(普通接口) http://localhost:8093/api
  • 带参数访问(内存马) http://localhost:8093/api?cmd=whoami

4.3 Agent内存马演示

Java Agent技术应用场景

  • 开发工具调试代码:IDEA debug
  • Java运行时性能分析:Visual VM、JConsole
  • Java项目热部署:JRebel、XRebel
  • Java软件破解:破解Burp Suite
  • RASP技术:火线洞态IAST
    Runtime application self-protection,即运行时应用程序自我保护

Java Agent两种运行方式

  • 在运行项目的时候,通过jvm参数 - javaagent:xxx.jar 指定agent(premain方法)
  • 启动Agent时通过attach方式挂载目标进程,需要把
    进程号给到agent(agentmain方法)

Java Agent开发

AgentDemo工程
AgentEntry类:premain方法、agentmain方法
Transformer类:实现ClassFileTransformer接口
打包命令:mvn assembly:assembly
注意AgentTest类打包之前不能放进去,否则会报错,缺tools.jar包

Java Agent演示

  • 运行TargetApp工程TargetAppMain方法
  • jps -l查看进程号(me.mole.TargetAppMain)
  • 运行AgentTest类(修改进程号、jar包位置)
    File——Project Strutrue —— SDKS 添加 tools.jar

Java Agent注入tomcat内存马演示

  • 启动tomcat 8.5
  • 代码:memShell_for_windows_v0.2
    java -jar inject.jar password
    冰蝎内存马:https://github.com/rebeyond/memShell
    注意保存路径里面最好不要有空格和汉字
  • 访问
    http://localhost:8080/?pass_the_world=password&model=exec&cmd=whoami

五、内存马注入方式

总结

  1. Servlet类型内存马,需要借助于.jsp文件
  2. Spring内存马,需要借助于Java代码
  3. tomcat内存马,需要借助于.jar文件
    有没有真正的无文件注入内存马的方式?

内存马注入方式

  • 基于JSP WebShell植入内存马
  • 通过Java Agent植入内存马
  • 基于JavaWeb RCE漏洞植入内存马
    Fastjon(反序列化、JNDI)、Spring Cloud Gateway(创建恶意路由)、Log4j2(JNDI)、Shiro(反序列化)、FreeMarker(SSTI)

shiro反序列化注入内存马演示

《反序列化渗透与防御NO.719》章节5:04-shiro反序列化漏洞
1、工程:shirodemo运行
配置tomcat8、JDK8启动
*注意:修改server.xml(可以发包修改)
maxPostSize=“-1” maxHttpHeaderSize=“102400” 2、工程:shiroattack,运行ClientMemshell.java
浏览器抓登录包,头字段增加rememberMe=
3、访问
http://localhost:8096/shiro/login.jsp?cmd=whoami

六、内存马检测和查杀

内存马处理
1、重启
2、文件查杀
3、漏洞检测和修复
文件查杀
河马webshell查杀 HmSetup.exe
内存马检测思路
思路:
1、通过Java应用的接口,获取tomcat JVM里面加载的

2、遍历所有类,判断是否为风险类
1)内存注册,但是磁盘没有文件
2)class文件里面包含恶意内容

java-memshell-scanner
java-memshell-scanner
不支持低版本tomcat
代码解读:https://mp.weixin.qq.com/s/pY7yFVNIbX1z41nGvoMGBg
工程:shirodemo运行/ServletJspProject
http://localhost:8096/shiro/scanner.jsp
利用Tomcat API删除添加的组件
升级版:https://github.com/xyy-ws/NoAgent-memshell-scanner
https://tttang.com/archive/1390/

Filter classLoader Filter class file path
com.sun.org.apache.xalan.internal.xsltc.
trax.Templateslmpl$TransletClassLoader 在磁盘上没有对应的class文件,可能是内存马

sa-jdi
1、获取进程号:jps -l
2、启动sa-jdi
java -cp .\sa-jdi.jar sun.jvm.hotspot.HSDB
可以查看JVM中所有已加载的类
shell-analyzer
基于JDK11运行 https://github.com/4ra1n/shell-analyzer
其他工具
1、cop.jar
https://github.com/LandGrey/copagent
2、Arthas
https://github.com/alibaba/arthas
3、shellpub 河马内存马查杀

你可能感兴趣的:(渗透与防御,渗透测试,java,网络安全)