Python技术利器——Scapy

前言

众所周知,我们每天上网都会有很多数据包需要发送,然后处理在接受在发送,这样一个循环往复的过程,

这里就显示了很多数据包的发送接收数据。那么,什么是包呢?下面一起看看。

包(packet)是网络通信传输中的数据单位,一般称之为数据包,其主要由源地址,目标地址,净载数据组成。包括包头和包体,包头是固定长度,包体长度不变。简单了解下包的定义,下面我们来看看发包利器scapy的用法吧。(参考资料来源:百度百科-数据包)

一、常用命令

1、ls():显示所有支持的数据包对象,可带参数也可不带,参数可以是任意具体的包。

可以看出,它包含了全部的内容,如果我们想详细查看某个模块中的内容,比如说我想查看ARP ,tcp的话了,可以这样:

在这里要告诉大家的是,我们必须要注意大小写,ls(ARP)这样才可以得出正确结果,ls(arp)是错误的。

2、lsc():列出所有函数

满屏的英文,小编我头都是大的,不知道大家此时此刻是什么样的心情,哈哈哈哈。

3、hide_defaults():用来删除一些用户提供的那些和default value相同的项目


  1. a=IP() 
  2. print(a.hide_defaults()) 

4.display():可以简单查看当前packet的各个参数的取值情况,


  1. a=IP() 
  2. a.display() 

5.更多命令


  1. 命令                                  作用 
  2. show_interfaces()                  显示网卡信息 
  3.  
  4. str(pkt)                            组装数据包 
  5.  
  6. hexdump(pkt)                        十六进制转储 
  7.  
  8. ls(pkt)                          显示出字段值的列表 
  9.  
  10. pkt.summary()                        一行摘要 
  11.  
  12. pkt.show()                      针对数据包的展开视图 
  13.  
  14. pkt.show2()             显示聚合的数据包(例如,计算好了的校验和) 
  15.  
  16. pkt.sprintf()                   用数据包字段填充格式字符串 
  17.  
  18. pkt.decode_payload_as()         改变payload的decode方式 
  19.  
  20. pkt.psdump()                绘制一个解释说明的PostScript图表 
  21.  
  22. pkt.pdfdump()                   绘制一个解释说明的PDF 
  23.  
  24. pkt.command()               返回可以生成数据包的Scapy命令 
  25.  
  26. nsummary()                      同上,但规定了数据包数量 
  27.  
  28. conversations()                     显示一个会话图表 
  29.  
  30. filter()                    返回一个lambda过滤后的数据包列表 
  31.  
  32. hexdump()                       返回所有数据包的一个hexdump 
  33.  
  34. import_hexcap()                 将hexdump重新导入到Scapy中 
  35.  
  36. hexraw()                    返回所有数据包Raw layer的hexdump 
  37.  
  38. padding()                   返回一个带填充的数据包的hexdump 
  39.  
  40. nzpadding()                 返回一个具有非零填充的数据包的hexdump 
  41.  
  42. plot()                      规划一个应用到数据包列表的lambda函数 
  43.  
  44. make table()                    根据lambda函数来显示表格 
  45.  
  46. traceroute("baidu.com")     查看IP路径的traceroute功能 
  47.  
  48. export_object()             数据包转换成base64编码的Python数据结构 
  49.  
  50. import_object()                     可以将输出重新导入 
  51.  
  52. save_session()                  保存所有的session变量 
  53.  
  54. load_session()                  读取保存的session 
  55.  
  56. fuzz()      更改一些默认的不被计算的值(比如校验和checksums),更改的值是随机的,但是是符合字段的值的。 

