在 python 中使用 scapy 进行 3 次握手和获取请求
3-way handshake and get request using scapy in python
我正在使用 scapy 进行 3 次握手并发送获取请求和接收响应。但是我收到了一个 TCP 数据包作为响应,并设置了 FIN 标志。我期待带有请求页面的 HTTP 数据包。我哪里错了?
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 结果
您发送请求时似乎使用了错误的序列号:
PUSH = TCP(sport=80, dport=80, flags='PA', seq=11, ack=my_ack)
seq
应该是 101,而不是 11,因为您使用 100 作为 SYN。更改它似乎可以解决问题。
此外,如果您在测试中没有更改源端口并且没有正确关闭 TCP 连接或者在测试之间没有等待 120 秒,服务器可能会认为新数据包属于以前的连接并发送一些你不期望的响应(取决于服务器连接的状态)。
您的机器正在发送 RST 数据包。内核正在发送 RST 数据包。
http://www.packetlevel.ch/html/scapy/scapy3way.html。
尝试通过 iptables 丢弃 RST 数据包。
iptables -A OUTPUT -p tcp --tcp-flags RST RST -s 192.168.43.119 -j DROP
我正在使用 scapy 进行 3 次握手并发送获取请求和接收响应。但是我收到了一个 TCP 数据包作为响应,并设置了 FIN 标志。我期待带有请求页面的 HTTP 数据包。我哪里错了?
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 结果
您发送请求时似乎使用了错误的序列号:
PUSH = TCP(sport=80, dport=80, flags='PA', seq=11, ack=my_ack)
seq
应该是 101,而不是 11,因为您使用 100 作为 SYN。更改它似乎可以解决问题。
此外,如果您在测试中没有更改源端口并且没有正确关闭 TCP 连接或者在测试之间没有等待 120 秒,服务器可能会认为新数据包属于以前的连接并发送一些你不期望的响应(取决于服务器连接的状态)。
您的机器正在发送 RST 数据包。内核正在发送 RST 数据包。
http://www.packetlevel.ch/html/scapy/scapy3way.html。
尝试通过 iptables 丢弃 RST 数据包。
iptables -A OUTPUT -p tcp --tcp-flags RST RST -s 192.168.43.119 -j DROP