Skip to content

Coming98/jcSniffer

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

22 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

jcSniffer

网络攻防课程作业: 嗅探器的设计与实现

视频演示: 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...: 基于指定源/目的端口

基于IP地址的过滤

  • src=#1: 基于指定源 IP

  • dst=#1/#2: 基于指定目标 IP 网段

  • ip=#1: 基于指定源/目标

逻辑或合并多个过滤条件

  • filter_1 OR filter_2: 基于指定 IP 或 指定端口

Tips: 指定 IP 与 指定端口等功能实现将在扩展过滤中介绍

数据包的存储与导入

  • 存储数据包

  • 导入数据包

Tips: 导入后不可继续嗅探

扩展功能

扩展数据包过滤

该过滤指令将数据包的传输方向, 协议类型, 源/目的 IP地址/网段, 源/目的端口合并, 并支持 * 通配符 下方为展示样例:

  1. 10.203.158.136 > http > *: 捕获 10.203.158.136 发出的所有 http 请求

  1. 10.203.158.136 < http < *: 捕获 10.203.158.136 接收的所有 http 请求

  1. 10.203.158.136 <> http <> *: 捕获 10.203.158.136 发出或接收的所有 http 请求

  1. 124.16.77.0/24 < * < *: 捕获 124.16.77.0/24 子网收到的所有数据包

  1. 10.203.158.136:80, 443, 7000-8000 <> * <> * 捕获 10.203.158.136 80 或 443 或 7000 到 8000 端口所发出或接收的所有数据包

流的追踪以及传输数据的识别与导出

支持 HTTP 流的追踪与数据识别与导出

  • 当我们定位到一个包时, 如果识别出有可以导出的文件, 会高亮下载按钮

  • 这时点击下载按钮就会自动完成针对该文件的流的追踪以及数据的拼接, 提供下载

  • 目前测试通过了 jpeg 图片数据流, pdf 数据流, markdown 文件数据流的追中与文件识别导出

  • 理论上支持从 HTTP 流中导出传输的所有文件

Reference

  • 感谢: @d1nn34

初始设计参考了 https://github.com/d1nn3r/sniffer

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages