
Analysis and PoC for CVE-2018-14847, MikroTik RouterOS Winbox information disclosure vulnerability allowing unauthenticated read access to the credential database.
MikroTik의 Winbox 프로토콜에서 인증되지 않은 경로 순회 취약점으로 /flash/rw/store/user.dat의 관리자 자격 증명이 누출됩니다.
CVE-2018-14847는 Winbox 관리 프로토콜(TCP 포트 8291)에 영향을 미치는 MikroTik RouterOS의 경로 순회 취약점입니다. 인증되지 않은 원격 공격자가 라우터 파일 시스템에서 임의의 파일을 읽을 수 있으며, 여기에는 약한 정적 XOR 키로 암호화된 비밀번호를 저장하는 사용자 자격 증명 데이터베이스 /flash/rw/store/user.dat가 포함됩니다.
이 취약점은 2018년 7월 Jacob Baines(Tenable)가 By the Way 익스플로잇을 통해 처음 공개했습니다. 이 저장소는 완전한 프로토콜 문서와 함께 독립형 Python3 재구현을 제공합니다.
| 채널 | 버전 |
|---|
| 장기 지원 | 6.30.1 - 6.40.7 |
| 안정 | 6.29 - 6.42 |
| 베타 | 6.29rc1 - 6.43rc3 |
MikroTik은 2018년 4월에 이 취약점을 패치했습니다. 수정된 버전보다 오래된 RouterOS를 실행하는 장치는 여전히 취약합니다.
Winbox는 TCP 포트 8291에서 실행되는 MikroTik의 독점 바이너리 관리 프로토콜입니다. 프레임 구조는 다음과 같습니다:
[total_len - 2][0x01][0x00][total_len - 4]["M2"][fields...]
4바이트 헤더는 전체 프레임 크기를 인코딩합니다. 표준 리틀 엔디언 u16이 아닙니다. 각 바이트는 독립적으로 total_length - 2와 total_length - 4를 인코딩합니다.
각 프레임 내부의 필드 인코딩:
| 타입 바이트 | 의미 | 값 |
|---|---|---|
| 0xff | 확장 필드 마커 | field_id와 값이 따라옴 |
| 0x09 | u8 정수 | 1바이트 |
| 0x21 | 문자열 | 1바이트 길이 접두사 + 데이터 |
| 0x88 | 응답 예상 마커 | 값 없음 |
| 0xfe | 확장 필드 ID | 3바이트 ID + 타입 + 값 |
파일 시스템 핸들러는 엔드포인트(sys=5, handler=0)에 있으며 세 가지 관련 명령을 제공합니다:
Winbox 파일 시스템 핸들러는 open-file 명령에 전달된 경로를 검증하지 않습니다. '/////./../' 시퀀스를 삽입하여 공격자는 샌드박스 경계를 벗어나 루트 파일 시스템에 도달합니다:
/////./..//////./..//////./../flash/rw/store/user.dat
각 '/////./../' 세그먼트(10바이트)는 한 디렉토리 레벨 위로 이동합니다. 세 개의 세그먼트가 루트에 도달한 후 flash/rw/store/user.dat가 RouterOS 사용자 자격 증명 데이터베이스입니다. 요청에는 인증이 필요하지 않습니다.
익스플로잇은 두 개의 프레임을 전송합니다:
user.dat는 nv::message 레코드의 시퀀스입니다. 각 레코드 앞에는 2바이트 리틀 엔디언 길이 필드가 있으며 매직 바이트 M2로 시작합니다. 각 레코드 내의 필드는 3바이트 리틀 엔디언 필드 ID를 사용합니다:
| 필드 ID | 타입 | 의미 |
|---|
| 0x01 | 문자열 | 사용자 이름 |
| 0x02 | u8 | 그룹 - 3 = 전체 관리자 접근 |
| 0x11 | 문자열 | 암호화된 비밀번호 (설정되지 않은 경우 비어 있음) |
비밀번호는 RouterOS에 컴파일된 하드코딩된 솔트에서 파생된 정적 XOR 키로 암호화됩니다:
key = MD5(username + "283i4jfkai3389")
password = XOR(encrypted_pass[i], key[i % len(key)]) until null byte
즉, 영향을 받는 모든 장치에서 추출된 user.dat는 무차별 대입 없이 오프라인으로 복호화할 수 있습니다.
관리자 비밀번호를 획득한 후 공격자는 Winbox를 통해 인증하고 create-file 명령을 사용하여 숨겨진 개발자 로그인을 활성화하는 두 개의 파일을 작성할 수 있습니다:
/pckg/option activates the option package
/flash/nova/etc/devel-login enables the devel user
이러한 파일이 존재하면 라우터는 관리자 비밀번호를 사용하여 Telnet 및 SSH를 통해 devel 사용자로 BusyBox 루트 셸을 노출합니다.
일부 RouterOS 버전에서는 SSH가 작동하려면 먼저 Telnet에 연결해야 합니다.
Exploit_CVE_2018_14847.py는 외부 종속성이 없는 독립형 Python3 익스플로잇입니다. Winbox 바이너리 프로토콜을 처음부터 구현하며 다음을 수행합니다:
# 기본 포트 8291
python3 Exploit_CVE_2018_14847.py 192.168.1.10
# 사용자 지정 포트
python3 Exploit_CVE_2018_14847.py 192.168.1.10 8291
사후 이용 - 개발자 백도어 셸:
# Telnet (먼저 연결해야 함)
telnet -l devel 192.168.1.10
# SSH (Telnet 세션 이후)
ssh -oHostKeyAlgorithms=+ssh-dss [email protected]