首页 >> 网络安全 >>漏洞预警 >> TMUI RCE漏洞CVE-2020-5902根本原因了解
详细内容

TMUI RCE漏洞CVE-2020-5902根本原因了解

时间:2020-07-17     作者:Ollie Whitehouse【转载】   阅读

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:

1.png

如上所示,我们可以请求/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连接器中发现了几乎完全相同的漏洞:

  • 2018年3月CVE-2018-1323中的ISAPI重定向器

  • 2018年8月在Blackhat上发表题为Breaking Parser Logic(Slides 40 – 53)的演讲

  • 2018年11月CVE-2018-11759中的mod_jk

该问题专门是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源代码:

2.png

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

3.png

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

4.png

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

5.png

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

6.png

这将改变我们的有效载荷

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

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

7.png

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

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的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之间存在差异。


这些问题将会更多

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

.
更多

1589982338979126.png


ots网络社区

www.ots-sec.cn

猜你喜欢
更多
联系方式
更多

投稿邮箱:1481840992@qq.com

交流群2群:622534175

ots网络社区3群:1078548359

关注我们
更多
技术支持: 建站ABC | 管理登录