scapy的发送包函数
scapy中,将Ether()看作是第二层,IP()看作是第三层
- send()是发送第三层的包,也就是IP层,会自动处理路由和第二层
- sendp()是发送第二层的包,需要自己选择正确的接口和正确的链路层协议 sendp(Ether()/IP(dst=“1.2.3.4”,ttl=(1,4)), iface=“eth1”)
- sr() 函数用于发送数据包和接收答案。该函数返回几个数据包和答案,以及未应答的数据包。
- sr1() 是一个变体,它只返回一个响应发送的数据包(或数据包集)的数据包。数据包必须是第 3 层数据包(IP、ARP 等)
- srp() 对第 2 层数据包(以太网、802.3 等)执行相同的操作。如果没有响应,则在达到超时时将分配一个 None 值。
send函数和sendp是不接收返回包的,如果想要得到返回包,可以使用sr或sr1
构造带数据的TCP数据包
#想要传输的1440字节的数据
data = b'\x00\x00\xa6\x89\xe5\x91f\xed\xbb\xe1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\t\x00H\x006\n\x00\x00p\x00\x00\x00\x00\x00\x00\x00\xfb\xa3h\xab"\x9e\xd7\x01\xa4s\xbd\xf8+\x9e\xd7\x01\xfb\xa3h\xab"\x9e\xd7\x01\xfb\xa3h\xab"\x9e\xd7\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x02\x00\x00\x00B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00F\x00\x00\x00\x00\x00\x00\x00.\x00\x00\x00\x00\x00\x00\x00p\x00\x00\x00\x00\x00\x00\x00y|\x8f\x0c!\x9e\xd7\x01\xaf\xcf\xe2\xf4+\x9e\xd7\x01y|\x8f\x0c!\x9e\xd7\x01y|\x8f\x0c!\x9e\xd7\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x04\x00\x00\x00:\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x04\x00\x06\x00\x00\x00\x00.\x00.\x00\x00\x00\x00\x00x\x00\x00\x00\x00\x00\x00\x008\x00~\x0f \x9e\xd7\x01\xc0G\x1dp0\x9e\xd7\x018\x00~\x0f \x9e\xd7\x018\x00~\x0f \x9e\xd7\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x10\x00\x00\x00A\x00\x00\x00\x10\x00_\x00O\x008\x00W\x00D\x007\x00~\x00N\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc9\xf5\x13\x02\x00\x00\x00\x00.\x00m\x00o\x00z\x00i\x00l\x00l\x00a\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00Y\xfe\xb1\xcb\x07\xd6\x01\x00Y\xfe\xb1\xcb\x07\xd6\x01\x00Y\xfe\xb1\xcb\x07\xd6\x01\x00Y\xfe\xb1\xcb\x07\xd6\x01\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x02\x00\x00\x00\x18\x00\x00\x00>\x00\x00\x00\x10\x00_\x00O\x00W\x007\x009\x00C\x00~\x00O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00G\x00\x00\x00\x00\x00\x00\x00.\x00b\x00a\x00s\x00h\x00_\x00l\x00o\x00g\x00o\x00u\x00t\x00\x88\x00\x00\x00\x00\x00\x00\x00\x00Y\xfe\xb1\xcb\x07\xd6\x01\x87\xf9\n\xc3!\x9e\xd7\x01\x00Y\xfe\xb1\xcb\x07\xd6\x01\x00Y\xfe\xb1\xcb\x07\xd6\x01\xc1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x02\x00\x00\x00\x1a\x00\x00\x00>\x00\x00\x00\x10\x00_\x00O\x00U\x00L\x00H\x00N\x00~\x00L\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00H\x00\x00\x00\x00\x00\x00\x00.\x00b\x00a\x00s\x00h\x00_\x00p\x00r\x00o\x00f\x00i\x00l\x00e\x00\x00\x00\x00\x00\x00\x00x\x00\x00\x00\x00\x00\x00\x00\x00Y\xfe\xb1\xcb\x07\xd6\x01\x98 \x0b\xc3!\x9e\xd7\x01\x00Y\xfe\xb1\xcb\x07\xd6\x01\x00Y\xfe\xb1\xcb\x07\xd6\x01\xe7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x02\x00\x00\x00\x0e\x00\x00\x00>\x00\x00\x00\x10\x00_\x00J\x002\x006\x005\x00M\x00~\x00E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00I\x00\x00\x00\x00\x00\x00\x00.\x00b\x00a\x00s\x00h\x00r\x00c\x00\x00\x00x\x00\x00\x00\x00\x00\x00\x00\xfc\xc4\xb3\xd8!\x9e\xd7\x0195\xdd\x840\x9e\xd7\x01\xfc\xc4\xb3\xd8!\x9e\xd7\x01\xfc\xc4\xb3\xd8!\x9e\xd7\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x0c\x00\x00\x00;\x00\x00\x00\x10\x00_\x00V\x00A\x00X\x00D\x009\x00~\x009\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xce/\x01\x00\x00\x00\x00\x00.\x00c\x00a\x00c\x00h\x00e\x00\x00\x00\x00\x00x\x00\x00\x00\x00\x00\x00\x00)Z\xe6\xc2!\x9e\xd7\x01G\xeb\xda\x840\x9e\xd7\x01)Z\xe6\xc2!\x9e\xd7\x01)Z\xe6\xc2!\x9e\xd7\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\n\x00\x00\x00>\x00\x00\x00\x10\x00_\x00A\x00X\x00O\x00Q\x00W\x00~\x00J\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa1\xbf\x00\x04\x00\x00\x00\x00.\x00d\x00b\x00u\x00s\x00\x00\x00\x00\x00\x00\x00x\x00\x00\x00\x00\x00\x00\x00\xdb\x14\xfe\xd2!\x9e\xd7\x01\xb8\x17\x8e\x0b/\x9e\xd7\x01\xdb\x14\xfe\xd2!\x9e\xd7\x01\xdb\x14\xfe\xd2!\x9e\xd7\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x0e\x00\x00\x00@\x00\x00\x00\x10\x00_\x00J\x00U\x00G\x00E\x00N\x00~\x00F\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcf/\x01\x00\x00\x00\x00\x00.\x00c\x00o\x00n\x00f\x00i\x00g\x00\x00\x00\x88\x00\x00\x00\x00\x00\x00\x00\xd22\x15\xc3!\x9e\xd7\x01Sa4\xc4!\x9e\xd7\x01\xd22\x15\xc3!\x9e\xd7\x01\xd22\x15\xc3!\x9e\xd7\x016\x01\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x02\x00\x00\x00\x1a\x00\x00\x00A\x00\x00\x00\x10\x00_\x00V\x007\x000\x002\x00J\x00~\x00H\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd4/\x01\x00\x00\x00\x00\x00.\x00I\x00C\x00E\x00a\x00u\x00t\x00h\x00o\x00r\x00i\x00t\x00y\x00\x00\x00\x00\x00\x00\x00x\x00\x00\x00\x00\x00\x00\x00\xce\xed\x19\xc3!\x9e\xd7\x01\xd7\xd9\xd9\x840\x9e\xd7\x01\xce\xed\x19\xc3!\x9e\xd7\x01\xce\xed\x19\xc3!\x9e\xd7\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00\x00\x00\x0c\x00\x00\x00?\x00\x00\x00\x10\x00_\x00V\x00Q\x00H\x00T\x006\x00~\x00E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\xbf\x00\x04\x00\x00\x00\x00.\x00l\x00o\x00c\x00a\x00l\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x98\'\\\xc3!\x9e\xd7\x01\x98\'\\\xc3!\x9e\xd7\x01\x98\'\\\xc3\x00\x00\x0c\x06\x00\x00\x06\x00\x00\x00\x90\x05\x00\x00\x00\x00\x00\x00\xd5\xca\x05\x00\x87X\xb2+n\x05\x00\x00'
#用来占位的空20字节数据
a=bytes(20)
data=a+data
#创建TCP数据包
l_tcp=TCP(data)
#调用方法改TCP包中的参数
l_tcp.sport=445
#组合成新的包 类似IP()/TCP()的形式
p=IP(dst="192.168.113.128")/l_tcp
#使用sr1函数发送包,src接受返回包
rec=sr1(p)
#详细展示rec返回包
rec.show2()
data的长度是1440,也就是数据的长度,如果直接用TCP(data)来构建数据包,会发现构成的包的payload只有1420的长度,因为TCP()方法会将传进去的data的前20个字节作为自己sport、dport、seq、ack等标志位的参数,所以要先创建空20字节的数据段放在data前面,再进行创建.创建完成后,再分别调用标志位进行更改
数据包的构建基础的是new_package=IP()/TCP() 每一层里都可以通过类似sport=1526的定义确定详细参数 也可以分别定义IP层和TCP层 用 / 进行连接 如果传输数据时写成IP()/TCP()/data的形式,则在wireshark中显示的数据包就不是TCP格式,而是NBSS格式
Wireshark抓不到scapy发出的包
1.确定发送的函数对不对,我一开始用sendp,mac地址什么都是空的,如果是想发tcp还是用从三层开始的函数
2.将一个从网络上sniff的包保存起来,然后重新发送,也是我干过的,收到的tcp包,保存为pcap,然后读取发送,wireshark抓不到
3.将准备发的数据包保存起来,然后用wireshark查看,有什么问题,保存的方法是wrpcap(“Packages/testp.cap”, p) p为构建的数据包
4.从最基础的报文开始,比如先发个IP(),设定一下地址,能成功了再慢慢加参数
|