leadrelic/NMAP_SCANNER
GitHub: leadrelic/NMAP_SCANNER
一个以安全方式封装 nmap 的交互式 Python shell 工具,通过参数列表而非 shell 字符串执行扫描,内置多种扫描类型并如实提醒用户匿名性局限。
Stars: 0 | Forks: 0
# nmap_scanner.py
一个交互式的 nmap 扫描 shell —— 选择目标,选择扫描类型(或编写你自己的 flags),然后开始。基于 Python 的 `cmd` 模块构建,提供了一个真正的交互式 shell(命令历史记录、逐命令帮助、Tab 补全),而不是一个带编号的菜单循环。
```
python3 nmap_scanner.py
```
## 为什么会有这个工具
每次都凭记忆敲打 nmap flags 会变得很烦,而且许多“实用”的扫描器包装脚本会让情况变得更糟:它们通过 `eval` 或 shell 字符串传递用户输入 —— 这意味着目标或自定义 flag 中一个随意的字符可能会执行你意想不到的操作。这个工具的存在就是为了在不妥协的前提下提供便利:每一次 nmap 调用都是作为一个参数列表构建并直接执行的,绝对不会通过 shell 运行。
它还做了大多数 nmap 包装工具不屑做的事情:当你的 OPSEC 掩护实际上并没有起作用时,它会如实告诉你。
## 功能
- **交互式 shell**,而不是你每次循环都要重新阅读的菜单 —— 基于 `cmd`,具有命令历史记录(在 `~/.nmap_scanner_history` 中跨会话持久化)、行编辑和真正的逐命令帮助(`help syn`)。
- **无 shell,无 `eval`** —— 每次 nmap 调用都是带有参数列表的 `subprocess.Popen([...])`。包含 shell 元字符的目标或自定义 flag 除了导致目标验证失败外,不会产生任何其他影响。
- **一个对自身局限性保持诚实的 VPN 检查。** 与包装普通 HTTP 流量不同,nmap 的大多数扫描技术(SYN、UDP、ACK、XMAS、NULL、FIN 扫描以及 OS 检测)使用 raw sockets —— 它们完全绕过了正常的 `connect()` 系统调用,而这正是像 torsocks 或 proxychains 这样的 SOCKS 包装器唯一能够拦截的内容。为这些扫描类型提供“选择你的代理”菜单会给人一种虚假的信心,因为包装器要么默默无闻,要么直接报错。因此,这个工具会检查你是否在使用 VPN(VPN 在网络层运行,确实能掩盖这些流量),如果你没有使用,它会发出明确的警告 —— 这里故意不提供代理包装器选项。
- **13 种内置扫描类型**:SYN、TCP connect、UDP、ACK、ping sweep、XMAS、NULL、FIN、OS/服务探测、快速扫描(前 100 个端口)、高强度扫描(所有 65535 个端口)、NSE 漏洞扫描以及 no-ping —— 此外还有一个用于原始 flags 的 `custom` 命令。
- **按目标或按扫描定向** —— 设置一次目标(`target 10.0.0.5`)并对其运行扫描,或者在单次扫描时内联覆盖(`syn 10.0.0.9`),而无需更改你当前的工作目标。
- **真实的输出文件** —— 每次扫描都会将 nmap 自己的 `-oN` 纯文本报告写入 `~/nmap_scans/`,并在文件头部附加记录扫描类型、目标、时间戳和运行的确切命令的信息。
- **优雅的 Ctrl+C 处理** —— 停止正在运行的 nmap 进程(必要时升级为强制终止),而不是在后台留下一个孤立的扫描进程,并将保存的输出文件标记为已中断。
## 环境要求
- Python 3.7+(仅限标准库 —— 无需 `pip install`)
- 你的 `PATH` 中需要有 `nmap`
- 命令历史记录/行编辑(上箭头、Tab 补全)需要 `readline` 模块,该模块内置于 Linux/macOS 的 Python 中,但在 Windows 上不可用。该工具会自动检测并能在任何情况下正常运行 —— 只是在 Windows 上,除非你单独安装 `pyreadline3`,否则你无法获得持久的历史记录。
```
# macOS
brew install nmap
# Debian/Ubuntu
sudo apt install nmap
# Windows
# https://nmap.org/download.html#windows
```
## 使用方法
```
python3 nmap_scanner.py
```
你将经历以下步骤:
1. **nmap/root 检查** —— 确认已安装 nmap,并警告你如果未以 root 身份运行(有几种扫描类型需要它)。
2. **VPN 检查** —— 你在使用 VPN 吗?如果是,则获取你的公共 IP/地理位置,以便你直观地确认它是你的 VPN 出口。如果不是,你将收到关于哪些扫描类型不受保护的明确警告,并且必须在继续之前确认你已经理解。
3. **目标** —— 可以是 IP、CIDR 范围、`a.b.c.d-e` 样式的范围或主机名。
接下来你将进入 shell:
```
nmap-scanner[10.0.0.5]> scans # list all scan types
nmap-scanner[10.0.0.5]> syn # run a SYN scan against the current target
nmap-scanner[10.0.0.5]> udp 10.0.0.9 # run a UDP scan against a different host, just this once
nmap-scanner[10.0.0.5]> target 10.0.0.9 # change the working target
nmap-scanner[10.0.0.5]> custom # enter raw nmap flags interactively
nmap-scanner[10.0.0.5]> vpn # re-run the VPN/egress-IP check mid-session
nmap-scanner[10.0.0.5]> output # show where results are being saved
nmap-scanner[10.0.0.5]> help syn # see what a specific scan does before running it
nmap-scanner[10.0.0.5]> exit
```
输出将保存在 `~/nmap_scans/scan__.txt` 中。
## 关于 VPN 检查的说明
如果你回答正在使用 VPN,该工具会获取你当前的公共 IP/地理位置(通过 `ipinfo.io`/`ifconfig.co`/`api.ipify.org`),并要求你直观地确认它看起来像是你的 VPN 出口,而不是你真实的 ISP/位置 —— 这与在进行任何敏感操作之前在浏览器中检查你的 IP 的思路相同,只是内置在这里以免你忘记。
如果你回答否,你将得到关于为什么这个特定工具不提供像基于 HTTP 的工具那样的代理包装器回退的直接解释:SYN/UDP/ACK/XMAS/NULL/FIN 扫描和 OS 检测会构建 raw packets,它们永远不会触及 SOCKS 代理挂钩到的代码路径。VPN 在这里确实不同 —— 它是一个真正的网络层隧道,所以它确实能传输这些流量。即使两者都没有,你依然可以继续,但前提是你必须明确确认你理解你的真实 IP 将对目标可见。
## 已知的局限性
- 目前不支持 IPv6 目标。
- 自定义 flags 命令不会验证 flags 本身 —— 它会原封不动地传递 nmap 接受(或不接受)的任何内容。但目标验证仍然适用于你提供的任何目标。
- 每次扫描调用仅限单一目标;不支持批量/多目标排队。
## 免责声明
仅供授权的安全测试和研究使用。你有责任确保你拥有扫描任何指向目标的权限。
标签:Nmap, OPSEC, Python, 云存储安全, 插件系统, 无后门, 网络扫描, 虚拟驱动器, 逆向工具