miasmaer/NULL

GitHub: miasmaer/NULL

NULL 是一个基于 libpcap 和 ncurses 构建的轻量级 Linux 命令行网络数据包嗅探器,提供实时协议解码与流量可视化。

Stars: 0 | Forks: 0

# *NULL* — 一个终端网络嗅探器 ``` :::: ::: ::: ::: ::: ::: :┼:┼: :┼: :┼: :┼: :┼: :┼: :┼:┼:┼ ┼:┼ ┼:┼ ┼:┼ ┼:┼ ┼:┼ ┼#┼ ┼:┼ ┼#┼ ┼#┼ ┼:┼ ┼#┼ ┼#┼ ┼#┼ ┼#┼#┼# ┼#┼ ┼#┼ ┼#┼ ┼#┼ #┼# #┼#┼# #┼# #┼# #┼# #┼# ### #### ######## ########## ########## ``` 一个轻量级、仅限 root 的 Linux 命令行数据包嗅探器。*NULL* 使用 `libpcap` 捕获实时流量,进行足以实用的解码,并以实时滚动、彩色高亮的 `ncurses` 仪表盘或纯文本流的形式显示——同时提供可选的 CSV 日志记录功能。 ## 目录 - [基本信息](#general-information) - [安装](#installation) - [可用参数](#available-arguments) - [用法](#usage) - [Bug 报告](#bug-reports) - [许可证](#license) - [免责声明](#disclaimer) ## 基本信息 *NULL* 是一个小巧、依赖极少的包嗅探器,直接基于 `libpcap` 和 `ncurses` 构建,不涉及任何其他第三方库。它旨在提供快速且易读的体验。 **核心功能:** - **实时数据包捕获**:通过 `libpcap` 在立即模式下进行,具有可配置的快照长度和大型捕获缓冲区,可在繁忙的接口上实现低丢失率的捕获。 - **协议解码**:Ethernet(包括 802.1Q VLAN 标签)、ARP、IPv4、IPv6、TCP、UDP、ICMP、ICMPv6、IGMP、GRE、ESP、AH、SCTP 和 OSPF。 - **应用层检测**: - **DNS** 查询名提取(从非响应数据包的第一个问题中提取)。 - **HTTP** 请求行和 `Host:` 头部解析(方法、路径、主机名)。 - **TLS** ClientHello SNI 提取(TCP 端口 443 流量)。 - **QUIC** 初始数据包 SNI 嗅探,因此也能显示 HTTP/3 主机名(UDP 端口 443 流量)。 - **两种显示模式**:全屏、彩色、可滚动的 `ncurses` TUI,或用于日志记录/脚本编写/无头机器的普通、可管道传输的文本流(`--no-color`)。 - **灵活的过滤**:捕获端 BPF 过滤器(端口、主机、原始 BPF 表达式)结合协议快捷方式(`--dns`、`--http`、`--https`/`--tls`、`--icmp`),以及硬性数据包计数限制。 - **CSV 导出**:导出每个匹配的数据包(时间戳、协议、地址、端口、长度、服务名称、主机名、HTTP 方法/路径),不限数量或限制为前 *N* 个数据包。 - **接口枚举**(`--list-interfaces`),因此您无需猜测设备名称。 - **干净关闭**:在 `Ctrl+C`/`SIGTERM` 时干净关闭,退出时会打印捕获和 CSV 的统计数据。 **项目结构:** ``` include/ Public headers (cli, sniffer, packet, csv_logger, tui) src/ Implementation files, one per header, plus main.cpp Makefile Build, install, debug, and run targets ``` ## 安装 ### 前置条件 - **Linux**(代码依赖于 `libpcap` 的 Ethernet 捕获、`netinet/*` 头文件和 `ncurses`;按照目前的编写方式,它无法移植到 Windows/macOS)。 - **Root 权限**(或二进制文件上的 `CAP_NET_RAW`/`CAP_NET_ADMIN`)——原始数据包捕获需要提升的访问权限。 - **支持 C++17 的编译器**(GCC 或 Clang)。 - **开发库**:`libpcap` 和 `ncurses`(头文件 + 链接库)、`make`。 ### 安装构建依赖 选择适合您发行版的章节,然后按照下文描述进行构建。 **Debian / Ubuntu / Linux Mint / Pop!_OS / Kali:** ``` sudo apt update sudo apt install -y build-essential libpcap-dev libncurses-dev ``` **Fedora:** ``` sudo dnf install -y gcc-c++ make libpcap-devel ncurses-devel ``` **RHEL / CentOS / Rocky Linux / AlmaLinux:** ``` sudo dnf install -y gcc-c++ make libpcap-devel ncurses-devel # 在较旧的 RHEL/CentOS 版本上使用 yum: sudo yum install -y gcc-c++ make libpcap-devel ncurses-devel ``` **Arch Linux / Manjaro / EndeavourOS:** ``` sudo pacman -Syu --needed base-devel libpcap ncurses ``` **openSUSE (Tumbleweed / Leap):** ``` sudo zypper install -y gcc-c++ make libpcap-devel ncurses-devel ``` **Alpine Linux:** ``` sudo apk add build-base libpcap-dev ncurses-dev ``` **Void Linux:** ``` sudo xbps-install -S base-devel libpcap-devel ncurses-devel ``` **Gentoo:** ``` sudo emerge --ask net-libs/libpcap sys-libs/ncurses ``` ### 构建 该项目使用附带的 `Makefile` 进行构建——无需 CMake 或其他构建系统。目标文件会写入 `build/`,并具有自动依赖项跟踪,因此增量重建只会重新编译已更改的部分。 ``` git clone https://github.com/miasmaer/NULL cd null make # builds ./null ``` 其他 Makefile 目标: ``` make debug # rebuild from clean with -g -O0 -DDEBUG (for gdb/valgrind) make run # build, then run with sudo make install # install to /usr/local/bin/null make uninstall # remove from /usr/local/bin make clean # remove build/ and the null binary ``` 在底层,`make` 使用以下命令编译每个 `src/*.cpp`: ``` g++ -std=c++17 -Wall -Wextra -O2 -Iinclude -MMD -MP -c .cpp -o build/.o ``` 并使用以下命令进行链接: ``` g++ build/*.o -o null -lpcap -lncurses -pthread ``` (需要 `-pthread`,因为 TUI 在后台线程上运行捕获。) ## 可用参数 ``` Capture options: -i Interface to listen on (default: first active) -p Filter by port number --host Filter by source or destination IP --filter "" Raw BPF expression (appended to built-in filter) -c Stop after n packets Protocol shortcuts: --dns Show only DNS queries --http Show only HTTP traffic --https, --tls Show only HTTPS / TLS traffic --icmp Show only ICMP packets Display: -v, --verbose Show extra detail (length) --no-color Disable colours (also disables TUI) Logging: --sf [n] Save captured packets to a CSV file. With a number, saves only the first n packets. Without a number, saves all captured packets. Utility: --list-interfaces List capture interfaces and exit -h, --help Show this help and exit --version Print version and exit ``` 注意: - 协议快捷方式(`--dns`、`--http`、`--https`/`--tls`、`--icmp`)彼此之间使用 **OR** 逻辑组合,但所有这些都会与 `-p`、`--host` 和 `--filter` 执行 **AND** 运算。例如,`-p 8080 --http` 将捕获端口 8080 上**且**匹配 HTTP 快捷方式 BPF 子句的流量。 - `--sf` 后面不跟数字时会记录整个会话的所有匹配数据包;`--sf 500` 会在 500 个数据包后停止写入新的 CSV 行(捕获本身会继续,直到您退出或达到 `-c` 限制)。 - 很快会添加更多参数。 ## 用法 原始捕获需要提升的权限,因此请使用 `sudo` 运行: ``` sudo ./null [options] ``` **示例:** ``` # 在 eth0 上嗅探 DNS 查询 sudo ./null -i eth0 --dns # 在 wlan0 上嗅探 HTTPS/TLS 流量,并显示额外详细信息 sudo ./null -i wlan0 --https -v # 监视自定义端口上的 HTTP 流量 sudo ./null -p 8080 --http # 仅限来自/发往特定主机的数据包 sudo ./null --host 8.8.8.8 # 传递原始 BPF 过滤器并将捕获上限设为 100 个数据包 sudo ./null --filter "tcp port 22" -c 100 # 将前 500 个匹配的数据包记录到带时间戳的 CSV 文件中 sudo ./null --sf 500 # 将所有内容记录到 CSV,无上限 sudo ./null --sf # Headless/纯文本输出,适合通过管道传递或记录到文件 sudo ./null -i eth0 --no-color > capture.log # 列出可用的捕获接口 sudo ./null --list-interfaces ``` **TUI**(默认模式,除非传递了 `--no-color`)显示一个顶部栏(接口、过滤器、时钟),实时的协议计数“胶囊”(DNS/HTTP/TLS/UDP/ICMP/TCP/ARP/其他)以及总数据包和字节数,还有一个可滚动、彩色高亮的数据包表格(时间、协议、源地址、目标地址、服务以及主机名/HTTP/长度信息列)。 快捷键: | 按键 | 操作 | |-----------------|--------------------------| | `q` / `Q` / `Esc` | 退出 | | `↓` / `j` | 向下滚动一行 | | `↑` / `k` | 向上滚动一行 | | `Page Down` | 向下滚动一页 | | `Page Up` | 向上滚动一页 | | `g` / `Home` | 跳至顶部 | | `G` / `End` | 跳至底部(最新)| **CSV 输出**(`--sf`)会写入当前目录下的 `NULL_capture_YYYYMMDD_HHMMSS.csv` 文件,包含的列有:`time, proto, src_ip, src_port, dst_ip, dst_port, length, service, hostname, http_method, http_path`。 ## Bug 报告 发现了崩溃、解析错误、您的发行版上的构建失败,或者在 TUI 中看起来不对劲的地方?请在本仓库中提一个 **GitHub Issue**。 在提交 issue 时,包含以下信息会有很大帮助: - 您的发行版和版本。 - 编译器及其版本。 - 您运行的确切命令。 - 您期望发生的情况与实际发生的情况(包括任何错误输出)。 - 如果是捕获/解析的 bug,请提供相关的接口类型(如 Ethernet、Wi-Fi、VPN、容器桥接等)。 欢迎通过同一个 Issues 标签页提交功能请求和 pull request。 **注意**:如果您发现了安全问题,请前往 SECURITY.md 获取进一步的帮助。 ## 许可证 该项目基于 **MIT 许可证**授权,完整文本请参见:[`LICENSE`](LICENSE)。 ## 免责声明 本项目的创建者对其使用方式不承担任何责任。此工具仅用于研究、学习和授权的网络诊断。 您使用此软件的风险完全由您自己承担。您可以自由使用、复制、修改或基于此代码构建衍生项目,但任何此类项目**不得使用本项目的名称,且不得声称为本项目关联或受其认可**。 仅限在您拥有或获得明确监控权限的网络和接口上捕获流量。未经授权的数据包捕获在您所在的司法管辖区可能是非法的。
标签:网络协议分析, 网络抓包, 防御绕过