Funktionsweise von TCP Reset Attack

Ein TCP-Reset-Angriff wird mit einem einzelnen Datenpaket ausgeführt, das nicht größer als einige Bytes ist. Das durch Angreifer ersetzte und übertragene TCP-Segment täuscht die beiden Opfer vor, die TCP-Verbindung zu beenden, und unterbricht die Verbindung zwischen ihnen, was kritisch sein kann.


Dieser Angriff hatte Konsequenzen in der realen Welt. Befürchtungen hinsichtlich seiner Verwendung wurden durch die Einführung von Änderungen am TCP-Protokoll selbst verursacht. Es wird angenommen, dass der Angriff ein wesentlicher Bestandteil der Great Chinese Firewall (Golden Shield) ist, mit der die chinesische Regierung das Internet außerhalb Chinas zensiert. Trotz ihres beeindruckenden Hintergrunds erfordert das Verständnis der Mechanismen hinter diesem Angriff nicht unbedingt gründliche Kenntnisse über TCP. Natürlich kann Ihnen ein Verständnis der Feinheiten viel über die Funktionen der Implementierung des TCP-Protokolls beibringen, und wie wir gleich sehen werden, können Sie diesen Angriff sogar mit nur einem Laptop gegen sich selbst ausführen.

In diesem Beitrag haben wir:

  • Lernen Sie die Grundlagen von TCP
  • Erfahren Sie, wie der Angriff funktioniert.
  • Lassen Sie uns mit einem einfachen Python-Skript einen Angriff gegen uns selbst durchführen.

Bevor wir beginnen, die Mechanik des Angriffs zu analysieren, wollen wir zunächst sehen, wie er in der realen Welt verwendet wird.

Wie wird ein TCP-Reset-Angriff in der Great Firewall verwendet?


Great Firewall (GFW) ist eine Reihe von Systemen und Techniken, mit denen die chinesische Regierung das Internet für interne chinesische Benutzer zensiert. GFW blockiert und unterbricht aktiv Verbindungen mit Servern innerhalb und außerhalb des Landes und überwacht passiv den Internetverkehr mit verbotenen Inhalten.

Um zu verhindern, dass Benutzer überhaupt eine Verbindung zu gesperrten Servern herstellen, verwendet GFW Techniken wie DNS-Verschmutzung und IP-Blockierung(beide kosten separate Artikel). Manchmal muss es der GFW-Firewall jedoch gestattet sein, eine Verbindung herzustellen, diese jedoch in der Mitte zu unterbrechen. Dies ist beispielsweise erforderlich, wenn Sie eine langsame, ausstehende Analyse der Verbindung durchführen möchten, z. B. ihre Korrelation mit anderen Aktionen. Oder es wird verwendet, wenn die Firewall die während des Verbindungsprozesses ausgetauschten Daten analysieren und anhand dieser Informationen entscheiden muss, ob sie fortgesetzt oder blockiert werden sollen. Beispielsweise kann der Verkehr zu einer Nachrichtenwebsite zugelassen werden, Videos mit verbotenen Schlüsselwörtern werden jedoch zensiert.

Dafür benötigt GFW Tools, mit denen bereits bestehende Verbindungen unterbrochen werden können. Ein solches Tool ist ein TCP-Reset-Angriff.

Wie funktioniert ein TCP-Reset-Angriff?


Bei einem TCP-Reset-Angriff unterbricht der Angreifer die Verbindung zwischen den beiden Opfern und sendet eine oder beide gefälschte Nachrichten, in denen er sie auffordert, die Verbindung sofort zu trennen. Diese Nachrichten werden als TCP-Rücksetzsegmente bezeichnet . Im normalen Betrieb ohne Beteiligung eines Angreifers senden Computer TCP-Drop-Segmente, wenn sie unerwarteten TCP-Verkehr empfangen und möchten, dass der Absender den Versand beendet.

