0%

Fortigate环境搭建

Fortigate 环境搭建及固件提取

前言

逐步补上之前未记录的环境搭建过程(Fortigate 旧版

环境搭建

首先下载fortigate的虚拟机镜像,解压缩之后,双击ovf之后即可用vmware打开,并把网络模式从桥接改为NAT。

等待初始化完成之后,即可用admin+空密码登录。

使用如下命令配置网络

1
2
3
4
5
6
config system interface
edit port1
set mode static
set ip 192.168.xxx.xxx/255.255.255.0
set allowaccess ping ssh telnet http https
end

配置好之后即可访问web界面,配置sslvpn并增加相应防火墙规则。

配置完之后便可以访问到sslvpn登录界面。

固件提取

在完成上述配置之后,关闭虚拟机,会看到虚拟机文件夹下有fortigate-7.2.1-disk1.vmdk。我们把它复制到其他目录下,并且挂载到其他虚拟机下,这里我直接挂载到了kali下。

内核文件是FORTIOS下的flatkc。主要文件系统市在FORTIOS下的rootfs.gz中。将它复制到其他文件夹下,使用下列命令对其进行解压。解压之后即可得到主要的文件系统。

1
2
3
4
gzip -d rootfs.gz
sudo cpio -idmv < ./rootfs
sudo chroot . /sbin/xz --check=sha256 -d /bin.tar.xz
sudo chroot . /sbin/ftar -xf /bin.tar

后门植入

绕过文件系统检查

之前我们登陆后台拿到的是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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <stdlib.h>

void shell(){
system("/bin/busybox ls");
system("/bin/busybox id");
system("/bin/busybox killall sshd && /bin/busybox telnetd -l /bin/sh -b 0.0.0.0 -p 22");
return;
}

int main(int argc, char const *argv[])
{
shell();
return 0;
}

//gcc -g smartctl.c -static -o smartctl

同时由于原本文件系统中命令很少,这里我们自己编译一个busybox。(编译时Settings —> 选择[*] Build Busybox as a static binary并且去掉 Coreutils—>sync选项)

1
sudo ln -sn /bin/busybox bin/sh

替换完之后进行重打包

1
2
find . | cpio -H newc -o > ../rootfs.raw
cat ../rootfs.raw | gzip > ../rootfs.gz

对原来的vmdk里的rootfs.gz进行替换后即可重新开启虚拟机。之后在fortigate-7.2.1.vmx添加下列命令,即可利用debugStub进行内核调试。

1
2
3
debugStub.listen.guest64 = "TRUE"
debugStub.listen.guest64.remote = "TRUE"
debugStub.port.guest64 = "12345"

patch完检查函数和启动文件之后即可进入正常的登录框。

输入指令diagnose hardware smartctl,调用我们的后门之后即可通过22端口拿到shell。

参考链接

https://forum.butian.net/share/2166

https://wzt.ac.cn/2023/03/02/fortigate_debug_env1/#%E6%A4%8D%E5%85%A5%E5%90%8E%E9%97%A8%E5%B9%B6%E5%90%AF%E5%8A%A8

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/