二、嗅探数据包


  1. from scapy.all import * 
  2. pkt = sniff(iface = "Realtek PCIe GBE Family Controller",count = 3 ,filter='tcp',prn = lambda x: x.sprintf('{IP:%IP.src%->%IP.dst%\n}{Raw:%Raw.load%\n}')) 
  3.  
  4. filter:过滤条件 
  5. iface:网卡接口名称 
  6. count:数据包数量 
  7. prn:回调函数,通常与lambda搭配使用 
  8. sprintf()函数控制输入信息 
  9.  
  10. 抓取源地址为192.168.3.3的端口为80的tcp报文: 
  11. sniff(filter="ip src 192.168.3.3 and tcp and tcp port 80", prn=lambda x:x.summary()) 
  12.  
  13. 抓取目的地址网段为192.168.3.3/24的报文: 
  14. sniff(filter="dst net 192.168", prn=lambda x:x.summary()) 
  15.  
  16. 抓取非ICMP的报文: 
  17. sniff(filter="not icmp", prn=lambda x:x.summary()) 
  18.  
  19.  
  20. 将抓取到的报文的summary打印出来: 
  21. sniff(filter="icmp", prn=lambda x:x.summary(), count=10) 
  22.  
  23. 将所有IP报文的源地址打印出来: 
  24. sniff(filter="icmp", prn=lambda x:x[IP].src, count=10) 

三、构造数据包


  1. pkt= Ether()/IP(dst='192.168.1.2')/TCP(dport=80) 

提到数据包,不得不说各个协议了,提到协议,又自然而然想到了osi七层模型。

 

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 包,并传入一些参数


  1. #构造一个 IP 包,并传入一些参数 
  2. pkt = IP(dst="192.168.1.2",ttl=10) 
  3. ls(pkt)   
  4. version:版本号 
  5. ihl:头长度 
  6. tos:服务类型 
  7. len:IP数据包总长 
  8. id:标识符 
  9. flags:标记 
  10. flag:片偏移 
  11. ttl:生存时间 
  12. proto:协议类型 
  13. chksum:头部校验 
  14. src:源IP地址 
  15. dst:目的IP地址 
  16. options:可选项 

2、构造ARP包


  1. #构造ARP包 
  2. ARP(op=1, hwdst="ff:ff:ff:ff:ff:ff", pdst=ip_address) 
  3. #arp类的构造函数列表: 
  4. ls(ARP) 
  5. hwtype     : XShortField          = (1)  值为1表示以太网地址,其它还可能表示令牌环地址 
  6. ptype      : XShortEnumField      = (2048)  0x0800表示IP地址,其它还可能是ICMP/IGMP 
  7. hwlen      : ByteField            = (6)   ARP报文中,它的值为6 
  8. plen       : ByteField            = (4)  ARP报文中,它的值为4 
  9. op         : ShortEnumField       = (1) 取值为1或者2,代表ARP请求或者响应包。1.ARP请求,2.ARP应答,3.RARP请求,4.RARP应答 
  10.   
  11. hwsrc      : ARPSourceMACField    = (None) 发送方Mac地址。 
  12. psrc       : SourceIPField        = (None) 发送方IP地址。 
  13. hwdst      : MACField             = ('00:00:00:00:00:00') 目标Mac地址。 
  14. pdst       : IPField              = ('0.0.0.0') 目标IP地址。 

3、构造Ether


  1. #构造Ether 
  2. Ether(dst="ff:ff:ff:ff:ff:ff"
  3. ls(Ether) 
  4. dst        : DestMACField         = (None) 目的MAC 
  5. src        : SourceMACField       = (None) 源MAC 
  6. type       : XShortEnumField      = (36864) 
  7. 构造一个以太网数据包通常需要指定目标和源MAC地址,如果不指定,默认发出的就是广播包ff:ff:ff:ff:ff:ff 

4、构造TCP包


  1. #构造TCP包 
  2. sport      : ShortEnumField                      = 20              (20) 目标端口 
  3. dport      : ShortEnumField                      = 80              (80)  源端口 
  4. seq        : IntField                            = 0               (0) 
  5. ack        : IntField                            = 0               (0) 
  6. dataofs    : BitField (4 bits)                   = None            (None) 
  7. reserved   : BitField (3 bits)                   = 0               (0) 
  8. flags      : FlagsField (9 bits)                 = <Flag 2 (S)>    (<Flag 2 (S)>) 
  9. window     : ShortField                          = 8192            (8192) 
  10. chksum     : XShortField                         = None            (None) 
  11. urgptr     : ShortField                          = 0               (0) 
  12. options    : TCPOptionsField                     = []              (b''

 

【声明】:芜湖站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

相关文章