Der TCP-Reset-Angriff nutzt diesen Mechanismus böswillig aus und bringt die Opfer dazu, TCP-Verbindungen vorzeitig zu beenden, und sendet ihnen gefälschte Reset-Segmente. Wenn das falsche Rücksetzsegment korrekt ausgeführt wird, nimmt der Empfänger es für das reale Segment und schließt die Verbindung seinerseits, wodurch die weitere Übertragung von Informationen über diese Verbindung unterbrochen wird. Um den Datenaustausch fortzusetzen, versuchen die Opfer möglicherweise, eine neue TCP-Verbindung herzustellen. Der Angreifer hat jedoch möglicherweise die Möglichkeit, diese neue Verbindung zurückzusetzen. Da ein Angreifer Zeit benötigt, um ein gefälschtes Paket zu erstellen und zu senden, ist das Ablegen von Angriffen glücklicherweise nur gegen langfristige Verbindungen wirklich effektiv. Kurzfristige Verbindungen. Wenn Sie beispielsweise kleine Webseiten übertragen, haben Sie normalerweise Zeit, um Ihre Mission zu erfüllenwenn der Angreifer sie zurücksetzen kann.

Das Senden gefälschter TCP-Segmente ist in gewissem Sinne ein einfacher Vorgang, da weder TCP noch IP über eigene Methoden zur Überprüfung der Identität des Absenders verfügen. Es gibt eine IP-Erweiterung namens IPSec, die Authentifizierung bietet, aber nicht so weit verbreitet ist. Internetdienstanbieter müssen sich weigern, IP-Pakete zu übertragen, die von einer offensichtlich falschen IP-Adresse stammen. Es wird jedoch behauptet, dass diese Überprüfung sehr mittelmäßig ist. Der Empfänger kann lediglich die Quell-IP-Adresse und den Port innerhalb des Pakets oder Segments zum Nennwert verwenden und, wenn möglich, übergeordnete Protokolle wie TLS verwenden , um den Absender zu identifizieren . Da TCP-Dump-Pakete jedoch Teil des TCP-Protokolls selbst sind, können sie mit diesen Protokollen auf hoher Ebene nicht überprüft werden.

Trotz der Einfachheit, gefälschte Segmente zu senden, kann das Erstellen eines gefälschten Segments und das Ausführen eines erfolgreichen TCP-Reset-Angriffs immer noch eine entmutigende Aufgabe sein. Um zu verstehen, warum dies geschieht, müssen wir die Funktionsweise des TCP-Protokolls verstehen.

Wie funktioniert TCP?


Der Zweck des TCP-Protokolls besteht darin, dem Empfänger eine genaue Kopie des Datenblocks zu senden. Wenn mein Server beispielsweise HTML über TCP an Ihren Computer sendet, sollte der TCP-Stapel Ihres Computers (der Teil seines Betriebssystems, der TCP verarbeitet) mein HTML in genau der Form und Reihenfolge ausgeben, in der mein Server es gesendet hat.


Mein HTML wird jedoch nicht so perfekt geordnet über das Internet übertragen. Es ist in viele kleine Fragmente (sogenannte TCP-Segmente ) unterteilt, von denen jedes einzeln über das Internet übertragen und in der vom TCP-Stapel Ihres Computers übertragenen Reihenfolge neu erstellt wird. Diese wiederhergestellte Ausgabe wird als TCP-Stream bezeichnet . Jedes TCP-Segment wird in einem eigenen IP-Paket übertragen. Um den Angriff zu verstehen, müssen wir jedoch keine Details zu IP kennen.


Das Konvertieren von Segmenten in einen Stream erfordert Sorgfalt, da das Internet unzuverlässig ist. TCP-Segmente können verloren gehen. Sie können außer Betrieb geraten, zweimal verschickt werden, beschädigt werden und viele andere Missgeschicke erleiden. Daher besteht der Zweck des TCP-Protokolls darin, eine zuverlässige Datenübertragung über ein unzuverlässiges Netzwerk sicherzustellen. TCP führt diese Aufgabe aus, wobei beide Seiten der Verbindung einen engen Kontakt untereinander aufrechterhalten und ständig Informationen darüber übertragen müssen, welche Datenblöcke empfangen wurden. Auf diese Weise können Absender nachvollziehen, welche Daten der Empfänger noch nicht empfangen hat, und die verlorenen Daten erneut übertragen.

Um zu verstehen, wie der Prozess funktioniert, müssen wir verstehen, wie Sender und Empfänger TCP-Sequenznummern verwenden zum Markieren und Verfolgen von Daten, die über TCP übertragen werden.

TCP-Sequenznummern


Jedem über eine TCP-Verbindung übertragenen Byte wird vom Absender eine Sequenznummer zugewiesen. Empfangsmaschinen verwenden Seriennummern, um die empfangenen Daten in die ursprüngliche Reihenfolge zu verschieben.


