tomcat ajp协议安全限制绕过漏洞_CVE-2020-5902: F5 BIG-IP 远程代码执行漏洞分析

6c970d85740b151887977623e5f8e405.png

0x01 漏洞简述

2020年07月08日, 360CERT监测发现 F5 官方更新了 F5 BIG-IP 远程代码执行 的风险通告,该漏洞编号为 CVE-2020-5902,漏洞等级:严重。

未授权的远程攻击者通过向漏洞页面发送特制的请求包,可以造成任意 Java 代码执行。进而控制 F5 BIG-IP 的全部功能,包括但不限于: 执行任意系统命令、开启/禁用服务、创建/删除服务器端文件等,使用官方的httpd配置缓解修复方案仍可造成反序列化代码执行漏洞。该漏洞影响控制面板受影响,不影响数据面板。

对此,360CERT建议广大用户及时将 BIG-IP 按照修复建议升级到指定版本。与此同时,请做好资产自查以及预防工作,以免遭受黑客攻击。

0x02 漏洞详情

首先,这里F5选择了Apache和tomcat服务器使用ajp_proxy模块进行通信,apache处理完请求之后,通过ajp协议转发给Tomcat,默认是8009端口,来看一下关于漏洞的配置文件,

  1. proxy_ajp.conf
ProxyPassMatch ^/tmui/(.*.jsp.*)$ ajp://localhost:8009/tmui/$1 retry=5...ProxyPassMatch ^/hsqldb(.*)$ ajp://localhost:8009/tmui/hsqldb$1 retry=5
  1. apache的httpd.conf
## HSQLDB#    AuthType Basic    AuthName "BIG-IP"    AuthPAM_Enabled on    AuthPAM_IdleTimeout 1200require valid-userRequire all granted    # Enable content compression by type, disable for browsers with known issues         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    AuthType Basic    AuthName "Restricted area"    AuthPAM_Enabled on    AuthPAM_ExpiredPasswordsSupport on    AuthPam_ValidateIP On    AuthPAM_IdleTimeout 1200    AuthPAM_DashboardTimeout Offrequire valid-userRequire all granted

Apache 处理 url

Apache httpd将URL中的分号解释为用于路径解析的普通字符,而Tomcat将其解释为查询分隔符,也就如下面所说,相当于?。

Tomcat 解析 url

我们看一下Tomcat是如何解析url的,我们的测试url为index.jsp/..;xxx/urltest/aaaa,web.xml为:

97e4200c93a3ebb2f888845403c9ab55.png

在CoyoteAdapter.service下断点,因为Tomcat里在CoyoteAdapter去处理封装请求。

Adapter连接了Tomcat连接器Connector和容器Container.它的实现类是CoyoteAdapter主要负责的是对请求进行封装,构造Request和Response对象.并将请求转发给Container也就是Servlet容器.

此时,会调用postParseRequest方法对req进行处理,继续跟到parsePathParameters方法,截取了关键部分的代码,主要目的是把;和/之间的部分,包括;给去除。

c7144f3935afb0663cde96fc17dcd684.png

接着检测;和/中间的部分是否存在=,如果存在,比如为age=1,就会取出age和1,调用addPathParameter,加到请求的param里,所以在这里;就相当于?的作用了。

接着调用normalize处理url,这里的url是parsePathParameters方法处理过后的。

这里面最终会把/../给删除,并且路径会到上层,处理后是这样的。

1a10456832de7f5be05cbe63b9dc0e56.png

于是,url的处理经历了两步

  1. parsePathParameters:index.jsp/..;xxx/urltest/aaaa -> index.jsp/../urltest/aaaa
  2. normalizeindex.jsp/../urltest/aaaa -> /urltest/aaaa

F5 PAM 认证模块

F5实现了自己的pam进行认证,模块路径为/usr/lib/httpd/modules/,其中,涉及到login.jsp授权的是mod_f5_auth_cookie.so文件。

反汇编之后,大概是这样的。我们能够请求/tmui/login.jsp而不需要进行身份验证。

0a34025e727e11e2b0a60c6f0046a4b1.png

如果直接访问其他jsp文件,再没有通过身份验证的情况下,是会被重定向到/tmui/login.jsp的

6c0b8fc8f612d2f74c7f7ece23e57e32.png

