codejake/snoopy-passive-recon
GitHub: codejake/snoopy-passive-recon
一款基于 Python 和 Textual TUI 的被动局域网侦察工具,通过监听常见协议发现流量来实时展示网络中的设备与服务信息。
Stars: 0 | Forks: 0
# Snoopy

`snoopy.py` 是一款带有 Textual TUI 的被动局域网侦察工具。它监听局域网中已有的常见发现和路由流量,将这些流量转化为结构化的发现事件,并在实时仪表盘中展示结果。
它不会主动扫描或探测主机。相反,它通过监控诸如 LLDP、CDP、DHCP、mDNS、NBNS、SSDP、WS-Discovery 和 OSPF/OSPFv3 等流量,帮助你了解哪些设备和服务正在对外通告自身信息。
## 历史
`snoopy.py` 是我在 20 世纪 90 年代编写的 `snoopy.pl` 工具的重塑版本。
## 主要功能
- 使用 `tcpdump` 捕获数据包
- 解码来自多种协议的被动发现流量
- 对发现结果进行去重,并生成实时设备表
- 在 Textual 仪表盘中展示详情和近期事件日志
- 允许你通过单次按键将当前发现状态保存为 JSON 格式
## 环境要求
- macOS 或 Linux
- Python 3.13+
- [`uv`](https://github.com/astral-sh/uv)
- `tcpdump` 可在 `PATH` 中找到
- 拥有在目标接口上捕获数据包的权限
在许多系统上,你需要提升的权限才能捕获流量,例如使用 `sudo`。
## 项目依赖状态
本仓库专为 `uv` 配置,目前需要:
- Python:`3.13`
- 运行时依赖:`textual>=8.2.8`
- 外部系统依赖:`tcpdump`
权威的 Python 项目元数据保存在 `pyproject.toml` 中。该脚本还包含内联的 `uv` 头部信息,因此可以直接作为可执行文件运行。
## 设置
将 Python 依赖安装到本地环境中:
```
uv sync
```
如果你希望使用特定的解释器:
```
uv python pin 3.13
uv sync
```
或者:
无需安装,直接从仓库中运行:
```
uv run https://raw.githubusercontent.com/codejake/snoopy-passive-recon/main/snoopy.py -i
```
请确保已通过你的操作系统包管理器或系统工具单独安装了 `tcpdump`。
## 用法
通过 `uv` 运行该应用:
```
uv run snoopy.py
```
由于数据包捕获通常需要特定权限,常见的调用方式是:
```
sudo uv run snoopy.py
```
如果文件已标记为可执行且安装了 `uv`,你也可以依赖可执行的 shebang:
```
./snoopy.py
```
### CLI 选项
```
-i, --interface Capture on a specific interface
-c, --count Stop after this many decoded discovery events
```
示例:
```
uv run snoopy.py --interface en0
uv run snoopy.py --count 50
sudo uv run snoopy.py --interface eth0 --count 100
```
如果你没有传入 `--interface`,Snoopy 会尝试在 macOS 或 Linux 上自动检测默认路由接口。
## 仪表盘控制
- `q`:退出
- `l`:切换近期发现日志面板
- `s`:将当前发现结果保存到 `snoopy-discoveries-YYYYMMDD-HHMMSS.json`
保存的 JSON 文件会写入当前工作目录。
## 已解码协议
- LLDP
- CDP
- DHCP
- mDNS
- NBNS
- SSDP
- WS-Discovery
- OSPF
- OSPFv3
## 注意事项与限制
- Snoopy 是被动的。如果网络中没有流量,仪表盘也就不会有数据显示。
- 发现的质量取决于相邻设备选择通告的内容。
- DHCP `DHCPOFFER` 流量通常是针对特定客户端的回复流量,因此 Snoopy 能否看到它取决于你的捕获位置。
- 当前环境中必须存在 `tcpdump`,且当前用户有权运行它。
- 接口自动检测目前仅支持 macOS 和 Linux。
## 故障排除
如果启动失败:
- 确认 `tcpdump` 已安装且在 `PATH` 中
- 如果缺少数据包捕获权限,请使用提升的权限重试
- 如果默认路由检测选择了错误的设备,请显式传入 `--interface`
- 如果本地缺少 `textual`,请重新运行 `uv sync`
如果你想在未开始捕获前进行快速的语法检查:
```
python3 -m py_compile snoopy.py
```
标签:Python, Snort++, TUI, 局域网发现, 无后门, 被动扫描, 逆向工具, 防御绕过