Wenn zwei Computer eine TCP-Verbindung aushandeln, sendet jeder Computer eine andere zufällige Startsequenznummer . Dies ist die Sequenznummer, die das Gerät dem ersten gesendeten Byte zuweist. Jedem nachfolgenden Byte wird die Sequenznummer des vorherigen Bytes plus 1 zugewiesen. TCP-Segmente enthalten TCP-Header , die Metadaten sind, die an den Anfang des Segments angehängt sind. Die Sequenznummer des ersten Bytes im Segmentkörper ist im TCP-Header dieses Segments enthalten.

Es ist zu beachten, dass TCP-Verbindungen bidirektional sind, dh Daten können in beide Richtungen übertragen werden, und jeder Computer in einer TCP-Verbindung fungiert sowohl als Sender als auch als Empfänger. Aus diesem Grund muss jede Maschine ihren eigenen unabhängigen Satz von Sequenznummern zuweisen und verarbeiten.

Bestätigung des Datenempfangs


Wenn ein Computer ein TCP-Segment empfängt, teilt er dem Absender des Segments mit, dass es empfangen wurde. Der Empfänger sendet dazu ein Segment ACK(kurz für "Bestätigen"), das die Sequenznummer des nächsten Bytes enthält, das er vom Absender erwartet. Der Absender verwendet diese Informationen, um zu verstehen, dass der Empfänger alle anderen Bytes bis zu dieser Nummer erfolgreich empfangen hat.

Ein Segment wird ACKdurch das Vorhandensein eines Flags ACKund der entsprechenden Bestätigungsnummer im TCP-Header des Segments angezeigt . Das TCP-Protokoll enthält nur 6 Flags, einschließlich (wie wir in Kürze sehen werden) eines Flags RST(kurz für "Reset" - "Reset"), das das Reset-Segment angibt.


Hinweis: TCP ermöglicht auch die Verwendung selektiver ACKs , die gesendet werden, wenn der Empfänger einige, aber nicht alle Segmente im Zahlenbereich empfangen hat. Beispiel: "Ich habe die Bytes 1000-3000 und 4000-5000 empfangen, aber nicht 3001-3999." Der Einfachheit halber werde ich in unserer Diskussion über TCP-Reset-Angriffe keine selektiven ACKs berücksichtigen.

Wenn der Absender Daten sendet, aber nicht empfängtACKFür sie während eines bestimmten Zeitintervalls geht er davon aus, dass die Daten verloren gegangen sind, und sendet sie erneut, wobei sie dieselben Seriennummern erhalten. Dies bedeutet, dass wenn der Empfänger dieselben Bytes zweimal akzeptiert, er trivial Folgenummern verwendet, um Duplikate zu entfernen, ohne den Stream zu unterbrechen. Der Empfänger kann doppelte Daten akzeptieren, weil das ursprüngliche Segment später empfangen wurde, nachdem es erneut gesendet wurde, oder weil das ursprüngliche Segment erfolgreich empfangen wurde, das entsprechende ACKjedoch auf dem Weg zum Absender verloren ging.


Während solche doppelten Daten selten genug sind, führt die dadurch verursachte übermäßige Verschwendung von Ressourcen nicht zu Problemen. Wenn alle Daten früher oder später den Empfänger erreichen und die entsprechenden Daten ACKden Absender erreichen, erledigt die TCP-Verbindung ihre Aufgabe.

Auswahl einer Seriennummer für ein gefälschtes Segment


Beim Erstellen eines falschen Segments muss der RSTAngreifer ihm eine Seriennummer geben. Die Empfänger sind sehr froh, dass Sie Segmente mit inkonsistenten Seriennummern akzeptieren und unabhängig voneinander in der richtigen Reihenfolge verbinden müssen. Ihre Fähigkeiten sind jedoch begrenzt. Wenn der Empfänger ein Segment mit einer Sequenznummer erhält, die "zu" nicht in der richtigen Reihenfolge ist, verwirft er ein solches Segment.

Für einen erfolgreichen TCP-Reset-Angriff ist daher eine plausible Sequenznummer erforderlich. Aber was ist eine solche Zahl? Für die meisten Segmente (obwohl, wie wir später sehen werden, nicht für RST) wird die Antwort durch die Größe des TCP-Fensters bestimmt .

