Fortigate 环境搭建及固件提取
前言
逐步补上之前未记录的环境搭建过程(Fortigate 旧版
环境搭建
首先下载fortigate的虚拟机镜像,解压缩之后,双击ovf之后即可用vmware打开,并把网络模式从桥接改为NAT。
等待初始化完成之后,即可用admin+空密码登录。
使用如下命令配置网络
1 | config system interface |
配置好之后即可访问web界面,配置sslvpn并增加相应防火墙规则。
配置完之后便可以访问到sslvpn登录界面。
固件提取
在完成上述配置之后,关闭虚拟机,会看到虚拟机文件夹下有fortigate-7.2.1-disk1.vmdk。我们把它复制到其他目录下,并且挂载到其他虚拟机下,这里我直接挂载到了kali下。
内核文件是FORTIOS下的flatkc。主要文件系统市在FORTIOS下的rootfs.gz中。将它复制到其他文件夹下,使用下列命令对其进行解压。解压之后即可得到主要的文件系统。
1 | gzip -d rootfs.gz |
后门植入
绕过文件系统检查
之前我们登陆后台拿到的是console shell。我们想要方便调试等操作,需要进行后门植入来获取正常的shell。想要进行后门植入,那么我们就得先了解一下有哪些文件检查。
内核文件是flatkc。其中fgt_verify会进行文件系统hash的验证,验证成功则会启动 /sbin/init。
/sbin/init的代码如下,首先检查文件系统,之后会对bin.tar.gz等文件进行解压,覆盖对应的目录,最后启动**/bin/init**。
最后我们看一下 /bin/init开始的几处校验。从上到下一共有四处,根据前人的文章可以知道从上到下分别是:
- 第一个判断函数内部执行了 ioctl 和 socket 等函数,向内核发送或接收某些信息。
- 第二个检查/.fgtsum来进行某些校验
- 第三个和 FIPS 模式相关
- 第四个实现对 rootfs.gz 的判断
并且可以知道只要对第二个和第四个检查进行patch即可。
patch完如下。
所以我们想要植入后门,那么有一种方式如下。
- 首先,patch /bin/init文件,跳过其中的校验逻辑。对rootfs.gz进行重打包,并对原文件进行替换。
- 利用vmware的debugStub机制,调试内核,直接通过设置返回值跳过相关校验,并且把 /sbin/init改为 /bin/init来跳过 /sbin/init。
植入后门及后门使用
在命令行中执行diagnose hardware smartctl,系统会调用 /bin/smartctl。
我们可以通过修改 /bin/smartctl为我们的后门二进制文件。
1 |
|
同时由于原本文件系统中命令很少,这里我们自己编译一个busybox。(编译时Settings —> 选择[*] Build Busybox as a static binary并且去掉 Coreutils—>sync选项)
1 | sudo ln -sn /bin/busybox bin/sh |
替换完之后进行重打包
1 | find . | cpio -H newc -o > ../rootfs.raw |
对原来的vmdk里的rootfs.gz进行替换后即可重新开启虚拟机。之后在fortigate-7.2.1.vmx添加下列命令,即可利用debugStub进行内核调试。
1 | debugStub.listen.guest64 = "TRUE" |
patch完检查函数和启动文件之后即可进入正常的登录框。
输入指令diagnose hardware smartctl,调用我们的后门之后即可通过22端口拿到shell。
参考链接
https://forum.butian.net/share/2166
https://oraclepi.tech/post/PjuPrWzmI/
https://ioo0s.art/2023/02/07/%E5%88%A9%E7%94%A8VMware%E8%8E%B7%E5%8F%96shell-%E8%BF%9B%E9%98%B6/