飞塔防火墙漏洞深度利用及调试环境搭建
字数 2113 2025-08-29 22:41:24

飞塔防火墙漏洞深度利用及调试环境搭建指南

1. 环境搭建

1.1 虚拟机准备

  1. 从官方下载FortiGate-VM镜像
  2. 导入到虚拟化平台(VMware等)
  3. 参考脚本进行激活: fgt-gadgets

1.2 网络配置

  • 设置第一个网卡为NAT模式
  • 配置网卡IP地址
  • 完成配置后可通过Web界面访问

1.3 SSL VPN配置

  1. 启用SSL VPN功能
  2. 配置SSLVPN地址和子网
  3. 创建新用户
  4. 修改VPN门户设置:
    • 进入VPN -> SSL-VPN-Portals -> full-access
    • 修改相关设置
  5. 调整防火墙策略
  6. 测试访问4433端口

2. 调试环境搭建

2.1 固件提取

  1. 安装libguestfs工具集(用于访问虚拟机磁盘映像)
  2. 查看磁盘分区情况
  3. 挂载磁盘(建议在VMware中直接挂载)
  4. 提取rootfs.gz(文件系统压缩包)
  5. 赋权并解压rootfs.gz

2.2 工具准备

  1. Busybox准备:

    • 提供完整shell指令(FortiGate自带shell功能有限)
    • 编译可能遇到问题,建议多尝试几个版本
    • 配置时去掉Networking Utilities中的tc功能
  2. gdbserver配置:

    • 利用diagnose hardware smartctl执行路径
    • 替换/bin/smartctl为自定义程序
    • 复用22端口为shell

2.3 内核修改

  1. 反编译内核文件flatkc
  2. 分析启动流程(主要关注init文件)
  3. Patch init文件:
    • 修改所有涉及do_halt函数的调用
  4. 重打包文件系统
  5. 覆盖原始rootfs.gz

2.4 调试技巧

  1. 系统可能不断重启(因身份验证失败)
  2. 调试策略:
    • 不要直接点击"继续"按钮
    • 从最早的点开始断点
    • 逐步接近目标断点位置
  3. 关键调试命令:
    • ni单步执行
    • set $rax=0修改寄存器值
    • c继续执行

3. 漏洞分析

3.1 漏洞描述

  • 类型: 基于堆的缓冲区溢出(CWE-122)
  • 影响版本:
    • FortiOS SSL-VPN:
      • 7.2.0-7.2.2
      • 7.0.0-7.0.8
      • 6.4.0-6.4.10
      • 6.2.0-6.2.11
      • 6.0.15及更早
    • FortiProxy SSL-VPN:
      • 7.2.0-7.2.1
      • 7.0.7及更早
  • 影响: 远程未认证攻击者可执行任意代码

3.2 攻击思路比较

  1. system() vs exec():

    • system()创建新进程并等待返回
    • exec()用新进程覆盖原进程
    • system()返回值不影响原进程
    • exec()返回值影响原进程
  2. 无/bin/sh环境下的攻击选择:

    • 下载编译好的busybox(推荐)
    • 通过ROP上传执行文件(文件大易崩溃)

3.3 ROP链构造难点

  1. gadget不足且不能破坏已有参数
  2. ROP链长度限制
  3. 长字符串参数(如IP地址)处理困难
  4. 数组传参导致ROP链复杂

4. 漏洞利用实战

4.1 基础利用

  1. 使用mprotect开启可执行段:
    • 需要控制rdi、rsi、rdx三个寄存器
    • 查找合适gadget
  2. 通过jmp rsp跳转到shellcode

4.2 Shellcode编写

  1. 空间限制约0xc0字节
  2. 解决方案:
    • 迁移RIP到0x620+8位置
    • 使用lea rax, [rip + 0x69]扩展空间
  3. 示例功能:
    • 通过execl执行tftp下载
    • 参数传递注意事项:
      • 超过8字节需分段传递
      • 注意参数顺序和NULL终止

4.3 权限问题解决

  1. 直接上传busybox到/bin失败原因:
    • 权限不足
    • 缺少库文件
  2. 替代方案:
    • 上传到/tmp目录
    • 通过其他方式提权

4.4 Node.js利用方案

  1. 发现FortiGate内置Node.js
  2. 优势:
    • 可执行.js文件
    • 有修改文件权限的函数
  3. 攻击流程:
    • 下载shell.js
    • shell.js功能:
      • 下载busybox
      • 赋权
      • 创建shell软链
      • 调用busybox命令
  4. 预编译busybox资源:

4.5 反弹Shell实现

  1. 通过Node.js渲染执行:
    • 下载busybox
    • 赋权
    • 建立反弹连接
  2. js文件示例内容:
    // 下载busybox
    // 赋权
    // 建立shell
    

5. 完整攻击流程

  1. 初始访问:

    • 通过SSL VPN漏洞获得初步执行能力
  2. 环境准备:

    • 上传busybox或利用Node.js方案
    • 解决权限问题
  3. 持久化:

    • 创建可持续访问的后门
    • 可能包括:
      • 修改系统文件
      • 创建隐藏账户
      • 设置定时任务
  4. 横向移动:

    • 利用获取的权限探索内网
    • 可能结合其他漏洞扩大影响
  5. 清理痕迹:

    • 删除日志记录
    • 隐藏上传的文件

6. 防御建议

  1. 及时更新到最新版本
  2. 限制SSL VPN访问源IP
  3. 监控异常网络行为
  4. 定期审计系统配置
  5. 实施最小权限原则