TCP-Fenstergröße


Stellen Sie sich einen alten Computer aus den frühen neunziger Jahren vor, der an ein modernes Gigabit-Glasfasernetz angeschlossen ist. Ein ultraschnelles Netzwerk kann Daten mit einer erstaunlichen Geschwindigkeit auf diesen älteren Computer übertragen, schneller als das Gerät sie verarbeiten kann. Dies wird uns stören, da das TCP-Segment erst dann als empfangen betrachtet werden kann, wenn der Empfänger es verarbeiten kann.


Computer verfügen über einen TCP-Puffer, in dem neu ankommende Daten auf ihre Verarbeitung warten, während der Computer an Daten arbeitet, die vor ihm eintreffen. Dieser Puffer hat jedoch eine begrenzte Größe. Wenn der Empfänger die vom Netzwerk an ihn übertragene Datenmenge nicht bewältigen kann, läuft der Puffer über. Wenn der Puffer voll ist, hat der Empfänger keine andere Wahl, als die redundanten Daten zu entfernen. Der Empfänger sendet keine ACKverworfenen Daten, daher muss der Absender sie erneut senden, wenn im Puffer des Empfängers freier Speicherplatz vorhanden ist. Es spielt keine Rolle, wie schnell das Netzwerk Daten übertragen kann, wenn der Empfänger keine Zeit hat, mit ihnen umzugehen.

Stellen Sie sich einen übermäßig eifrigen Freund vor, der Ihnen einen ganzen Strom von Briefen schneller an Ihre Post sendet, als Sie sie lesen können. Es gibt einen bestimmten Pufferraum in Ihrem Postfach, aber nachdem es voll ist, fallen alle nicht platzierten Buchstaben zu Boden, wo Füchse und andere Kreaturen sie fressen. Ein Freund muss die Briefe, die er gegessen hat, erneut senden, aber jetzt haben Sie Zeit, seine vorherigen Nachrichten zu erhalten. Das Senden zu vieler Briefe oder Datenmengen, die der Empfänger nicht verarbeiten kann, ist eine Verschwendung von Energie und Übertragungskanal.

"Zu viel" - wie viele Daten sind das? Wie versteht der Absender, wann weitere Daten gesendet werden sollen und wann sich das Warten lohnt? Hier bietet sich die Größe des TCP-Fensters an.. Die Größe des Empfängerfensters gibt die maximale Anzahl nicht bestätigter Bytes an, die der Absender jederzeit an ihn übertragen kann. Angenommen, der Empfänger meldet, dass seine Fenstergröße 100.000 beträgt (wir werden bald herausfinden, wie er diesen Wert übergibt), sodass der Absender 100.000 Bytes sendet. Angenommen, bis der Sender ein hunderttausendstes Byte gesendet hat, hat der Empfänger die Segmente ACKfür die ersten 10.000 dieser Bytes gesendet . Dies bedeutet, dass 90.000 Bytes noch nicht bestätigt wurden. Da die Fenstergröße 100.000 beträgt, kann der Absender weitere 10.000 Bytes übertragen, bevor er auf neue warten muss ACK. Wenn nach dem Senden dieser 10.000 zusätzlichen Bytes weiterACKWenn es nicht empfangen wurde, stößt der Absender auf sein Limit von 100.000 nicht bestätigten Bytes. Folglich muss der Absender warten und das Senden von Daten beenden (mit Ausnahme der erneuten Übertragung von Daten, die er als verloren betrachtet), bis er neue Daten erhält ACK.


Jede Seite der TCP-Verbindung benachrichtigt die andere Seite über die Größe ihres Fensters während des Handshake-Vorgangs, der beim Öffnen der Verbindung ausgeführt wird. Darüber hinaus können Fenstergrößen während des Verbindungsvorgangs dynamisch geändert werden. Ein Computer mit einem großen TCP-Puffer kann eine große Fenstergröße ankündigen, um den Durchsatz zu maximieren. Auf diese Weise kann die mit ihr kommunizierende Maschine kontinuierlich Daten über eine TCP-Verbindung übertragen, ohne anzuhalten oder auf eine Bestätigung zu warten. Ein Computer mit einem kleinen TCP-Puffer kann gezwungen sein, eine kleine Fenstergröße zu melden. Manchmal füllen Absender das Fenster vollständig aus und müssen warten, bis einige der Segmente bestätigt sind. Die Bandbreite leidet darunter, aber es ist erforderlich, dass die TCP-Puffer nicht überlaufen.


