(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会显示如下界面:
(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)
(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')
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)
运行结果为:
通过抓包可以看出:网络中都是ARP广播包,如果某个IP地址进行了回应,则是网络中活跃的主机。