网络攻防课程作业: 嗅探器的设计与实现
视频演示: Here
基础功能:
- 选择网卡进行抓包
- 图形化界面,多线程实现生产者与消费者模型
- 对常见数据包进行分析与关键内容展示
- 基础协议过滤的设计与实现
- 数据包的存储与导入
- 重传包的识别
- 常见厂商 MAC 地址识别
扩展功能:
- 扩展协议过滤的设计与实现
- 实现 TCP/HTTP 流的追踪以及传输数据的识别与导出
- 丢包率分析
Packet | Version | Description |
---|---|---|
Python | 3.8.12 | 逻辑实现 |
WinPcap | 4.1.3 | scapy 依赖 |
PyQt5 | 5.15.4 | 图形界面实现 |
pyqt5-tools | 5.15.4.3.2 | 图形界面设计 |
scapy | 2.4.5 | 逻辑实现 |
系统: Win 10 需要安装 WinPcap 4.1.3
- 自动识别本机网卡信息并展示
- 双击选择网卡后进如抓包页面等待启动
- 点击启动按钮或快捷键即可一键开启嗅探
- 生产者为
./sniff.py
中的SniffThread
线程: 其负责捕捉指定网卡的数据包, 每捕捉到一个后调用回调函数prn
发送HandleSignal
通知消费者处理
class SniffThread(QThread):
HandleSignal = pyqtSignal(scapy.layers.l2.Ether)
def __init__(self, filter, if_name):
super().__init__()
self.filter = filter
self.if_name = if_name
def run(self):
sniff(filter=self.filter, iface=self.if_name,
prn=lambda packet: self.HandleSignal.emit(packet))
- 消费者为
./main.py
中的JCSnifferWindow
收到信号后调用display
存储并展示数据包
class JCSnifferWindow(Ui_MainWindow, QMainWindow):
def __init__(self):
# ...
def start_sniff(self):
self.sniffThread = SniffThread("", self.if_name)
self.sniffThread.HandleSignal.connect(self.display)
self.sniffThread.start()
def display(self, packet):
# 消费者处理函数
...
- IPv4 数据报
- IPv6 数据报
- ARP 数据报
- TCP 数据包
- UDP 数据包
- HTTP 数据包
- ICMP 数据包
pro=#1
基于单个协议:'HTTP', 'TCP', 'UDP', 'IPV6', 'ARP', 'ICMP'
pro=#1,#2,...
基于多个协议
sport=#1
: 基于指定源端口
dport=#1-#2
: 基于指定目标端口范围
port=#1, #2..., #3-#4...
: 基于指定源/目的端口
src=#1
: 基于指定源 IP
dst=#1/#2
: 基于指定目标 IP 网段
ip=#1
: 基于指定源/目标
filter_1 OR filter_2
: 基于指定 IP 或 指定端口
Tips: 指定 IP 与 指定端口等功能实现将在扩展过滤中介绍
- 存储数据包
- 导入数据包
Tips: 导入后不可继续嗅探
该过滤指令将数据包的传输方向, 协议类型, 源/目的 IP地址/网段, 源/目的端口合并, 并支持 *
通配符
下方为展示样例:
10.203.158.136 > http > *
: 捕获10.203.158.136
发出的所有http
请求
10.203.158.136 < http < *
: 捕获10.203.158.136
接收的所有http
请求
10.203.158.136 <> http <> *
: 捕获10.203.158.136
发出或接收的所有http
请求
124.16.77.0/24 < * < *
: 捕获124.16.77.0/24
子网收到的所有数据包
10.203.158.136:80, 443, 7000-8000 <> * <> *
捕获10.203.158.136
80 或 443 或 7000 到 8000 端口所发出或接收的所有数据包
支持 HTTP 流的追踪与数据识别与导出
- 当我们定位到一个包时, 如果识别出有可以导出的文件, 会高亮下载按钮
- 这时点击下载按钮就会自动完成针对该文件的流的追踪以及数据的拼接, 提供下载
- 目前测试通过了
jpeg
图片数据流,pdf
数据流,markdown
文件数据流的追中与文件识别导出
- 理论上支持从 HTTP 流中导出传输的所有文件
- 感谢: @d1nn34
初始设计参考了
https://github.com/d1nn3r/sniffer