Ibby111GT/netrecon

GitHub: Ibby111GT/netrecon

纯 Python 标准库实现的多线程 TCP 端口扫描器,支持 banner 获取、服务识别和 CIDR 范围扫描,帮助用户快速掌握自有网络的端口与服务暴露情况。

Stars: 0 | Forks: 0

# NetRecon — TCP 网络扫描器 [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/ad/ad5834178f7599af9fdda11629d49cae07f2997beec49821b2920eff5bfd50e7.svg)](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框架, 云存储安全, 插件系统, 数据泄露防护, 数据统计, 无后门, 服务识别, 端口扫描, 网络扫描, 网络探测, 逆向工具