2017-12-13 8 views
3

Ich benutze Scapy für 3-Wege-Handshake und Senden von Anfrage und Antwort erhalten. Aber ich bekomme ein TCP-Paket als Antwort mit FIN-Flag gesetzt. Ich erwarte HTTP-Paket mit angeforderter Seite. Wo gehe ich falsch?3-Wege-Handshake und Anfrage mit Scapy in Python

import sys 
import socket 

from scapy.all import * 


# 3 way handshake 
ip=IP(dst="webs.com") 
SYN=TCP(sport=80, flags="S", seq=100, dport=80) 
SYNACK=sr1(ip/SYN) 

my_ack = SYNACK.seq + 1 
ACK=TCP(sport=80, flags="A", seq=101, ack=my_ack, dport=80) 
send(ip/ACK) 

# request 
PUSH = TCP(sport=80, dport=80, flags='PA', seq=102, ack=my_ack) 
payload = "GET/HTTP/1.1\r\nHost: webs.com\r\nConnection: keep-alive\r\nCache-Control: max-age=0\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/58.0.3029.110 Chrome/58.0.3029.110 Safari/537.36\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\nAccept-Language: en-US,en;q=0.8\r\n\r\n" 
reply= sr1(ip/PUSH/payload, timeout=10) 

Wireshark Ergebnis

wireshark result

Antwort

2

Ihr Gerät sendet ein RST-Paket. Das RST-Paket wird vom Kernel gesendet.
http://www.packetlevel.ch/html/scapy/scapy3way.html.

Versuchen Sie, das RST-Paket durch iptables fallen zu lassen.
iptables -A OUTPUT -p tcp --tcp-flags RST RST -s 192.168.43.119 -j DROP

+0

Aus welchem ​​Grund wird das RST-Paket während des 3-Wege-Handshakes gesendet? – tarun14110

+0

Ursache Scapy erstellt einen eigenen Socket und umgeht den gesamten TCP/IP-Stack. Der Kernel weiß nichts darüber und sendet korrekt ein RST-Paket als Antwort auf den zweiten Teil des Handshakes, weil er die Verbindung nicht angefordert hat. – Noob123

1

Sieht aus wie Sie eine falsche Sequenznummer verwenden sind, wenn Sie die Anfrage senden:

PUSH = TCP(sport=80, dport=80, flags='PA', seq=11, ack=my_ack) 

seq sollte 101, nicht 11 sein, da Du hast 100 für SYN benutzt. Ändern scheint das Problem zu beheben.

Auch wenn Sie den Quellport in Ihren Tests nicht ändern und die TCP-Verbindung nicht ordnungsgemäß herunterfahren oder zwischen den Tests nicht 120 Sekunden warten, könnte der Server die neuen Pakete als zu einer früheren Verbindung gehörend betrachten sende etwas, das du als Antwort nicht erwartest (abhängig vom Status der Serververbindung).

+0

Vielen Dank für den Hinweis auf meinen dummen Fehler. Eigentlich verwende ich 102 in meinem eigentlichen Code als Seq-Nummer. Aber ich bekomme immer noch ein Paket mit einem Reset-Flag, das jedes Mal gesetzt wird. Was könnte das mögliche Problem sein? – tarun14110

+0

Entschuldigung, es gab einen Fehler in meiner Antwort, Sie sollten tatsächlich Sequenznummer 101 auf dem ersten Datenrahmen verwenden, nicht 102 - da ACK-Pakete keine Nutzlast enthalten (Ich habe den Fehler korrigiert). Damit bekomme ich vom Server eine Antwort (301 Redirect). So funktioniert der Code. Natürlich erhält der Server niemals einen ACK oder eine Verbindungsabschaltung, so dass er die Antwort für eine Weile wiederholt versucht. Ich hoffe deine Frage war kein Versuch SO-User zur DDoS-Site zu nutzen :) – dvk

+0

Ich kann das immer noch nicht machen. Ich habe wireshark Pakete in der Frage hinzugefügt. Bitte guck dir das an. Mein Computer sendet ein Reset-Paket. Ich kann das nicht verstehen. – tarun14110