Die Größe des TCP-Fensters ist eine strikte Begrenzung der Menge der übertragenen unbestätigten Daten. Wir können es verwenden, um die maximal mögliche Sequenznummer (die ich in der folgenden Gleichung als bezeichnet habe max_seq_no) zu berechnen , die der Absender zum aktuellen Zeitpunkt senden kann:

max_seq_no = max_acked_seq_no + window_size

max_acked_seq_no- Dies ist die maximale Sequenznummer, für die der Empfänger gesendet hat ACK. Dies ist die maximale Sequenznummer, von der der Absender weiß, dass der Empfänger sie genau erhalten hat. Da der Absender nur window_sizeunbestätigte Bytes senden kann, kann er maximal eine Sequenznummer senden max_acked_seq_no + window_size.

Aus diesem Grund gibt die TCP-Spezifikation an, dass der Empfänger alle empfangenen Daten ignorieren soll, deren Seriennummern außerhalb des gültigen Fensters liegen. Wenn der Empfänger beispielsweise alle Bytes bis zu 15.000 bestätigt hat und seine Fenstergröße 30.000 beträgt, erhält er alle Daten mit einer Seriennummer im Bereich von 15.000 bis (15.000 + 30.000 = 45.000). Darüber hinaus ignoriert der Empfänger Daten mit Seriennummern außerhalb dieses Intervalls vollständig. Wenn das Segment Daten enthält, von denen sich einige innerhalb dieses Fensters und einige außerhalb befinden, werden die Daten innerhalb des Fensters akzeptiert und bestätigt, aber die Daten außerhalb des Fensters werden verworfen. Beachten Sie, dass wir die Möglichkeit der selektiven,ACK die zu Beginn des Beitrags kurz angesprochen wurden , immer noch ignorieren .

Bei den meisten TCP-Segmenten gibt diese Regel ein Intervall akzeptabler Sequenznummern an. Wie bereits erwähnt, sind die RSTBeschränkungen für Segmente jedoch noch strenger als die Beschränkungen für gewöhnliche Datenübertragungssegmente. Wie wir gleich sehen werden, wurde dies durchgeführt, um die Durchführung einer Variante eines TCP-Reset- Angriffs zu erschweren, der als "blinder TCP-Reset-Angriff" bezeichnet wird .

Akzeptable Sequenznummern für RST-Segmente


Reguläre Segmente werden akzeptiert, wenn ihre Sequenznummer zwischen der nächsten erwarteten Sequenznummer und dieser Nummer plus der Fenstergröße liegt. Pakete RSTwerden jedoch nur empfangen, wenn ihre Sequenznummer genau der nächsten erwarteten Sequenznummer entspricht. Kehren wir zum vorherigen Beispiel zurück, in dem der Empfänger die Bestätigungsnummer 15.000 gesendet hat. Damit das Paket RSTempfangen werden kann, muss seine Sequenznummer genau 15.000 sein. Wenn der Empfänger ein Segment RSTmit einer Sequenznummer ungleich 15.000 empfängt , akzeptiert er es nicht.


Wenn die Sequenznummer außerhalb des Intervalls liegt, ignoriert der Empfänger sie vollständig. Befindet es sich jedoch innerhalb des Fensters der erwarteten Sequenznummern, sendet der Empfänger eine "Herausforderung ACK" ("ACK-Anruf"). Dies ist ein Segment, das dem Absender mitteilt, dass das Segment RSTeine ungültige Sequenznummer hat. Er teilt dem Absender auch die Sequenznummer mit, die der Empfänger erwartet. Der Absender kann diese Informationen aus dem ACKAnruf verwenden, um seine Informationen neu zu erstellen und erneut zu senden RST.

Bis 2010 hat TCP diese zusätzlichen Segmentbeschränkungen nicht eingeführt RST. Segmente wurden RSTnach den gleichen Regeln wie alle anderen angenommen oder abgelehnt. Dies vereinfachte jedoch auch die Blind-Blind-TCP-Reset-Angriffe .

Blinde TCP-Angriffe


