Ibby111GT/netrecon
GitHub: Ibby111GT/netrecon
纯 Python 标准库实现的多线程 TCP 端口扫描器,支持 banner 获取、服务识别和 CIDR 范围扫描,帮助用户快速掌握自有网络的端口与服务暴露情况。
Stars: 0 | Forks: 0
# NetRecon — TCP 网络扫描器
[](https://github.com/Ibby111GT/netrecon/actions/workflows/ci.yml)
一个多线程 TCP 端口扫描器,支持 banner 获取、服务识别和 CIDR 范围扫描。基于 Python 标准库构建——无需任何外部依赖。
## 功能
- 多线程并发扫描
- CIDR 范围扩展,上限为 /22,以防输入错误导致发起针对 1600 万主机的扫描
- 仅支持 IPv4——IPv6 目标会被直接拒绝并给出明确提示,而不是在扫描过程中解析失败而无任何反馈
- 针对 well-known 端口的服务 banner 获取和服务名查询
- 区分 open、closed 和 filtered(无响应)端口
- 基于 open 端口的组合提供 OS 提示——这是一种推测,而非指纹识别
- JSON 报告导出
- 独立的 `--demo` 模式,可在 localhost 上启动其自身的监听器
## 快速开始
```
# 独立演示:在 127.0.0.1 上启动两个 listener 并扫描它们。
# 数据不会离开你的机器。这是查看其运行效果的最快方法。
python scanner.py --demo
```
## 用法
```
# 扫描单个 host 的内置常用端口
python scanner.py -t 127.0.0.1
# 特定端口和范围
python scanner.py -t 127.0.0.1 --ports 22,80,443,8000-8010
# 你负责的 subnet(最大 /22)
python scanner.py -t 192.168.1.0/24 --ports 22,80,443,8080
# 所有端口,1-65535(速度慢)
python scanner.py -t 127.0.0.1 --full
# 将结果保存为 JSON
python scanner.py -t 127.0.0.1 --output report.json
# 在不稳定或限速的网络上降低 thread count
python scanner.py -t 127.0.0.1 --threads 20
# 通过慢速链路时,给每个端口更长的响应时间(默认:1.0s,Windows 上为 3.0s)
python scanner.py -t 127.0.0.1 --timeout 5
```
任何无效输入都会在建立 socket 连接之前被拒绝,程序将以状态码 2 退出:
```
$ python scanner.py -t 999.1.1.1
[!] '999.1.1.1' is not a valid IP address or CIDR range
$ python scanner.py -t 10.0.0.0/8
[!] 10.0.0.0/8 covers 16777216 addresses; NetRecon refuses anything wider than /22 (1024 addresses). Split it into smaller blocks.
$ python scanner.py -t 127.0.0.1 --timeout 0
[!] --timeout must be greater than 0 (got 0.0). A zero or negative budget reports every port as closed.
$ python scanner.py -t ::1
[!] IPv6 targets are not supported: netrecon currently scans IPv4 only.
```
### 为什么 `--timeout` 的默认值在不同平台上有所不同
连接超时预算决定了 NetRecon 如何区分 *closed* 端口和 *filtered*
端口,而这两类操作系统对于多快才会承认一个端口是 closed 存在分歧。
Linux 会立即以 RST 数据包回应针对 closed 端口的连接尝试,因此
`ConnectionRefusedError` 会在几毫秒内返回。而 Windows 会重传 SYN 数据包,
随后才抛出 `WSAECONNREFUSED`——在 loopback 环境下测量结果为 **2.011s**,
而此时设定的超时时间为 **1.005s**。如果仅使用 1.0s 的单一预算,超时将永远先一步触发,
因此在 Windows 上,所有 closed 端口都会被报告为“filtered”,这完全背离了该工具
所宣称的功能。因此,默认值在 POSIX 系统上为 1.0s,在 Windows 上为 3.0s,
你可以使用 `--timeout` 来覆盖此默认值。
这也是为什么系统会拒绝零或负数值,而不是将其直接放行的原因:
这并不总会在所有平台的 socket 层引发错误,它只会让
每个端口看起来都是 closed,并给你一个自信却错误的“安全”信号。
## 工作原理(通俗易懂版)
**它解决的问题。** 网络上的每台计算机都有数千扇带编号的“门”,称为端口。当软件想要接受连接时,它就会打开一扇门——Web 服务器打开 80 端口,远程登录服务打开 22 端口。久而久之,机器上会留下一些没人记得打开过的门:一个可以被访问的数据库,或者一个有人忘记关闭的测试服务。这些正是攻击者最先寻找的门。NetRecon 会告诉你你所负责的机器上有哪些门是打开的,这样你就可以关上那些不该开的门。
**端口扫描的本质是什么。** 它就像是敲门。对于每个端口,扫描器都会尝试发起一个普通的 TCP 连接,就像浏览器所做的那样。如果有东西回应,说明端口是 open。如果机器主动回复“这里什么都没有”,说明它是 closed。如果在超时之前根本没有收到任何回应,说明它是 filtered——通常是防火墙悄悄丢弃了连接请求。NetRecon 不会利用任何漏洞,也不会发送格式错误的数据包;它只会完成正常的连接,并在服务主动发送问候语时,记录下它说了什么。
**无需触碰他人的网络即可进行尝试。** 运行 `python scanner.py --demo`。该工具会在其自身进程内的 `127.0.0.1`(你自己的机器——这是一个无法从外部访问的地址)上启动两个小型监听器,扫描一短串端口列表,并找到它们。不会有任何数据包离开你的计算机,并且它总是能找到至少一个 open 端口,让你可以立即看到真实的输出。
**解读输出结果。** 每个 open 或 filtered 端口各占一行:
```
36289 OPEN unknown SSH-2.0-NetRecon_Demo
```
| 列名 | 含义 |
| --- | --- |
| `36289` | 端口号——即哪一扇编号的门做出了回应。 |
| `OPEN` | 状态。`OPEN` 表示有程序正在监听。`FILTERED` 表示完全没有响应,通常是防火墙所致。`ERROR` 表示探测本身失败——例如扫描器在较高的 `--threads`(线程数)下耗尽了 file descriptor——因此该端口的真实状态未知,并刻意*不*将其报告为 closed。Closed 端口不会被打印出来;在正常扫描中,几乎所有端口都是 closed,列出它们会淹没真正的扫描结果。 |
| `unknown` | 内置对照表中该端口通常对应的服务。`unknown` 仅表示该端口不在表中——这并不代表那里实际运行着什么。 |
| `SSH-2.0-NetRecon_Demo` | banner:即服务发回的问候语,通常会标明软件名称和版本。如果服务没有发送任何内容,则此处为空。 |
最后的摘要会显示耗时、有多少端口处于 open 状态,以及分别是哪些端口。
**open 端口对安全意味着什么。** open 端口本身并不是漏洞——Web 服务器本来就应该 open 80 端口。它只是一个入口点,其重要性体现在三个方面:它是多出一个可能受到攻击的软件;banner 可能会暴露一个老旧且已知存在漏洞的版本;它可能是原本根本不应该被访问到的服务,比如一个暴露在整个办公网络而不是仅限于应用服务器的数据库。有用的问题不是“是否有任何端口 open”,而是“所有 open 的端口是否都确实应该 open、是否已打上补丁,并且只有需要它的人才能访问”。
**何时会合理地使用它。** 检查你自己的笔记本电脑或服务器暴露了什么。确认防火墙规则是否确实生效。对你所管理的网络上运行的服务建立清单。验证你关闭的服务是否真的停止了监听。渗透测试人员在签署了授权范围文档的前提下,在客户网络上执行相同的操作。除了这些情况之外,请勿运行它。
## 环境要求
- Python 3.10 或更高版本,无需外部包(纯标准库)
- 在 Linux 上的 Python 3.14 环境中开发并测试
## 运行测试
```
python3 -m unittest discover -v
```
测试只与 `127.0.0.1` 通信——它们会启动自己的监听器并扫描这些监听器。不会访问外部网络,也没有任何测试依赖于外部 DNS 服务器。
## 伦理使用
**仅扫描你拥有的系统,或你有明确书面授权进行测试的系统。**
未经许可扫描他人的机器,往好了说是惹人反感,在许多国家更是违法的——它可能触犯美国的《计算机欺诈和滥用法》、英国的《计算机滥用法》以及其他地区的同类法律。“我只是看看”并不是借口,而且扫描行为会被远端记录下来,上面带有你的 IP 地址。
在扫描任何不属于你的目标之前:
- 获得有授权人员的书面授权。
- 确切商定授权范围——包括哪些地址、哪些端口、哪些日期。
- 严格遵守该范围。不要因为网络中有意思的地方就随意越界探测。
出于慎重,本代码库不包含任何针对第三方主机的示例,并且 `--demo` 拒绝扫描 loopback 以外的任何地址。如果你不确定是否被允许扫描某个目标,那就是不允许。
标签:Python, Qt框架, 云存储安全, 插件系统, 数据泄露防护, 数据统计, 无后门, 服务识别, 端口扫描, 网络扫描, 网络探测, 逆向工具