Python编程——使用scapy模块进行ARP局域网扫描,获取主机IP和MAC

1. scapy模块

(1)scapy模块的特点:

scapy是一个可用于网络嗅探的非常强大的第三方库。主要具有以下几个特点:

 

1.  可以以交互模式运行(命令行),也可以作为第三方库(写成黑客脚本等);

2.  可以用来做packet嗅探和伪造packet;

3.  已经在内部实现了大量的网络协议,可以用来编写非常灵活的工具;

4.  它可以伪造或者解析多种协议的报文,还具有发送、捕获、匹配请求和响应这些报文以及更多的功能。

 

典型的操作有,端口扫描(scanning)、路由跟踪(tracerouting)、探测(probing)、单元测试(unit tests)、攻击(attacks)和发现网络(network discorvery)等。它可以代替hping,arpspoof,arp-sk,arping,p0f 甚至是部分的Namp,tcpdump和tshark的功能。

(2)安装scapy模块:

scapy模块属于第三方库,在Windows上需要输入pip install scapy进行安装。

注意:Windows下安装scapy需要安装winpcap(之前安装过Wireshark就不用安装)或npacp(之前安装过nmap就不用安装)

安装成功后,启动scapy会显示如下界面:

Python编程——使用scapy模块进行ARP局域网扫描,获取主机IP和MAC_第1张图片

2. scapy模块的常用功能

(1)show_interfaces():显示网卡信息:

>>> show_interfaces()
INDEX  IFACE                                           IP             MAC
14     Bluetooth 豸() #2                                               C8:3D:D4:7B:C1:48
15     Realtek 8821AE Wireless LAN 802.11ac PCI-E NIC  192.168.31.99  C8:3D:D4:7B:C1:47
16     Realtek PCIe FE Family Controller                              FC:45:96:7F:7E:9E
27     VMware Virtual Ethernet Adapter for VMnet1      192.168.20.1   00:50:56:C0:00:01
28     VMware Virtual Ethernet Adapter for VMnet8      192.168.37.1   00:50:56:C0:00:08

(2)sniff函数进行嗅探流量,这个函数有很多参数,常见的如下所示:

sniff(count=0, store=1, offline=None, prn=None,filter=None, timeout=None, iface=None)
  •     count:表示抓包的数量,0表示无限制;
  •     store:表示抓取的数据包保存或者丢弃,1保存,0丢弃
  •     offline:从 pcap 文件读取数据包,而不进行嗅探,默认为None
  •     prn: 回调函数,对嗅探的包进行处理
  •     filter:过滤条件,使用wireshark里面的过滤语法
  •     timeout:在给定的时间后停止嗅探(超时时间),默认为 None
  •     iface:指定抓包的网络接口

(3)查看抓取到的数据包:

#导入scapy的所有功能
from scapy.all import *

#首先要选择网卡的接口,就需要查看网卡接口有什么,在进行选择
print(show_interfaces())
wifi='Realtek 8821AE Wireless LAN 802.11ac PCI-E NIC'

#查看抓取到的数据包
pkts=sniff(iface=wifi,count=3,filter='arp')
print(pkts)


结果如下:
INDEX  IFACE                                           IP             MAC
14     Bluetooth 豸() #2                                               C8:3D:D4:7B:C1:48
15     Realtek 8821AE Wireless LAN 802.11ac PCI-E NIC  192.168.31.98  C8:3D:D4:7B:C1:47
16     Realtek PCIe FE Family Controller                              FC:45:96:7F:7E:9E
27     VMware Virtual Ethernet Adapter for VMnet1      192.168.20.1   00:50:56:C0:00:01
28     VMware Virtual Ethernet Adapter for VMnet8      192.168.37.1   00:50:56:C0:00:08

 (4)将抓取到的数据包保存并查看:

#导入scapy的所有功能
from scapy.all import *

#首先要选择网卡的接口,就需要查看网卡接口有什么,在进行选择
print(show_interfaces())
wifi='Realtek 8821AE Wireless LAN 802.11ac PCI-E NIC'