Wenn der Angreifer den zwischen seinen Opfern ausgetauschten Datenverkehr abfangen kann, kann er die Serien- und Bestätigungsnummern der TCP-Pakete der Opfer lesen. Er kann diese Informationen verwenden, um auszuwählen, welche Seriennummern er seinen gefälschten Segmenten geben soll RST. Wenn der Angreifer jedoch den Verkehr der Opfer nicht abfangen kann, weiß er nicht, welche Sequenznummern er einfügen soll. Er kann jedoch immer noch eine beliebige Anzahl von Segmenten RSTmit einer beliebigen Anzahl unterschiedlicher Seriennummern übertragen, in der Hoffnung, dass sich eines davon als richtig herausstellt. Ein solcher Angriff wird als blinder TCP-Reset-Angriff bezeichnet.

Wie bereits erwähnt, musste der Angreifer in der ersten Version des TCP-Protokolls nur die Seriennummer abrufenRSTinnerhalb des TCP-Fensters des Empfängers. Ein Artikel mit dem Titel „Slipping in the Window“ zeigte, dass dies die blinden Angriffe zu einfach machte, da ein Angreifer für einen fast garantierten Erfolg nur Zehntausende von Segmenten senden musste. Um dem entgegenzuwirken, wurde die Regel, die den Empfänger zur Annahme des Segments zwang, RSTdurch das oben beschriebene strengere Kriterium ersetzt. Dank der neuen Regeln für die Durchführung von TCP-Reset-Angriffen müssen Millionen von Segmenten blind gesendet werden, was sie praktisch nicht realisierbar macht. Siehe RFC-5963 für Details .

Führen Sie einen TCP-Reset-Angriff gegen uns selbst durch


Hinweis: Ich habe diesen Prozess unter OSX getestet, aber einige Kommentare erhalten, dass er unter Linux nicht ordnungsgemäß funktioniert.

Jetzt wissen wir alles über die Ausführung eines TCP-Reset-Angriffs. Der Angreifer muss:

  • Verkehrswacht - Netzwerk ( „Schnüffeln“ it) zwischen zwei Opfer
  • Schnüffeln Sie am TCP-Segment mit aktiviertem Flag ACKund lesen Sie die bestätigte Nummer
  • Erstellen Sie ein falsches TCP-Segment mit aktiviertem Flag RSTund einer Sequenznummer, die der bestätigten Nummer des abgefangenen Segments entspricht (beachten Sie, dass dies eine langsame Übertragung impliziert, da sonst die ausgewählte Sequenznummer schnell veraltet ist.) Um die Erfolgschancen zu erhöhen, können Sie mehrere Segmente RSTmit einem großen Intervall von Sequenznummern übertragen .)
  • Senden Sie gefälschte Segmente an ein oder beide Opfer, in der Hoffnung, dass dadurch die TCP-Verbindung unterbrochen wird

Lassen Sie uns zum Üben einen TCP-Angriff auf uns selbst auf demselben Computer durchführen und über uns selbst kommunizieren localhost. Dafür brauchen wir:

  1. Konfigurieren Sie die TCP-Verbindung zwischen zwei Terminalfenstern
  2. Schreiben Sie ein Angriffsprogramm, das sich mit Verkehrsschnüffeln befasst
  3. Ändern Sie das Programm so, dass es gefälschte Segmente erzeugt und sendet RST.

Lass uns anfangen.

1. Herstellen einer TCP-Verbindung zwischen zwei Terminalfenstern


Wir werden die TCP-Verbindung mit dem Tool konfigurieren netcat, das standardmäßig auf vielen Betriebssystemen verfügbar ist. Jeder andere TCP-Client reicht aus . Im ersten Terminalfenster führen wir den folgenden Befehl aus:

nc -nvl 8000

Dieser Befehl startet einen TCP-Server, der einen Port auf unserem lokalen Computer überwacht 8000. Führen Sie im zweiten Terminalfenster den folgenden Befehl aus:

nc 127.0.0.1 8000

Dieser Befehl versucht, über die IP-Adresse des 127.0.0.1Ports eine TCP-Verbindung zum Computer herzustellen 8000. Nun sollte zwischen den beiden Fenstern des Terminals eine TCP-Verbindung hergestellt werden. Versuchen Sie, etwas in ein Fenster einzugeben - die Daten müssen über die TCP-Verbindung übertragen werden und in einem anderen Fenster angezeigt werden.


2. Verkehrsschnüffeln


