当前位置:   article > 正文

Scapy扫描局域网_scapy fcs

scapy fcs

Scapy是一个强大的交互式数据包处理程序(使用python编写)。它能够伪造或者解码大量的网络协议数据包,能够发送、捕捉、匹配请求和回复包等等。

Scapy起源于Linux,但在windows上也可以安装,具体步骤见下面链接:

https://www.cnblogs.com/qingkongwuyun/p/8508733.html

但是Scapy学习资料比较少,涉及的网络协议比较复杂,所以不太好学。我们首先来看一个简单的例子:

  1. # -*- coding: utf-8 -*-
  2. from scapy.all import srp, Ether, ARP
  3. arp_request=Ether(dst='FF:FF:FF:FF:FF:FF')/ARP(pdst='192.168.1.232')
  4. arp_request.show()

先来看看ARP函数结构:

  1. >>> ls(ARP)
  2. hwtype : XShortField = (1)
  3. ptype : XShortEnumField = (2048)
  4. hwlen : ByteField = (6)
  5. plen : ByteField = (4)
  6. op : ShortEnumField = (1) 取值为1或者2,代表ARP请求或者响应包。{"who-has":1, "is-at":2
  7. hwsrc : ARPSourceMACField = (None) 发送方Mac地址。
  8. psrc : SourceIPField = (None) 发送方IP地址。
  9. hwdst : MACField = ('00:00:00:00:00:00') 目标Mac地址。
  10. pdst : IPField = ('0.0.0.0') 目标IP地址。

Ether函数:

  1. >>> ls(Ether)
  2. dst : DestMACField = (None) 目的MAC
  3. src : SourceMACField = (None) 源MAC
  4. type : XShortEnumField = (36864)
  5. 这个op选项很重要,1为ARP请求,2为ARP应答。
  6. 构造一个以太网数据包通常需要指定目标和源MAC地址,如果不指定,
  7. 默认发出的就是广播包ff:ff:ff:ff:ff:ff,即向同一网段内的所有主机发出询问

关于Ether协议,上面的三个属性只代表Ether的头部,完整的Ether由以下几部分组成:

FCS(Frame Check Sequence)表示尾帧,用来检查帧在传输的过程中是否损坏。类型(type)表示后面的数据是属于哪种类型的数据,例如Type为0x0800时为IP协议包,Type为8060时,后面为ARP协议包,RARP为8035,IPv6为86DD等。

Ether本身不是个完整的东西,它只是传递其它协议数据的中转站。

关于ARP的op值,我们举个例子:

  1. arp_frame = Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(op=1, pdst="10.0.0.3")
  2. resp,unans = srp(arp_frame)
  3. #可以看出,op=1时,构造一个ARP请求,既然是请求,就需要应答,所以srp函数接受应答的数据。
  4. ....
  5. packet = scapy.ARP(op=2, pdst=dest_ip, hwdst=dest_mac, psrc=source_ip, hwsrc=source_mac)
  6. scapy.send(packet, count=4, verbose=False)
  7. #此时op=2,表示告知对方某某事物,不需要回答,所以采用send函数就可以了

 

上面的程序构建了一个Ether()/ARP()数据包。‘/’符号被重载为“叠加”,即在Ether数据包上面再叠加一层ARP数据。运行结果如下:

从上面的图可以看出,[ARP]后面的东西就是ARP()数据包叠加的相关数据参数。

关于以太网的数据格式及传输,可参考下面文章:

http://www.cnblogs.com/qishui/p/5437301.html

下面回到正题,扫描局域网上存活的主机及MAC地址,先贴代码:

  1. # -*- coding: utf-8 -*-
  2. from scapy.all import srp, Ether, ARP
  3. IpScan = '192.168.0.0/24'
  4. try:
  5. #使用Ether()/ARP()构造ARP包
  6. packet = Ether(dst="FF:FF:FF:FF:FF:FF")/ARP(pdst=IpScan)
  7. #srp():发送与接收ARP包,返回一个元组。元组的第一个元素就是收到的数据包,第二个指未收到的包
  8. ans,_ = srp(packet, timeout=2)
  9. except Exception as e:
  10. print(e)
  11. else:
  12. #解析获取的包的信息,得到局域网中存活的主机的IP地址和MAC地址
  13. for _, rcv in ans:
  14. # ListMACAddr = rcv.sprintf("%Ether.src%---%ARP.psrc%")
  15. # print(ListMACAddr)
  16. print(rcv[ARP].psrc,'----',rcv.src)

 

上面代码中的rcv变量,存放的就是类似于Ether()/ARP()构造的数据包,可以依据前面列出的相关属性进行访问。

其实还有个极简单的方式扫描局域网,那就是arping()方法,如下:

一步到位,真强!

参考文章:

https://zhuanlan.zhihu.com/p/34843290

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/157029
推荐阅读
相关标签
  

闽ICP备14008679号