总结

  1. 在apache的处理中,;是被当作普通字符的,不会解析。
/tmui/login.jsp/..;/tmui/locallb/workspace/fileRead.jsp?fileName=/etc/passwd
  1. 此时,由于请求的是/tmui/login.jsp,根据pam认证模块里,/tmui/login.jsp不需要认证,接着,该请求会被转发到 tomcat上,最终tomcat请求:
/tmui/tmui/locallb/workspace/fileRead.jsp?fileName=/etc/passwd

在web.xml 是有该配置的

    org.apache.jsp.tmui.locallb.workspace.fileRead_jsp/tmui/locallb/workspace/fileRead.jsp
  1. 请求/hsqldb;,apache本身会对/hsqldb进行认证,根据httpd.conf的配置,是匹配不到/hsqldb;的
    AuthType Basic    AuthName "BIG-IP"    AuthPAM_Enabled on    AuthPAM_IdleTimeout 1200require valid-userRequire all granted

但正是因为tomcat对于;处理上的差异,导致了身份的绕过,%0a也是一个道理。

任意文件读取

由于fileRead.jsp本身没有身份验证,通过权限绕过之后,就能够直接访问fileRead.jsp,于是,直接从url里获取fileName参数,带入WorkspaceUtils.readFile

e09361eabfb460fbdbe3f56e20cbc3a9.png

最终造成一个文件读取

1eb8b1740494ff153c0d12fd10dab1d7.png

命令执行

由于tmshCmd.jsp本身没有身份验证,通过权限绕过之后,就能够直接访问tmshCmd.jsp,于是,直接从url里获取command参数,带入WorkspaceUtils.runTmshCommand

7309a60bfd2907f68049f687c52d800c.png
7f9a43dd222160050c4b594433d964a9.png

hsqldb反序列化

2020年07月08日, 360CERT监测发现 F5 官方更新了 F5 BIG-IP 远程代码执行 的风险通告,更新了httpd的补丁,从

include 'Redirect 404 /'

改为

include 'Redirect 404 /'

然而这样依然可以被绕过,使用%0a,也是因为tomcat的处理和apache的差异所导致的。

通过;或者%0a直接访问hsqldb来绕过身份验证,从而通过org.hsqldb.util.ScriptTool.main反序列化了以ASCII十六进制字符串造成反序列化漏洞,不过该反序列化攻击需要hsqldb没有设置密码。 我们直接访问hsqldb,会被重定向

curl -k "https://10.70.249.116:443/hsqldb"302 Found

Found

The document has moved here.

而利用;或者%0a,可以造成权限绕过,具体在上面已经说过了。

curl -k "https://10.70.249.116:443/hsqldb;"HSQL Database Engine Servlet

HSQL Database Engine Servlet

The servlet is running.

The database is also running.

Database name: mem:.

Queries processed: 0

反序列化的调用栈
deserialize:-1, InOutUtil (org.hsqldb.lib)getObject:-1, JavaObject (org.hsqldb.types)getArguments:-1, Function (org.hsqldb)getValue:-1, Function (org.hsqldb)getValue:-1, Expression (org.hsqldb)executeCallStatement:-1, CompiledStatementExecutor (org.hsqldb)executeImpl:-1, CompiledStatementExecutor (org.hsqldb)execute:-1, CompiledStatementExecutor (org.hsqldb)sqlExecuteCompiledNoPreChecks:-1, Session (org.hsqldb)executePart:-1, DatabaseCommandInterpreter (org.hsqldb)execute:-1, DatabaseCommandInterpreter (org.hsqldb)sqlExecuteDirectNoPreChecks:-1, Session (org.hsqldb)execute:-1, Session (org.hsqldb)fetchResult:-1, jdbcStatement (org.hsqldb.jdbc)execute:-1, jdbcStatement (org.hsqldb.jdbc)execute:98, ScriptTool (org.hsqldb.util)
实例化 Function 对象

首先,根据我们的sql语句,解析器会识别我们调用的是一个方法,于是会实例化一个org.hsqldb.Function,这部分逻辑在readColumnExpression里,

a98983e66c4c66841cd7c2a50bc8a968.png

在Function方法中,会判断我们调用的方法是否是静态方法,只能调用静态方法,将要调用的方法进行封装到Function对象中。

82d710d8d6f1d260ea0c564050d1662e.png

