
Analisi e PoC per CVE-2018-14847, vulnerabilità di divulgazione di informazioni in MikroTik RouterOS Winbox che consente l'accesso in lettura non autenticato al database delle credenziali.
Path traversal non autenticato nel protocollo Winbox di MikroTik che espone le credenziali di amministratore da /flash/rw/store/user.dat
CVE-2018-14847 è una vulnerabilità di path traversal in MikroTik RouterOS che interessa il protocollo di gestione Winbox (porta TCP 8291). Un attaccante remoto non autenticato può leggere file arbitrari dal filesystem del router, incluso il database delle credenziali utente /flash/rw/store/user.dat, che memorizza le password cifrate con una debole chiave XOR statica.
La vulnerabilità è stata originariamente divulgata da Jacob Baines (Tenable) nel luglio 2018 tramite l'exploit By the Way. Questo repository contiene una reimplementazione standalone in Python3 con documentazione completa del protocollo.
| Channel | Versions |
|---|
| Longterm | 6.30.1 - 6.40.7 |
| Stable | 6.29 - 6.42 |
| Beta | 6.29rc1 - 6.43rc3 |
MikroTik ha corretto questa vulnerabilità nell'aprile 2018. I dispositivi con RouterOS più vecchi delle versioni corrette rimangono vulnerabili.
Winbox è il protocollo di gestione binario proprietario di MikroTik in esecuzione sulla porta TCP 8291. I frame sono strutturati come:
[total_len - 2][0x01][0x00][total_len - 4]["M2"][fields...]
L'intestazione di 4 byte codifica la dimensione totale del frame. Non è un u16 little-endian standard - ogni byte codifica total_length - 2 e total_length - 4 indipendentemente.
Codifica dei campi all'interno di ogni frame:
| Byte di tipo | Significato | Valore |
|---|---|---|
| 0xff | Marcatore di campo esteso | seguito da field_id e valore |
| 0x09 | Intero u8 | 1 byte |
| 0x21 | Stringa | prefisso di lunghezza 1 byte + dati |
| 0x88 | Marcatore di risposta attesa | nessun valore |
| 0xfe | ID campo esteso | ID 3 byte + tipo + valore |
Il gestore del filesystem risiede all'endpoint (sys=5, handler=0) ed espone tre comandi rilevanti:
Il gestore del filesystem di Winbox non sanifica il percorso passato al comando apri file. Incorporando sequenze '/////./../', un attaccante esce dal confine della sandbox e raggiunge il filesystem di root:
/////./..//////./..//////./../flash/rw/store/user.dat
Ogni segmento '/////./../' (10 byte) sale di un livello di directory. Tre segmenti raggiungono la root, dopodiché flash/rw/store/user.dat è il database delle credenziali utente di RouterOS. La richiesta non richiede autenticazione.
L'exploit invia due frame:
user.dat è una sequenza di record nv::message. Ogni record è preceduto da un campo di lunghezza LE di 2 byte e inizia con i byte magici M2. I campi all'interno di ogni record utilizzano un ID campo LE di 3 byte:
| ID campo | Tipo | Significato |
|---|
| 0x01 | stringa | nome utente |
| 0x02 | u8 | gruppo - 3 = accesso amministratore completo |
| 0x11 | stringa | password cifrata (vuota se non impostata) |
Le password sono cifrate con una chiave XOR statica derivata da un sale hardcoded compilato in RouterOS:
key = MD5(username + "283i4jfkai3389")
password = XOR(encrypted_pass[i], key[i % len(key)]) fino al byte nullo
Ciò significa che qualsiasi user.dat estratto da qualsiasi dispositivo affetto può essere decifrato offline senza forza bruta.
Dopo aver ottenuto la password di amministratore, l'attaccante può autenticarsi tramite Winbox e utilizzare il comando crea file per scrivere due file che attivano il login nascosto dello sviluppatore:
/pckg/option attiva il pacchetto option
/flash/nova/etc/devel-login abilita l'utente devel
Una volta che questi file esistono, il router espone una shell root di BusyBox tramite Telnet e SSH sotto l'utente devel, utilizzando la password dell'amministratore.
Telnet deve essere connesso prima affinché SSH funzioni su alcune versioni di RouterOS.
Exploit_CVE_2018_14847.py è un exploit Python3 autonomo con zero dipendenze esterne. Implementa il protocollo binario Winbox da zero ed esegue:
# Porta predefinita 8291
python3 Exploit_CVE_2018_14847.py 192.168.1.10
# Porta personalizzata
python3 Exploit_CVE_2018_14847.py 192.168.1.10 8291
Post-exploitation - shell backdoor sviluppatore:
# Telnet (connettere prima)
telnet -l devel 192.168.1.10
# SSH (dopo sessione Telnet)
ssh -oHostKeyAlgorithms=+ssh-dss [email protected]