
Befehlseinschleusungs-Exploit für die TP-Link Tapo C200 Kamera (CVE-2021-4045), der Root-Shell-Zugriff über UART und Analyse der rückentwickelten uhttpd-Binärdatei bereitstellt.
CVE-2021-4045
CVE-2021-4045 ist eine Befehlsinjektions-Schwachstelle, die in der Kamera TP-Link Tapo C200 entdeckt wurde und es einem Angreifer ermöglicht, die vollständige Kontrolle über das Gerät mit root-Berechtigungen zu übernehmen. Diese Schwachstelle betrifft alle Firmware-Versionen vor 1.1.16 Build 211209 Rel. 37726N.
🔗 Offizielle Mitteilung von INCIBE: https://www.incibe.es/incibe-cert/alerta-temprana/vulnerabilidades/cve-2021-4045 (Durch den tatsächlichen Link ersetzen)
🔧 Empfohlene Lösung: Firmware auf Version 1.1.16 oder höher aktualisieren.
$ nmap -sV -p- 192.168.1.81
**Ergebnis**:```
PORT STATE SERVICE
443/tcp open https
554/tcp open rtsp
2020/tcp open xinupageserver
8800/tcp open sunwebadmin
Wie man sehen kann, hat das Gerät einige interessante offene Ports. Das erste, was ich testete, war Port 443. Obwohl nmap deutlich anzeigt, dass es https verwendet, habe ich beim ersten Scan dies übersehen und lange Zeit gedacht, Port 443 würde http verwenden. Deshalb habe ich nur http://192.168.1.81:443 statt https://192.168.1.81:443 ausprobiert und nur 400-Antworten erhalten. Wie ich in der Einleitung sagte, war dieser Prozess voller Fehler. Was die anderen Ports betrifft, waren mir die darauf laufenden Dienste völlig unbekannt und ich fand keine klaren Informationen dazu. Zu diesem Zeitpunkt hatte ich keine bekannten Optionen mehr, also war es an der Zeit, tiefer zu graben.
----[ Eine Shell bekommen ]-------------------------------
Bevor ich die Kamera kaufte, suchte ich im Internet nach früheren Recherchen zu dem Gerät und fand glücklicherweise dieses GitHub-Repository, in dem Leute gemeinsam Reverse Engineering betrieben. Eines der Issues erklärte, wie man über den UART-Port Zugriff auf die Konsole erhält – etwas, das mir damals völlig unbekannt war. Also lernte ich die Grundlagen und kaufte einen USB-auf-TTL-Konverter, um mich zu verbinden.
Mit Hilfe des erwähnten Issues konnte ich das Gerät mit einem Messer und einem Schraubendreher öffnen und schnell den UART lokalisieren. Nach ein paar Versuchen und viel Geduld gelang es mir schließlich, einige Kabel an die Pads zu löten.
Dann war es an der Zeit zu prüfen, ob die Lötstelle gut genug für die Datenübertragung war. Ich schloss die Kabel an den USB-Adapter an, wobei ich bedenken musste, dass Rx des UART an Tx des Adapters geht und umgekehrt, und verband den Adapter mit meinem Computer. Dank des erwähnten Issues wusste ich, dass die Baudrate für die serielle Verbindung 57600 betrug, also führte ich aus:
$ sudo screen /dev/tty.usbserial-0001 57600
Dabei ist '/dev/tty.usbserial-0001' der USB-Port, an dem der Adapter angeschlossen ist und der das Gerät mit Strom versorgt. Sofort begann ich, Daten zu empfangen – großartig.
Allerdings hatte ich noch keinen Zugriff auf die Konsole. Was ich empfing, war lediglich die Boot-Sequenz des Geräts, die eigentlich der U-Boot-Bootloader war. Es sah ungefähr so aus:
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
[...]
Beim Drücken der Eingabetaste werden wir aufgefordert, einen Benutzernamen und ein Passwort einzugeben. Dank dieses GitHub-Issues kennen wir die Zugangsdaten, sodass wir uns erfolgreich mit dem Benutzer 'root' und dem Passwort 'slprealtek' anmelden und schließlich Zugriff auf die Konsole erhalten.
Nachdem ich überprüft hatte, dass die Verbindung funktioniert, musste ich die Lötstelle verstärken, da sie während des Zusammenbaus des Gehäuses zweimal gebrochen war. Ich trug Heißkleber auf, um alle Kabel zu sichern, und schloss das Gerät, wobei ich alle Motoren abklemmte. Nun war meine Testeinheit bereit.
----[ Das Gerät erkunden ]--------------------------
Jetzt, wo wir eine Shell haben, erkunden wir das Gerät:
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
Wie wir sehen, handelt es sich um eine OpenWRT-Maschine, die Linux 3.10.27 ausführt. Schauen wir uns nun die aktiven Prozesse und offenen Ports an: