
Exploit di iniezione di comandi per la telecamera TP-Link Tapo C200 (CVE-2021-4045) che fornisce accesso alla shell di root tramite UART e analisi del binario uhttpd sottoposto a reverse engineering.
CVE-2021-4045
CVE-2021-4045 è una vulnerabilità di iniezione di comandi scoperta nella fotocamera TP-Link Tapo C200, che consente a un attaccante di prendere il controllo totale del dispositivo con privilegi di root. Questa vulnerabilità interessa tutte le versioni del firmware precedenti alla 1.1.16 Build 211209 Rel. 37726N.
🔗 Avviso ufficiale di INCIBE: https://www.incibe.es/incibe-cert/alerta-temprana/vulnerabilidades/cve-2021-4045 (Sostituire con il link reale)
🔧 Soluzione consigliata: Aggiornare il firmware alla versione 1.1.16 o successiva.
$ nmap -sV -p- 192.168.1.81
**Risultato**:```
PORT STATE SERVICE
443/tcp open https
554/tcp open rtsp
2020/tcp open xinupageserver
8800/tcp open sunwebadmin
Come potete vedere, il dispositivo ha alcune porte aperte interessanti. La prima cosa che ho provato è stata la porta 443. Sebbene nmap indichi chiaramente che usa https, quando ho effettuato la scansione iniziale, l'ho trascurato e ho passato parecchio tempo pensando che la porta 443 usasse http. A causa di ciò, ho provato solo http://192.168.1.81:443 invece di https://192.168.1.81:443, quindi ho ottenuto solo risposte 400. Come ho detto nell'introduzione, questo processo è stato pieno di errori. Per quanto riguarda le altre porte, i servizi che vi giravano mi erano del tutto sconosciuti e non ho trovato alcuna informazione chiara al riguardo. A quel punto, ero rimasto senza opzioni note, quindi era ora di indagare più a fondo.
----[ Ottenere una shell ]-------------------------------
Prima di acquistare la fotocamera, ho cercato su internet ricerche precedenti sul dispositivo e, per fortuna, ho trovato questo repository GitHub dove le persone collaboravano per fare reverse engineering. Uno dei problemi spiegava come ottenere accesso alla console tramite la porta UART, qualcosa che all'epoca non conoscevo affatto. Così ho imparato le basi e ho comprato un convertitore da USB a TTL per connettermi.
Con l'aiuto del problema menzionato, sono riuscito ad aprire il dispositivo con un coltello e un cacciavite e a individuare rapidamente la UART. Dopo un paio di tentativi e molta pazienza, sono finalmente riuscito a saldare alcuni cavi ai pad.
Poi è arrivato il momento di verificare se la saldatura era abbastanza buona per la trasmissione dei dati. Ho collegato i cavi all'adattatore USB, tenendo presente che Rx della UART va a Tx dell'adattatore e viceversa, e ho collegato l'adattatore al mio computer. Di nuovo, grazie al problema menzionato, sapevo che la velocità di trasmissione per la connessione seriale era di 57600, quindi ho eseguito:
$ sudo screen /dev/tty.usbserial-0001 57600
Dove '/dev/tty.usbserial-0001' è la porta USB a cui è collegato l'adattatore e che alimenta il dispositivo. Immediatamente ho iniziato a ricevere dati, fantastico.
Tuttavia, non avevo ancora accesso alla console. Quello che ricevevo era semplicemente la sequenza di avvio del dispositivo, che in realtà era il bootloader U-Boot. Aveva un aspetto simile a questo:
U-Boot 2014.01-v1.2 (Jul 16 2021 - 18:41:10)
Board: IPCAM RTS3903 CPU: 500M :rx5281 prid=0xdc02 force spi nor mode DRAM: 64 MiB @ 1066 MHz Skipping flash_init Flash: 0 Bytes flash status is 0, 0, 0 SF: Detected XM25QH64A with page size 256 Bytes, erase size 64 KiB, total 8 MiB Using default environment
Autobooting in 1 seconds copying flash to 0x81500000 flash status is 0, 0, 0 SF: Detected XM25QH64A with page size 256 Bytes, erase size 64 KiB, total 8 MiB SF: 8388608 bytes @ 0x0 Read: OK
[...]
Premendo Invio, ci viene chiesto di inserire nome utente e password. Grazie a quel problema di GitHub, conosciamo le credenziali, quindi possiamo accedere correttamente con l'utente 'root' e la password 'slprealtek' e, infine, ottenere accesso alla console.
Una volta verificato che la connessione funzionava, ho dovuto rinforzare la saldatura, perché si era rotta due volte durante il processo di montaggio della scocca. Ho applicato colla termofusibile per assicurare tutti i cavi e ho chiuso il dispositivo, scollegando tutti i motori. Ora la mia unità di test era pronta.
----[ Esplorando il dispositivo ]--------------------------
Ora che abbiamo una shell, esploriamo il dispositivo:
root@SLP:~# uname -a Linux SLP 3.10.27 #1 PREEMPT Wed Nov 11 20:42:05 CST 2020 rlx GNU/Linux
root@SLP:~# cat /etc/openwrt_version 12.09-rc1
Come possiamo vedere, si tratta di una macchina OpenWRT che esegue Linux 3.10.27. Ora controlliamo i processi attivi e le porte aperte: