用Python Scapy实现TCP握手测试

测试案例描述:
Steps to reproduce :

  1. TESTER:将DUT置于“LISTEN”状态。
  2. TESTER:发送序列号等于的SYN
  3. DUT:发送Ack编号等于 +1的并进入“ SYN-RECEIVED”状
    态。
  4. TESTER:发送带有RST标志且序列号等于的SYN
  5. TESTER:发送序列号等于的SYN
    6 DUT:发送Ack编号等于 +1的SYN,ACK

Expected results:
6. DUT:发送ACK编号等于 +1的SYN,ACK

TCP握手看这副图:
用Python Scapy实现TCP握手测试_第1张图片
测试案例使用Scapy包
注意使用pip安装Scapy时要进入管理员模式否则不能装在:
C:\Program Files\Python39\Scripts目录下,
只能装在:
C:\Users\用户名\AppData\Roaming\Python\Python39\Scripts目录下,
而我们并不期待安装在后者目录下。
我这里装好了,所以显示下面状态,否则就会安装Scapy。
用Python Scapy实现TCP握手测试_第2张图片
安装完成后将C:\Program Files\Python39\Scripts加入环境变了path中
用Python Scapy实现TCP握手测试_第3张图片
这样就可以在cmd中运行Scapy了:
用Python Scapy实现TCP握手测试_第4张图片
安装好Scapy后就可以编写测试案例了;

from scapy.all import *

from socket import *
import time
#############################################################################################
s = socket(AF_INET, SOCK_DGRAM)
s.bind(("172.31.6.200", 5010))
data1 = b"\x01\x05\x02\x01\x00\x00\x00\x11\x00\x00\x00\x00\x01\x01\x00\x00\x01\x63\xd9\x00\x04\xac\x1f\x06\x01"
data2 = b"\x01\x05\x02\x04\x00\x00\x00\x0c\x00\x00\x00\x00\x01\x01\x00\x00\x00\x1a\x00\x01"
s.sendto(data1, ('172.31.6.1', 13401))
print("Hello")
time.sleep(1)
s.sendto(data2, ('172.31.6.1', 13401))
print("world")
time.sleep(1)
#############################################################################################
dst_ip = "172.31.6.1"
dst_port = 13401
src_port = 12345

spk1 = IP(dst=dst_ip)/TCP(dport=dst_port,sport=src_port,flags="S")
res1 = sr1(spk1, timeout = 1)
if res1:
    print("shown")
    res1.show()
    ack1 = res1[TCP].ack
    #ack2 = res1[TCP].seq + 1
    spk2 = IP(dst=dst_ip)/TCP(dport=dst_port,sport=src_port,seq=ack1,flags="SR")
    send(spk2)
    spk3 = IP(dst=dst_ip)/TCP(dport=dst_port,sport=src_port,seq=11,flags="S")
    send(spk3)
else:
    print("noreply")

#############################################################################################之间的可以忽略。
下面介绍一下Scapy的各个函数,简单的介绍就行了,太多我也不懂,临时搜的。
sr1:发送所有数据包并仅记录第一个响应。
显示TCP字段:ls(TCP)
用Python Scapy实现TCP握手测试_第5张图片
下面恨重要,好不容易搜到的!!
TCP的Flags:
FIN = 0x01
SYN = 0x02
RST = 0x04
PSH = 0x08
ACK = 0x10
URG = 0x20
ECE = 0x40
CWR = 0x80
但是构造报文时候不能这么写,需要像测试案例一样,写成形如:
flags="S"或者flags="SR"形式,那么怎么找到对应字符串呢?
构造报文打印出来即可:
例如想构造RST标志位,对应上表RST = 0x4,打印出来就是“R”
同理,构造RST和SYN标志位,RST|SYN = 0x6,打印出来就是“SR”
用Python Scapy实现TCP握手测试_第6张图片
下面就是抓包结果:
在这里插入图片描述
可见,当client(Tester)发送SYN后 server(DUT)响应,此时seq = 0,后面Test发送RST,再发送seq = 11(我自己随便填的),
用Python Scapy实现TCP握手测试_第7张图片
DUT响应ACK = 12,符合预期
用Python Scapy实现TCP握手测试_第8张图片

你可能感兴趣的:(python,tcp/ip,开发语言,计算机网络)