
Analysis and PoC for CVE-2018-14847, MikroTik RouterOS Winbox information disclosure vulnerability allowing unauthenticated read access to the credential database.
Attaque par traversée de chemin non authentifiée dans le protocole Winbox de MikroTik divulguant les identifiants administrateur depuis /flash/rw/store/user.dat
CVE-2018-14847 est une vulnérabilité de traversée de chemin dans MikroTik RouterOS affectant le protocole de gestion Winbox (port TCP 8291). Un attaquant distant non authentifié peut lire des fichiers arbitraires du système de fichiers du routeur, y compris la base de données d'identifiants utilisateur /flash/rw/store/user.dat, qui stocke les mots de passe chiffrés avec une clé XOR statique faible.
La vulnérabilité a été divulguée à l'origine par Jacob Baines (Tenable) en juillet 2018 via l'exploit By the Way. Ce dépôt contient une réimplémentation autonome en Python3 avec une documentation complète du protocole.
| Canal | Versions |
|---|
| Long terme | 6.30.1 - 6.40.7 |
| Stable | 6.29 - 6.42 |
| Bêta | 6.29rc1 - 6.43rc3 |
MikroTik a corrigé cette vulnérabilité en avril 2018. Les appareils exécutant des versions de RouterOS antérieures aux versions corrigées restent vulnérables.
Winbox est le protocole de gestion binaire propriétaire de MikroTik fonctionnant sur le port TCP 8291. Les trames sont structurées comme suit :
[total_len - 2][0x01][0x00][total_len - 4]["M2"][champs...]
L'en-tête de 4 octets encode la taille totale de la trame. Il ne s'agit pas d'un u16 standard en little-endian – chaque octet encode total_length - 2 et total_length - 4 indépendamment.
Encodage des champs dans chaque trame :
| Octet de type | Signification | Valeur |
|---|---|---|
| 0xff | Marqueur de champ étendu | suivi de field_id et valeur |
| 0x09 | Entier u8 | 1 octet |
| 0x21 | Chaîne | préfixe de longueur 1 octet + données |
| 0x88 | Marqueur de réponse attendue | aucune valeur |
| 0xfe | Identifiant de champ étendu | id 3 octets + type + valeur |
Le gestionnaire de système de fichiers se trouve au point d'accès (sys=5, handler=0) et expose trois commandes pertinentes :
Le gestionnaire de système de fichiers Winbox ne nettoie pas le chemin passé à la commande d'ouverture de fichier. En imbriquant des séquences '/////./../', un attaquant s'échappe des limites du bac à sable et atteint le système de fichiers racine :
/////./..//////./..//////./../flash/rw/store/user.dat
Chaque segment '/////./../' (10 octets) remonte d'un niveau de répertoire. Trois segments atteignent la racine, après quoi flash/rw/store/user.dat est la base de données d'identifiants utilisateur de RouterOS. La requête ne nécessite aucune authentification.
L'exploit envoie deux trames :
user.dat est une séquence d'enregistrements nv::message. Chaque enregistrement est précédé d'un champ de longueur de 2 octets en little-endian et commence par les octets magiques M2. Les champs à l'intérieur de chaque enregistrement utilisent un identifiant de champ de 3 octets en little-endian :
| Identifiant de champ | Type | Signification |
|---|
| 0x01 | chaîne | nom d'utilisateur |
| 0x02 | u8 | groupe – 3 = accès administrateur complet |
| 0x11 | chaîne | mot de passe chiffré (vide si non défini) |
Les mots de passe sont chiffrés avec une clé XOR statique dérivée d'un sel codé en dur compilé dans RouterOS :
key = MD5(username + "283i4jfkai3389")
password = XOR(encrypted_pass[i], key[i % len(key)]) jusqu'à l'octet nul
Cela signifie que tout user.dat extrait d'un appareil affecté peut être déchiffré hors ligne sans force brute.
Après avoir obtenu le mot de passe administrateur, l'attaquant peut s'authentifier via Winbox et utiliser la commande create-file pour écrire deux fichiers qui activent la connexion développeur cachée :
/pckg/option active le paquet option
/flash/nova/etc/devel-login active l'utilisateur devel
Une fois ces fichiers présents, le routeur expose un shell root BusyBox via Telnet et SSH sous l'utilisateur devel, en utilisant le mot de passe de l'administrateur.
Telnet doit être connecté en premier pour que SSH fonctionne sur certaines versions de RouterOS.
Exploit_CVE_2018_14847.py est un exploit Python3 autonome sans dépendances externes. Il implémente le protocole binaire Winbox à partir de zéro et effectue :
# Port par défaut 8291
python3 Exploit_CVE_2018_14847.py 192.168.1.10
# Port personnalisé
python3 Exploit_CVE_2018_14847.py 192.168.1.10 8291
Post-exploitation – shell de porte dérobée développeur :
# Telnet (doit être connecté en premier)
telnet -l devel 192.168.1.10
# SSH (après la session Telnet)
ssh -oHostKeyAlgorithms=+ssh-dss [email protected]