不少人存在这样的观点:只要计算机安装各种专业的安全软件,系统及时更新补丁,密码尽可能复杂,那么计算机就会避免遭到入侵。当然这样的确不容易被入侵,但那也只是对传统的病毒、木马而言,在流量攻击面前,这些防护就会显得无能为力。无论何时,当你与其他设备进行通信时就会产生流量,当这些流量脱离了你的计算机后,其安全就不能得到有效的保障,然而这些流量中却包含着你的敏感数据,攻击者完全可以在不入侵你计算机的情况下获得你的敏感数据,这个过程叫流量嗅探。
实验环境:
OS:
macOS Monterey Version 12.3.1(英文版)
Kali: Linux kali 5.10.46 (英文版)
Windows: Win10
IDE:PyCharm 2020.1
1. 工作原理 互联网中的流量都是以数据包的形式传送的,流量嗅探是对数据包中的流量进行数据分析的一种手段。通过网络嗅探工具可以捕获到目标计算机网络的数据包,数据包中的数据是根据所采用的协议的要求来组织的,只要能够掌握协议的格式,就能够分析出这些数据所表示的意义。互联网中大部分数据都没有采用加密方式进行传输。例如我们常接触的HTTP、FTP、Telnet等协议传输的数据都是明文传输的。本例访问本机apache服务,端口8080,如下图:
2. 工具编写知道流量嗅探的原理,我们可以使用Scapy模块编写一个流量嗅探工具来嗅探本机网卡上的流量。需要使用到Scapy中的sniff()函数,该函数提供了多个参数,先了解几个重要的参数的含义:
§ iface :指定在哪个网络接口上抓包
§ count:表示要捕获数据包的数量。默认值为0,表示不限制数量
§ filter:流量都过滤规则。使用的是BPF(Berkeley Packet Filter, 柏克莱封包过滤器)的语法
§ prn:定义回调函数,通常使用lambda表达式来写回调函数。当符合filter的流量被捕获时,就会执行回调函数
备注:filter是最常用的函数。因为如果不过滤,就会捕获到大量的流量数据,很难从里面找到需要的数据库。
下面举几个常见的用例,帮助理解BPF语法:
- 只捕获与网络中某一IP的主机进行交互的流量:host 192.168.68.1
- 只捕获与网络中某一MAC地址的主机交互的流量:ether src host dc:d8:7c:28:b2:14
- 只捕获来源于网络中的某一个IP的主机流量:src host 192.168.68.1
- 只捕获去往网站中某一IP的主机的流量:dst host 192.168.68.1
- 只捕获80端口的流量:port 80
- 只捕获除80端口以外的其他端口的流量:!port 80
- 只捕获ICMP流量:ICMP
- 只捕获源地址为192.168.68.1且目的端口为80的流量:src host 192.168.68.1 && dst port 80
下面用实例说明,实时显示捕获到的数据包,要加上prn选项,这里用lambda表达式编写,具体内容为prn=lambda x:x.summary(),如下图(kali系统环境)目标地址192.168.68.242所示:
也可以进一步输出源IP和目的IP,更改一下lambda表达式,(macOS系统,目标主机kali系统)命令如下:
(venv) (base) liuxiaowei@MacBookAir % sudo python3
Password:
Python 3.9.9 (v3.9.9:ccb0e6a345, Nov 15 2021, 13:29:20)
[Clang 6.0 (clang-600.0.57)] on darwin
>>> from scapy.all import *
WARNING: No IPv4 address found on en4 !
WARNING: No IPv4 address found on ap1 !
WARNING: more No IPv4 address found on en2 !
>>> sniff(filter='dst 192.168.68.248', prn=lambda x:x[IP].src+'---->'+x[IP].dst) # 源IP ,目的IP
结果如下图:
如果需要更详实的输出,则需要更多代码,可以定义一个回调函数,然后让prn调用即可,定义一个CallBack()函数,代码如下:
>>> from scapy.all import *
>>> def CallBack(packet):
... print(f'Source:{packet[IP].src}---->Target:{packet[IP].dst}')
... print(f'TTL:{packet[IP].ttl}')
... print(packet.show())
...
>>> sniff(filter='dst 192.168.68.248', prn=CallBack)
结果如如下图:
除了显示这些数据包,我们还可以将这些数据包保存,用专业的工具查看、分析这些数据包。保存数据包的格式很多种,目前最为通用的格式为pcap。可以借助wrpcap()函数进行数据包的保存,示例代码如下:
>>> from scapy.all import *
>>> packet=sniff(filter='dst 192.168.68.248', count=4)
>>> wrpcap('bruce_liu.pcap', packet)
把存储的包用Wireshark工具查看,如下图所示:
3. 编写网络嗅探工具根据用户传入的IP地址、数据包总数来捕获相应的数据包,并保存为pcap格式。示例代码如下:
#_*_coding:utf-8_*_
# 作者 :liuxiaowei
# 创建时间 :4/23/22 10:51 PM
# 文件 :sniff_pcap.py
# IDE :PyCharm
from scapy.all import *
import time
import optparse
# 时间戳转换函数
def TimeStamp2Time(timeStamp):
timeTmp = time.localtime(timeStamp)
myTime = time.strftime("%Y-%m-%d %H:%M:%S", timeTmp)
return myTime
# 回调输出函数
def PackCallBack(packet):
print("=" * 30)
# 打印源IP,源端口,目的IP,目的端口
print(f"[{TimeStamp2Time(packet.time)}]Source:{packet[IP].src}:{packet.sport}--->Target:{packet[IP].dst}:{packet.dport}")
# 打印输出数据包
print(packet.show())
print("=" * 30)
if __name__ == '__main__':
hostIP = input('请输入目的IP地址:')
fileName = input('请输入保存的文件名:')
packetCount = input('请输入捕获的数据包总数:')
defFilter = "dst " + hostIP
packets = sniff(filter=defFilter, prn=PackCallBack, count=int(packetCount))
# 保存输出文件
wrpcap(fileName, packets)
备注:监听网络接口要root权限,普通用户需要在命令前加sudo,否则会报错。
开启两个终端,一个终端进行监听,另一个终端使用curl命令如下所示:
监听终端:
(venv) (base) liuxiaowei@MacBookAir 流量分析 % sudo python sniff_pcap.py
Password:
WARNING: No IPv4 address found on en4 !
WARNING: No IPv4 address found on ap1 !
WARNING: more No IPv4 address found on en2 !
请输入目的IP地址:112.80.248.76
请输入保存的文件名:bruce_liu.pcap
请输入捕获的数据包总数:6
使用curl命令终端:
(base) liuxiaowei@MacBookAir ~ % curl 112.80.248.76
抓包效果如下:
目录下会多出一个名为bruce_liu.pcap文件,我们用Wireshark工具查看,如下图所示:
正好是六个数据包
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)