OSI 七层网络模型 | TCP/IP 四层概念模型 | 对应网络协议 |
应用层(Application) | 应用层 | HTTP、TFTP, FTP, NFS, WAIS、SMTP |
表示层(Presentation) | 应用层 | Telnet, Rlogin, SNMP, Gopher |
会话层(Session) | 应用层 | SMTP, DNS |
传输层(Transport) | 传输层 | TCP, UDP |
网络层(Network) | 网络层 | IP, ICMP, ARP, RARP, AKP, UUCP |
数据链路层(Data Link) | 数据链路层 | FDDI, Ethernet, Arpanet, PDN, SLIP, PPP |
物理层(Physical) | 数据链路层 | IEEE 802.1A, IEEE 802.2到IEEE 802.11 |
以上便是各个网络协议对应的 osi 模型,那么各个协议的用法是怎样的了,下面我们一起来看下
1、构造一个 IP 包,并传入一些参数
#构造一个 IP 包,并传入一些参数 pkt = IP(dst="192.168.1.2",ttl=10) ls(pkt) version:版本号 ihl:头长度 tos:服务类型 len:IP数据包总长 id:标识符 flags:标记 flag:片偏移 ttl:生存时间 proto:协议类型 chksum:头部校验 src:源IP地址 dst:目的IP地址 options:可选项
2、构造ARP包
#构造ARP包 ARP(op=1, hwdst="ff:ff:ff:ff:ff:ff", pdst=ip_address) #arp类的构造函数列表: ls(ARP) hwtype : XShortField = (1) 值为1表示以太网地址,其它还可能表示令牌环地址 ptype : XShortEnumField = (2048) 0x0800表示IP地址,其它还可能是ICMP/IGMP hwlen : ByteField = (6) ARP报文中,它的值为6 plen : ByteField = (4) ARP报文中,它的值为4 op : ShortEnumField = (1) 取值为1或者2,代表ARP请求或者响应包。1.ARP请求,2.ARP应答,3.RARP请求,4.RARP应答 hwsrc : ARPSourceMACField = (None) 发送方Mac地址。 psrc : SourceIPField = (None) 发送方IP地址。 hwdst : MACField = ('00:00:00:00:00:00') 目标Mac地址。 pdst : IPField = ('0.0.0.0') 目标IP地址。
3、构造Ether
#构造Ether Ether(dst="ff:ff:ff:ff:ff:ff") ls(Ether) dst : DestMACField = (None) 目的MAC src : SourceMACField = (None) 源MAC type : XShortEnumField = (36864) 构造一个以太网数据包通常需要指定目标和源MAC地址,如果不指定,默认发出的就是广播包ff:ff:ff:ff:ff:ff
4、构造TCP包
#构造TCP包 sport : ShortEnumField = 20 (20) 目标端口 dport : ShortEnumField = 80 (80) 源端口 seq : IntField = 0 (0) ack : IntField = 0 (0) dataofs : BitField (4 bits) = None (None) reserved : BitField (3 bits) = 0 (0) flags : FlagsField (9 bits) = Flag 2 (S)> (Flag 2 (S)>) window : ShortField = 8192 (8192) chksum : XShortField = None (None) urgptr : ShortField = 0 (0) options : TCPOptionsField = [] (b'')
可分为两种情况,用法如下:
1、只发不收
send(pkt, inter=0, loop=0, count=1, iface=N) pkt:数据包 inter:发包间隔时间 count:发包数量 iface:网卡接口名称 send(),在第三层发包,没有接收功能;send(IP(dst="www.baidu.com",ttl=2)/ICMP()) sendp(),在第二层发包,没有接收功能。sr(Ether()/IP(dst=www.baidu.com))
2、发包且收包
sr()和sr1()都是在第三层发包,sr1表示只接收第一个回复。 sr(IP(dst="www.baidu.com",ttl=(1,4))/TCP(dport=[21,23,80],flags="S")) 返回两个值 sr1(IP(dst="www.baidu.com",ttl=(1,4))/ICMP()) srloop(IP(dst="www.baidu.com",ttl=1)/ICMP()) #不停的ping百度 srloop(IP(dst="www.baidu.com",ttl=1)/ICMP(),inter=3,count=2) #每隔3秒ping一次,一共执行两次 #inter表示间隔,count记录次数 srp()和srp1()都是根据第二层发包,srp1表示只接收第一个回复 srp(Ether()/IP(dst="www.baidu.com")) srp1(Ether()/IP(dst=www.baidu.com))
当 TCP 链接指定端口时,flags 参数设为 S 时则为半开式扫描,若此时该端口处于监听状态,返回 syn/ack,否则返回 rst/ack
sr1(IP(dst="192.168.1.2")/TCP(dport=80,flags="S"))
序列化:将数据包对象保存为 pcap 文件
反序列化:读取 pcap 文件中的内容
pkt= Ether()/IP(dst='192.168.1.2')/TCP(dport=80) #将嗅探到的数据包内容写到pcap文件中 wrpcap("hw.pcap",pkt) #读取pcap文件。 read=rdpcap('hw.pcap') print(read[1])#打印嗅探到的包的数据
更加直观清晰的分析数据。
zfc= str(pkts[0]) z= Ether(zfc)
为了方便我们对数据进行加密而发明的一种方式
export_object(str(pkts[0])) 导出数据包 new_Pkt = import_object() #将上一步导出的字符串填入
如果我们捕获到数据包,未联网的情况下如何解析呢?
现在就可以使用我们的离线数据包分析数据了:
sniff(offline = "hw.pcap")#离线数据包
通过上面的学习,我们对 scapy 算是有了一个基础性的认识了,scapy 的确很强大,简单的几行命令就能实现发包收包,极大的节省了我们的开发时间
如果你深入学习它的每个命令,你会发现更多有趣的事情,当然这么强大的工具可不要拿来做坏事哦!
以上就是Python使用scapy模块发包收包的详细内容,更多关于Python用scapy模块发包收包的资料请关注脚本之家其它相关文章!