shinjansarkar/netdiscover

GitHub: shinjansarkar/netdiscover

一款使用 Python 编写的多线程网络扫描器,通过 Flask 仪表板提供主机发现、端口扫描、服务枚举及报告导出功能。

Stars: 0 | Forks: 0

# NetDiscover 🔍 NetDiscover 是一款生产级、轻量级、受 Nmap 启发的网络扫描器和服务枚举工具,使用 Python 编写。它提供了一个现代、响应式的深色主题 Flask 仪表板,用于运行、可视化和导出审计结果。 ## 功能 - **主机发现**:在目标子网中利用 **ICMP Echo Ping**(无需 root 即可工作)和 **ARP 广播**(需要提升的权限)进行多线程主机检测。 - **服务和端口扫描**:使用可配置的 `ThreadPoolExecutor` 工作池进行快速的 TCP 端口连接扫描。 - **服务版本检测与 Banner 获取**:连接到开放端口以读取 Banner,并映射带有版本标记的协议。 - **数据库日志与历史记录**:在 SQLite 中维护扫描历史记录、主机清单和日志事件。 - **报告导出**:支持即时下载 **TXT**、**JSON** 和 **CSV** 格式的审计结果。 - **交互式可视化**:包含实时的 CLI 风格控制台和动态的 SVG 子网拓扑图。 - **Docker 支持**:开箱即用,随时可以构建和运行。 ## 项目架构 ``` NetDiscover/ ├── netdiscover/ │ ├── __init__.py │ ├── app.py # Flask server routes & API endpoints │ ├── config.py # Configuration manager (ports, timeouts, threads) │ ├── db.py # SQLite database wrapper & audit logs │ ├── host_discovery.py # ICMP & ARP subnet sweeps (ThreadPoolExecutor) │ ├── port_scanner.py # TCP socket connect scanner │ ├── service_detector.py # Banner regex parser & service mapper │ ├── banner_grabber.py # Socket payload query tool │ ├── report_generator.py # Exporters (JSON, TXT, CSV) │ ├── scanner_engine.py # Core scan pipeline orchestrator │ ├── init_helper.py # Database pre-population helper │ └── templates/ # Jinja2 Dashboard Layouts │ ├── base.html │ ├── index.html │ ├── new_scan.html │ ├── scan_history.html │ ├── reports.html │ └── logs.html ├── run.py # Entry start script ├── Dockerfile # Container build instructions ├── docker-compose.yml # Compose stack specification ├── requirements.txt # Python dependency manifest └── README.md # System instruction handbook ``` ## 安装与设置 ### 1. 虚拟环境设置 #### 创建与激活虚拟环境 **Linux / macOS:** ``` # 创建虚拟环境 python3 -m venv venv # 激活它 source venv/bin/activate ``` **Windows (命令提示符):** ``` python -m venv venv venv\Scripts\activate.bat ``` **Windows (PowerShell):** ``` python -m venv venv .\venv\Scripts\Activate.ps1 ``` #### 停用虚拟环境 工作完成后,请停用虚拟环境: ``` deactivate ``` ### 2. 本地设置(标准主机执行) 确保已安装 python3 和 pip。首先安装系统网络工具: ``` # Ubuntu / Debian sudo apt update sudo apt install -y iputils-ping net-tools libpcap-dev gcc # macOS (使用 Homebrew) brew install tcpdump libpcap ``` 创建虚拟环境并安装依赖项: ``` python3 -m venv venv source venv/bin/activate pip install --upgrade pip pip install -r requirements.txt ``` 启动服务器: ``` python run.py ``` 在浏览器中打开 **`http://localhost:5000`**。 ### 3. 在 Docker 中运行 #### 了解 Dockerfile `Dockerfile` 定义了容器镜像: ``` # 使用官方轻量级 Python 镜像 FROM python:3.10-slim # 安装网络命令和 scapy 所需的系统依赖 RUN apt-get update && apt-get install -y --no-install-recommends \ iputils-ping \ net-tools \ tcpdump \ libpcap-dev \ gcc \ libc-dev \ && rm -rf /var/lib/apt/lists/* # 设置工作目录 WORKDIR /app # 复制 requirements 并安装 COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # 复制应用程序文件 COPY netdiscover/ ./netdiscover/ COPY run.py . # 为 dashboard 暴露端口 EXPOSE 5000 # 运行 Flask 服务器 CMD ["python", "run.py"] ``` **Dockerfile 分解说明:** - **`FROM python:3.10-slim`** — 从轻量级的 Python 3.10 镜像开始 - **`RUN apt-get...`** — 安装用于扫描的网络工具(ping、tcpdump、libpcap) - **`WORKDIR /app`** — 设置容器的工作目录 - **`COPY requirements.txt...`** — 复制并安装 Python 依赖项 - **`COPY netdiscover/...`** — 复制应用程序源代码 - **`EXPOSE 5000`** — 声明容器监听 5000 端口 - **`CMD`** — 在启动时运行 Flask 应用程序 #### 使用 Docker Compose 构建与运行 Docker Compose 可自动执行镜像构建和容器编排: ``` # 构建并启动容器(支持实时重载) docker-compose up --build # 不重新构建直接启动 docker-compose up # 在后台运行(detached) docker-compose up -d # 查看日志 docker-compose logs -f # 停止容器 docker-compose down ``` 仪表板可在 **`http://localhost:5000`** 访问。 #### 手动 Docker 构建与运行 如果您不想使用 Docker Compose 进行构建: ``` # 构建镜像 docker build -t netdiscover:latest . # 运行容器 docker run --network host -p 5000:5000 netdiscover:latest ``` ## 使用的网络核心概念 ### 1. 子网划分与 CIDR 表示法 NetDiscover 解析采用 CIDR 表示法(例如 `192.168.1.0/24`)的子网。`/24` 子网掩码将 24 位用于网络,提供 254 个可用的主机地址(从 `.1` 到 `.254`)。 ### 2. ICMP Echo 请求 (Ping) Ping 传输 ICMP Type 8 数据包。如果主机在线,它会回复 ICMP Type 0(Echo Reply)。NetDiscover 利用系统原生的 `ping` 二进制文件来可靠地执行此测试,且无需 root 权限。 ### 3. ARP 广播(地址解析协议) ARP 用于将 IP 地址解析为物理 MAC 地址。扫描器向 MAC 地址 `ff:ff:ff:ff:ff:ff` 广播 ARP 请求(`Who has 192.168.1.X? Tell 192.168.1.Y`)。活跃的主机会直接回复。 ### 4. TCP Connect 端口扫描 扫描器使用标准的 socket 连接发起完整的 3 次握手(`SYN` -> `SYN-ACK` -> `ACK`)。这保证了准确性,且不需要 raw socket 权限。 ### 5. Banner 获取与服务指纹识别 一旦端口连接成功,应用程序就会捕获初始的应用程序问候语(例如 `SSH-2.0-OpenSSH_8.2p1`)。通过使用正则表达式解析这些问候语,NetDiscover 可以提取特定的服务版本(如 NGINX、Apache、MariaDB)。
标签:Docker, Flask, Python, 占用监测, 后端开发, 安全防御评估, 插件系统, 数据统计, 无后门, 端口扫描, 网络扫描器, 请求拦截, 资产管理, 逆向工具