接着对方法的返回值进行判断,这里是org.hsqldb.util.ScriptTool.main,返回值是void。

525e5c4ef6f33d7664e5e78ff8343253.png

于是调用Types.getParameterTypeNr,是void,暂时将iReturnType值设置为0。

21940cd7e76d96e7cc5d622f87634b02.png

接着往下走,对参数类型进行判断,不为java.sql.Connection,调用Types.getParameterTypeNr方法。

4689e47da82cea3e7bba9c00906e7e03.png

由于main方法的参数类型是String,同时String类型继承Serializable接口。

ac96f165f92f44e476ad8b21f098f9d0.png

于是最终将iReturnType赋值为1111。

反序列化16进制数据

之后在readColumnExpression调用Parser.read方法,取出'单引号包裹的值,也就是我们要反序列化的hex值。

然后,取出hex的值,调用convertObject,这里对根据iReturnType是1111,于是调用StringConverter.hexToByte,将hex还原为byte数组并传入JavaObject的构造方法中。

89e99537fed22989073c656d461291c2.png

将byte数组赋值给data。

61a54c74431ec8d6c570bde00556a4dc.png

由于返回值是JavaObject,于是最后调用JavaObject.getObject方法。

68141c3ee2e169e28180bbab4f28142d.png

调用InOutUtil.deserialize处理data值。

57c5ed837c5c6a2918260a70ee55a31f.png

最终造成反序列化。

ab7a0f3d343f484c3f28afccaed5620b.png

0x03 时间线

2020-07-01 F5官方发布通告

2020-07-03 360CERT发布通告

2020-07-06 360CERT更新通告

2020-07-10 F5官方更新漏洞的缓解措施

2020-07-11 360CERT二次更新通告

2020-07-14 360CERT发布分析

0x04 参考链接

  1. 【补丁二次更新】CVE-2020-5902: F5 BIG-IP 远程代码执行漏洞通告更新
    https://cert.360.cn/warning/detail?id=636804bf8fec3049e0a49383db8eb80d
  2. Apache Core Features
    https://httpd.apache.org/docs/2.4/mod/core.html#location
  3. Apache HTTP Server 与 Tomcat 的三种连接方式介绍
    https://developer.ibm.com/zh/articles/os-lo-apache-tomcat/
  4. Understanding the root cause of F5 Networks K52145254: TMUI RCE vulnerability CVE-2020-5902
    https://research.nccgroup.com/2020/07/12/understanding-the-root-cause-of-f5-networks-k52145254-tmui-rce-vulnerability-cve-2020-5902/
  5. Proof of Concept for CVE-2020-5902
    https://github.com/Critical-Start/Team-Ares/tree/master/CVE-2020-5902
  6. CVE-2020-5902 BIG-IP RCE
    https://github.com/jas502n/CVE-2020-5902
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要复现Tomact_CVE-2020-1938漏洞,可以按照以下步骤进行操作: 1. 下载POC:可以使用以下命令下载POC文件: git clone https://github.com/sv3nbeast/CVE-2020-1938-Tomact-file_include-file_read/ 2. 在攻击机上搭建环境:确保攻击机上已经安装了Tomcat服务器,并且版本在3.4.3以下,可以使用以下命令下载并安装Tomcat 3.4.3版本: git clone https://github.com/sv3nbeast/CVE-2020-1938-Tomact-file_include-file_read/ 3. 配置Tomcat服务器:在Tomcat安装目录下,找到server.xml文件,在<Connector>标签中添加以下内容: protocol="org.apache.coyote.ajp.AjpNio2Protocol" secretRequired="false" 4. 启动Tomcat服务器:在Tomcat安装目录下运行启动脚本,如./catalina.sh run 5. 复现漏洞:使用以下命令触发漏洞复现: python3 file_include.py -u http://目标IP:目标端口/ -p /WEB-INF/web.xml 以上步骤可以帮助你复现Tomact_CVE-2020-1938漏洞。请注意,在进行漏洞复现时务必遵守道德规范,并获得合法授权进行测试。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [CVE-2020-1938 漏洞复现](https://blog.csdn.net/weixin_48799157/article/details/124889366)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [CVE-2020-1938 Tomcat文件包含漏洞复现](https://blog.csdn.net/qq_49279082/article/details/129018726)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值