pkts=sniff(iface=wifi,count=3,filter='arp')
# 将抓取到的包保存为pkts.pcap文件
wrpcap("pkts.pcap", pkts)

#查看这个包
package = sniff(offline='pkts.pcap')
#查看数据包   package = rdpcap('pkts.pcap')
print(package)

结果如下:
INDEX  IFACE                                           IP             MAC
14     Bluetooth 豸() #2                                               C8:3D:D4:7B:C1:48
15     Realtek 8821AE Wireless LAN 802.11ac PCI-E NIC  192.168.31.98  C8:3D:D4:7B:C1:47
16     Realtek PCIe FE Family Controller                              FC:45:96:7F:7E:9E
27     VMware Virtual Ethernet Adapter for VMnet1      192.168.20.1   00:50:56:C0:00:01
28     VMware Virtual Ethernet Adapter for VMnet8      192.168.37.1   00:50:56:C0:00:08

 (5)查看数据包详情,获取数据包中需要的部分:

>>> wifi='Realtek 8821AE Wireless LAN 802.11ac PCI-E NIC'
>>> pkts=sniff(iface=wifi,count=3)
>>> pkts

>>> pkts[0]
>
>>> pkts[0].show()
###[ Ethernet ]###
  dst= ff:ff:ff:ff:ff:ff
  src= f4:cb:52:ff:3b:06
  type= 0x806
###[ ARP ]###
     hwtype= 0x1
     ptype= 0x800
     hwlen= 6
     plen= 4
     op= who-has
     hwsrc= f4:cb:52:ff:3b:06
     psrc= 192.168.31.27
     hwdst= 00:00:00:00:00:00
     pdst= 192.168.31.1

>>> pkts[0][Ether].dst
'ff:ff:ff:ff:ff:ff'
>>> pkts[0][Ether].src
'f4:cb:52:ff:3b:06'
>>> pkts[0][ARP].hwsrc
'f4:cb:52:ff:3b:06'
>>> pkts[0][ARP].psrc
'192.168.31.27'
>>> pkts[0][ARP].hwdst
'00:00:00:00:00:00'
>>> pkts[0][ARP].pdst
'192.168.31.1'
>>>

 (6)模拟包(使用Ether()/ARP()构造ARP包):

p=Ether(dst='ff:ff:ff:ff:ff:ff')/ARP(pdst='192.168.0.0/24')

3. ARP局域网扫描

ARP局域网扫描:

1.  首先从scapy导入相关的模块。

2.  将本机的无线网卡存取下来

3.  使用Ether()/ARP()构造ARP包。

4.  srp()发送与接收ARP包。

5.  解析获取的包的信息,得到局域网中存活的主机的IP地址和MAC地址

代码如下:

#局域网扫描器,scapy
#导入scapy的所有功能
from scapy.all import *

#首先要选择网卡的接口,就需要查看网卡接口有什么,在进行选择
#print(show_interfaces())
wifi='Realtek 8821AE Wireless LAN 802.11ac PCI-E NIC'


#模拟发包,向整个网络发包,如果有回应,则表示活跃的主机
p=Ether(dst='ff:ff:ff:ff:ff:ff')/ARP(pdst='192.168.0.0/24')
#ans表示收到的包的回复
ans,unans=srp(p,iface=wifi,timeout=5)

print("一共扫描到%d台主机:"%len(ans))

#将需要的IP地址和Mac地址存放在result列表中
result=[]
for s,r in ans:
    #解析收到的包,提取出需要的IP地址和MAC地址
    result.append([r[ARP].psrc,r[ARP].hwsrc])
#将获取的信息进行排序,看起来更整齐一点
result.sort()
#打印出局域网中的主机
for ip,mac in result:
    print(ip,'------>',mac)

运行结果为:

Python编程——使用scapy模块进行ARP局域网扫描,获取主机IP和MAC_第2张图片

通过抓包可以看出:网络中都是ARP广播包,如果某个IP地址进行了回应,则是网络中活跃的主机。

Python编程——使用scapy模块进行ARP局域网扫描,获取主机IP和MAC_第3张图片

 

你可能感兴趣的:(python编程)