7. 总结

本指南详细介绍了FortiGate防火墙漏洞的利用过程,从环境搭建到漏洞利用,涵盖了多种攻击路径和解决方案。重点包括:

  1. 调试环境的特殊处理
  2. 无完整shell环境下的攻击思路
  3. ROP链构造的挑战与解决方案
  4. Node.js在漏洞利用中的巧妙应用
  5. 完整攻击链的构建

这些技术不仅适用于FortiGate设备,其思路也可应用于其他受限环境下的漏洞利用场景。

飞塔防火墙漏洞深度利用及调试环境搭建指南 1. 环境搭建 1.1 虚拟机准备 从官方下载FortiGate-VM镜像 导入到虚拟化平台(VMware等) 参考脚本进行激活: fgt-gadgets 1.2 网络配置 设置第一个网卡为NAT模式 配置网卡IP地址 完成配置后可通过Web界面访问 1.3 SSL VPN配置 启用SSL VPN功能 配置SSLVPN地址和子网 创建新用户 修改VPN门户设置: 进入 VPN -> SSL-VPN-Portals -> full-access 修改相关设置 调整防火墙策略 测试访问4433端口 2. 调试环境搭建 2.1 固件提取 安装libguestfs工具集(用于访问虚拟机磁盘映像) 查看磁盘分区情况 挂载磁盘(建议在VMware中直接挂载) 提取rootfs.gz(文件系统压缩包) 赋权并解压rootfs.gz 2.2 工具准备 Busybox准备 : 提供完整shell指令(FortiGate自带shell功能有限) 编译可能遇到问题,建议多尝试几个版本 配置时去掉Networking Utilities中的tc功能 gdbserver配置 : 利用 diagnose hardware smartctl 执行路径 替换/bin/smartctl为自定义程序 复用22端口为shell 2.3 内核修改 反编译内核文件flatkc 分析启动流程(主要关注init文件) Patch init文件: 修改所有涉及do_ halt函数的调用 重打包文件系统 覆盖原始rootfs.gz 2.4 调试技巧 系统可能不断重启(因身份验证失败) 调试策略: 不要直接点击"继续"按钮 从最早的点开始断点 逐步接近目标断点位置 关键调试命令: ni 单步执行 set $rax=0 修改寄存器值 c 继续执行 3. 漏洞分析 3.1 漏洞描述 类型: 基于堆的缓冲区溢出(CWE-122) 影响版本: FortiOS SSL-VPN: 7.2.0-7.2.2 7.0.0-7.0.8 6.4.0-6.4.10 6.2.0-6.2.11 6.0.15及更早 FortiProxy SSL-VPN: 7.2.0-7.2.1 7.0.7及更早 影响: 远程未认证攻击者可执行任意代码 3.2 攻击思路比较 system() vs exec() : system()创建新进程并等待返回 exec()用新进程覆盖原进程 system()返回值不影响原进程 exec()返回值影响原进程 无/bin/sh环境下的攻击选择 : 下载编译好的busybox(推荐) 通过ROP上传执行文件(文件大易崩溃) 3.3 ROP链构造难点 gadget不足且不能破坏已有参数 ROP链长度限制 长字符串参数(如IP地址)处理困难 数组传参导致ROP链复杂 4. 漏洞利用实战 4.1 基础利用 使用mprotect开启可执行段: 需要控制rdi、rsi、rdx三个寄存器 查找合适gadget 通过jmp rsp跳转到shellcode 4.2 Shellcode编写 空间限制约0xc0字节 解决方案: 迁移RIP到0x620+8位置 使用lea rax, [ rip + 0x69 ]扩展空间 示例功能: 通过execl执行tftp下载 参数传递注意事项: 超过8字节需分段传递 注意参数顺序和NULL终止 4.3 权限问题解决 直接上传busybox到/bin失败原因: 权限不足 缺少库文件 替代方案: 上传到/tmp目录 通过其他方式提权 4.4 Node.js利用方案 发现FortiGate内置Node.js 优势: 可执行.js文件 有修改文件权限的函数 攻击流程: 下载shell.js shell.js功能: 下载busybox 赋权 创建shell软链 调用busybox命令 预编译busybox资源: busybox binaries 4.5 反弹Shell实现 通过Node.js渲染执行: 下载busybox 赋权 建立反弹连接 js文件示例内容: 5. 完整攻击流程 初始访问: 通过SSL VPN漏洞获得初步执行能力 环境准备: 上传busybox或利用Node.js方案 解决权限问题 持久化: 创建可持续访问的后门 可能包括: 修改系统文件 创建隐藏账户 设置定时任务 横向移动: 利用获取的权限探索内网 可能结合其他漏洞扩大影响 清理痕迹: 删除日志记录 隐藏上传的文件 6. 防御建议 及时更新到最新版本 限制SSL VPN访问源IP 监控异常网络行为 定期审计系统配置 实施最小权限原则 7. 总结 本指南详细介绍了FortiGate防火墙漏洞的利用过程,从环境搭建到漏洞利用,涵盖了多种攻击路径和解决方案。重点包括: 调试环境的特殊处理 无完整shell环境下的攻击思路 ROP链构造的挑战与解决方案 Node.js在漏洞利用中的巧妙应用 完整攻击链的构建 这些技术不仅适用于FortiGate设备,其思路也可应用于其他受限环境下的漏洞利用场景。