JHarv613/Jmap

GitHub: JHarv613/Jmap

一款零依赖、无需 root 权限的纯 Python 3 网络端口扫描器,专为受限环境下的网络发现与服务探测而设计。

Stars: 0 | Forks: 0

# Jmap 🗺️ 一个纯 Python 3 网络端口扫描器和网络映射器,专为**无法安装软件包**的系统而构建。无需 pip 安装,无依赖项 —— 只需 Python 3 和标准库。 专为 **Ubuntu 22.04.5 LTS** 构建并在此环境下进行了测试。 ## v2.0.0 中的新特性 - CIDR / 子网扫描 (`192.168.1.0/24`) - 扫描配置文件 —— `web`, `database`, `common`, `full` - `--top N` 最常见端口 - UDP 扫描(无需 root) - 通过 TTL 进行 OS 检测 - 反向 DNS 解析 - Traceroute(基于 ping,无需 root) - 从 banner 解析服务版本 - HTML 报告输出 - 扫描差异比对 —— 比较两个 JSON 扫描文件 - 监视模式 —— 定时重新扫描并仅显示变化 - 检查点 / 恢复 —— 接续被中断的扫描 - 用于个人默认设置的配置文件 (`~/.jmaprc`) - 安装程序中的 `--update` 标志 ## 功能 - TCP 端口扫描 —— 单个端口、范围、列表或混合 - UDP 端口扫描 —— 协议感知探测,无需 root - CIDR 扩展 —— 通过单个命令扫描整个子网 - 扫描配置文件 —— 针对常见用例的内置命名端口组 - 重试逻辑 —— 在放弃前对关闭/被过滤的端口重试 N 次 - 服务检测 —— 通过端口号识别 40 多种服务 - 服务版本解析 —— 从 SSH、HTTP、SMTP banner 中提取版本字符串 - Banner 抓取 —— 从开放端口读取原始服务 banner - OS 检测 —— 通过 ping TTL 启发式猜测 OS(无需 root) - 反向 DNS —— 自动将 IP 解析为主机名 - Traceroute —— 使用 ping 的逐跳路径,无需原始 socket - 从文件扫描 —— 每行一个 IP、主机名或 CIDR - 灵活的输出 —— CLI, `.txt`, `.json`, `.csv`, `.html` - 扫描差异比对 —— 比较两个 JSON 结果并突出显示变化 - 监视模式 —— 具有自动差异比对的持续监控 - 检查点 / 恢复 —— 保存进度并在中断后继续 - 配置文件 —— 在 `~/.jmaprc` 中设置个人默认值 - 多线程 —— 可配置线程数以实现快速扫描 - 速率限制 —— 限制探测次数/秒以保护小型设备 - 无需 root —— 完全安装到 `~/.local/bin` - 干净卸载 —— 删除所有文件和 shell 配置条目 ## 要求 | 要求 | 详情 | |---|---| | Python | 3.10+(预装在 Ubuntu 22.04 上) | | 操作系统 | Ubuntu 22.04.5 LTS(可能在其他 Linux 发行版上也能运行) | | Root / sudo | 不需要 | | 外部软件包 | 无 | ## 安装说明 ``` # Clone the repository git clone https://github.com/JHarv613/Jmap.git cd Jmap # 运行 installer(无需 sudo) chmod +x install.sh ./install.sh # 在当前 terminal 中激活 source ~/.bashrc.user # 验证 Jmap --version ``` ### 更新 当有新版本的 `Jmap.py` 可用时: ``` ./install.sh --update ``` 这仅会覆盖脚本 —— PATH 和启动器将保持不变。 ### 卸载 ``` ./install.sh --uninstall source ~/.bashrc.user ``` 移除启动器、库文件以及 `~/.bashrc.user` 中的 PATH 块 —— 不会残留任何内容。 ## 用法 ``` Jmap -a -p [OPTIONS] Jmap -f -p [OPTIONS] Jmap --diff ``` 运行不带任何参数的 `Jmap` 将显示完整的帮助界面。 ## 标志 ### 目标 | 标志 | 描述 | |---|---| | `-a IP/CIDR` | 单个 IP、主机名或 CIDR(例如 `192.168.1.0/24`) | | `-f FILE` | 包含目标的文件 —— 每行一个 IP、主机名或 CIDR | ### 端口 | 标志 | 描述 | |---|---| | `-p PORT(S)` | 单个 (`22`)、范围 (`1-1024`)、列表 (`80,443`) 或混合 (`1-1024,3306`) | | `--profile NAME` | 命名配置文件: `web`, `database`, `common`, `full`(可重复使用) | | `--top N` | 添加 N 个最常扫描的端口 | ### 扫描选项 | 标志 | 描述 | |---|---| | `--udp` | 同时探测 UDP 端口(无需 root;如果无响应则为 `open\|filtered`) | | `-t / --retries N` | 在标记为关闭/被过滤之前每个端口的重试次数(默认:1) | | `--timeout SECS` | 以秒为单位的 Socket 超时时间(默认:1.0) | | `--threads N` | 并行线程数(默认:100) | | `--rate N` | 每秒最大探测次数,0 = 不限制(默认:0) | | `--no-banner` | 跳过 TCP banner 抓取 | | `--traceroute` | 扫描前对每个主机进行基于 ping 的 traceroute | ### 输出 | 标志 | 描述 | |---|---| | `-o FILE` | 保存到文件 —— 通过扩展名选择格式(见下文) | | `-v / --verbose` | 同时显示关闭和被过滤的端口 | | `--watch INTERVAL` | 每隔指定间隔重新扫描(例如 `30s`, `5m`, `1h`),仅打印变化 | | `--checkpoint FILE` | 将扫描进度保存/恢复到 JSON 文件 | ### 其他 | 标志 | 描述 | |---|---| | `--diff OLD NEW` | 比较两个 JSON 扫描文件并打印变化 | | `--version` | 显示版本并退出 | ## 示例 ``` # 单个 port Jmap -a 192.168.1.1 -p 80 # 带有 3 次重试的 port 范围 Jmap -a 10.0.0.1 -p 1-1024 -t 3 # 指定 ports Jmap -a 10.0.0.1 -p 80,443,8080,3306 # 扫描整个 subnet Jmap -a 192.168.1.0/24 --profile common # 使用 profile Jmap -a 10.0.0.1 --profile web Jmap -a 10.0.0.1 --profile database # 组合 profile + 额外 ports Jmap -a 10.0.0.1 --profile web -p 8888,9000 # Top 100 ports Jmap -a 10.0.0.1 --top 100 # TCP + UDP Jmap -a 10.0.0.1 -p 53,123,161 --udp # 先 Traceroute 再扫描 Jmap -a 10.0.0.1 --traceroute --profile web # 保存为 JSON Jmap -a 192.168.1.0/24 --profile common -o scan.json # 保存为 HTML 报告 Jmap -a 192.168.1.0/24 --profile common -o report.html # 保存为 CSV Jmap -f targets.txt --profile common -o results.csv # 对比两次扫描 Jmap --diff scan_monday.json scan_friday.json # Watch 模式 — 每 5 分钟重新扫描,仅显示更改 Jmap -a 192.168.1.0/24 --profile common --watch 5m # 恢复中断的扫描 Jmap -a 192.168.1.0/24 -p 1-65535 --checkpoint progress.json ``` ## 扫描配置文件 | 配置文件 | 包含的端口 | |---|---| | `web` | HTTP, HTTPS, FTP, SMTP, IMAP, POP3 及常见 Web 端口 | | `database` | MySQL, PostgreSQL, MSSQL, Oracle, MongoDB, Redis, Elasticsearch | | `common` | 所有类别中约 45 个最常扫描的端口 | | `full` | 所有端口 1–1024 | 配置文件可以叠加使用:`--profile web --profile database` 会合并这两个集合。 ## UDP 说明 UDP 是无连接的 —— 不保证有响应。 | 情况 | 报告的状态 | |---|---| | 收到响应 | `open` | | 所有重试后均无响应 | `open\|filtered` | 系统会针对众所周知的 UDP 服务发送协议感知探测: | 端口 | 协议 | 探测 | |---|---|---| | 53 | DNS | DNS TXT 查询 (`version.bind`) | | 123 | NTP | NTP v3 客户端请求 | | 137 | NetBIOS | 节点状态请求 | | 161 | SNMP | 获取 `sysDescr` 的 v1 GetRequest | | 1900 | SSDP | `M-SEARCH` 发现数据包 | | 5353 | mDNS | DNS 查询(mDNS 格式) | | 所有其他 | 通用 | `\x00\x00` | ## 输出格式 | 扩展名 | 格式 | |---|---| | *(无)* | 仅彩色 CLI 输出 | | `.txt` | 纯文本 —— 与 CLI 布局相同,无颜色代码 | | `.json` | 结构化 JSON —— 适用于差异比对和脚本编写 | | `.csv` | 每个主机的每个端口占一行 —— 可导入电子表格或日志工具 | | `.html` | 独立的 HTML 报告,带有颜色编码的状态表 | ## 扫描差异比对 比较任意两个 `.json` 扫描输出: ``` Jmap --diff scan_monday.json scan_friday.json ``` 输出显示: - 新发现的主机 - 消失的主机 - 自上次扫描以来开放的端口 - 自上次扫描以来关闭的端口 ## 监视模式 ``` Jmap -a 192.168.1.0/24 --profile common --watch 5m ``` - 首次运行打印完整结果 - 随后的每次运行**仅打印**自上次扫描以来的**变化** - 支持所有时间间隔格式:`30s`, `5m`, `1h` - 按 `Ctrl+C` 停止 ## 检查点 / 恢复 对于可能被中断的大型扫描: ``` Jmap -a 192.168.1.0/24 -p 1-65535 --checkpoint progress.json ``` 进度会在扫描过程中持续保存到 `progress.json`。如果扫描被中断,请重新运行完全相同的命令,它将跳过已扫描的端口并从上次中断的地方继续。 ## 配置文件 (`~/.jmaprc`) 设置个人默认值,这样你就无需每次重新输入: ``` # ~/.jmaprc threads = 150 timeout = 0.75 retries = 2 rate = 200 ``` 任何 CLI 标志仍会覆盖配置文件中的值。 ## 目标文件格式 (`-f`) 每行一个条目。支持纯 IP、主机名和 CIDR。 空行和以 `#` 开头的行将被忽略。 ``` # Web servers 192.168.1.10 192.168.1.11 # Subnet 10.0.0.0/24 # 按 hostname myserver.local # 此行被忽略 ``` ## 限制 | 功能 | Jmap | nmap | |---|---|---| | TCP connect 扫描 | ✅ | ✅ | | UDP 扫描(尽力而为) | ✅ (无需 root) | ✅ | | SYN / 隐秘扫描 | ❌ (需要原始 socket) | ✅ | | OS 指纹识别 | ⚠️ 仅 TTL 启发式 | ✅ 完整指纹 | | 服务版本检测 | ⚠️ 仅 banner 解析 | ✅ | | IPv6 | ❌ 仅支持 IPv4 | ✅ | ## 仓库结构 ``` Jmap/ ├── Jmap.py # Main scanner — pure Python 3 stdlib ├── install.sh # Installer / updater / uninstaller (no root required) └── README.md # This file ``` ## License MIT License —— 可免费使用、修改和分发。 ## 作者 Joshua Harvey —— BNEW RCE, Ericsson
标签:Awesome, DNS查询工具, Python3, 插件系统, 数据泄露防护, 无依赖, 服务器安全, 端口扫描器, 系统管理, 网络工具, 网络探测, 聊天机器人