Wir werden ein Angriffsprogramm schreiben, das mithilfe der scapybeliebten Python-Netzwerkbibliothek Traffic-Sniffing durchführt . Dieses Programm verwendet scapy, um Daten zu lesen, die zwischen zwei Fenstern des Terminals übertragen wurden, obwohl sie nicht Teil der Verbindung sind.

Der Programmcode wird in meinem Repository auf GitHub veröffentlicht . Das Programm überwacht den Verbindungsverkehr und zeigt ihn auf dem Terminal an. Der Hauptkern des Codes ist der Methodenaufruf sniffaus der Bibliothek scapyam Ende der Datei:

t = sniff(
        iface='lo0',
        lfilter=is_packet_tcp_client_to_server(localhost_ip, localhost_server_port, localhost_ip),
        prn=log_packet,
        count=50)

Dieser Code weist uns scapyan, Pakete auf der Schnittstelle zu schnüffeln lo0und Details aller Pakete als Teil unserer TCP-Verbindung zu erfassen. Der Aufruf hat folgende Parameter:

  • iface- Befehle scapyzum Abhören der Netzwerkschnittstelle lo0oder des lokalen Hosts
  • lfilter — , scapy , IP- localhost . , , lo0. , .
  • prn — , scapy , lfilter. . , RST.
  • count — , scapy .

Um dieses Programm zu testen, konfigurieren Sie die TCP-Verbindung ab Schritt 1. Klonen Sie mein GitHub-Repository, befolgen Sie die Konfigurationsanweisungen und führen Sie das Programm im dritten Fenster des Terminals aus. Geben Sie Text in eines der Terminals der TCP-Verbindung ein. Sie sollten sehen, dass das Programm beginnt, Informationen über die Verbindungssegmente aufzuzeichnen.

3. Senden gefälschter Pakete RST


Wir haben eine Verbindung hergestellt, und das Programm kann alle durchlaufenden TCP-Segmente abhören. Das einzige, was uns noch bleibt, ist, das Programm so zu ändern, dass es einen TCP-Reset-Angriff durch Übertragen gefälschter Segmente ausführt RST. Zu diesem Zweck ändern wir die Funktion prn(siehe Liste der Parameter oben), die scapyfür Pakete aufgerufen wird , die die Anforderungen der Funktion erfüllen lfilter. In der modifizierten Version der Funktion wird das entsprechende Paket nicht einfach repariert, sondern untersucht, die erforderlichen Parameter extrahiert und mit diesen Parametern das Segment erstellt und gesendet RST.

Angenommen, wir haben ein Segment ab (src_ip, src_port)k abgefangen (dst_ip, dst_port). Er hat eine Flagge gesetzt ACKund die Bestätigungsnummer ist 100.000. Um ein Segment herzustellen und zu versenden, haben wir:

  • IP- , . , . , .
  • RST , , RST
  • , ,
  • send scapy — .

Um unser vorheriges Programm nach Bedarf zu ändern, kommentieren Sie diese Zeile aus und kommentieren Sie die Zeile darüber aus.

Jetzt sind wir bereit für einen umfassenden Angriff. Konfigurieren Sie die TCP-Verbindung gemäß Schritt 1. Führen Sie das Angriffsprogramm ab Schritt 2 im dritten Fenster des Terminals aus. Geben Sie dann einen Text in eines der Terminals der TCP-Verbindung ein. In dem Terminal, in dem Sie den Text eingegeben haben, wird die TCP-Verbindung plötzlich und auf mysteriöse Weise unterbrochen. Der Angriff ist beendet!


Weitere Arbeit


  1. Experimentieren Sie weiter mit dem Angriffstool. Verfolgen Sie, was passiert, wenn Sie 1 zur Sequenznummer des Pakets addieren oder von dieser subtrahieren RST. Stellen Sie sicher, dass es genau dem Wert des ackabgefangenen Pakets entspricht.
  2. Wireshark lo0 . TCP-, RST. ip.src == 127.0.0.1 && ip.dst == 127.0.0.1 && tcp.port == 8000 .
  3. , . RST, RST , . , RST, .


Der TCP-Reset-Angriff ist gleichzeitig tiefgreifend und einfach. Viel Glück bei Ihren Experimenten und lassen Sie mich wissen, wenn Sie Fragen oder Kommentare haben.

All Articles