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, 插件系统, 数据泄露防护, 无依赖, 服务器安全, 端口扫描器, 系统管理, 网络工具, 网络探测, 聊天机器人