三次握手并使用python中的scapy获取请求

时间:2017-12-13 10:08:59

标签: python sockets scapy

我使用scapy进行三次握手并发送get请求和接收响应。但是我收到一个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结果

wireshark result

2 个答案:

答案 0 :(得分:2)

发送请求时,您似乎使用了错误的序列号:

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

seq应该是101而不是11,因为你使用了100作为SYN。改变它似乎解决了这个问题。

此外,如果您未在测试中更改源端口,并且未正确关闭TCP连接或在测试之间不等待120秒,则服务器可能会认为新数据包属于先前的连接并发送你不希望得到的东西(取决于服务器连接的状态)。

答案 1 :(得分:2)

您的计算机正在发送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