sanamsaivenkat/Port-Watch
GitHub: sanamsaivenkat/Port-Watch
一个用 Python 编写的初学者友好型端口扫描器和 Banner 抓取工具,帮助理解网络侦察的基本原理。
Stars: 0 | Forks: 0
# PortWatch
一个使用 Python 编写的轻量级、适合初学者的网络端口扫描器和 Banner 抓取工具。
## 第 1 天
今天,我创建了仓库,添加了描述,并规划了 Day 2 的内容。
## 🧠 我今天学到了什么(Day 2)
今天,我专注于**目标范围界定与名称解析**。在扫描器与目标进行交互之前,它必须将人类可读的名称转换为网络可路由的格式:
- **DNS 解析 (`socket.gethostbyname`)**:我了解到计算机在网络层是使用 IP 地址而不是域名进行通信的。此函数通过查询 DNS 服务器,将域名(如 `scanme.nmap.org`)转换为 IP 地址。
- **输入防护**:添加了检查以干净利落地处理空输入,这样脚本就不会浪费资源去尝试解析空白目标。
- **异常处理 (`socket.gaierror`)**:安全工具必须具备弹性。我实现了 `try/except` 块,以便优雅地捕获无效域名或网络断开的情况,而不是让程序崩溃。
## 🧠 我今天学到了什么(Day 3)
今天,我使用 Python 的 `socket` 库构建了核心扫描引擎。我了解了 **TCP 三次握手** 在侦察底层是如何工作的:
- **`socket.socket(socket.AF_INET, socket.SOCK_STREAM)`**:初始化一条配置为 IPv4 和 TCP 协议的全新网络连接路径。
- **`s.settimeout(1.0)`**:这对工具的性能至关重要。它可以防止扫描器在远程目标隐藏在激进的网络防火墙后时无限期地挂起。
- **`s.connect_ex()`**:在端口上执行底层的握手敲门。如果它捕获到返回值为 `0`,则表示 socket 成功建立了连接(**端口开放**)。任何其他错误号都表示端口已关闭或被过滤。
- **资源管理**:我了解到,每个打开的 socket 连接都必须通过 `s.close()` 显式终止,以避免操作系统内存泄漏。
## 🧠 我今天学到了什么(Day 4)
今天,我通过引入循环控制结构,将单端口脚本升级为了一个真正的**端口范围扫描器**:
- **`for port in range(start, end + 1)`**:我了解到 Python 的 `range()` 函数不包含上界。添加 `+ 1` 可确保用户选择的最终端口确实被扫描到。
- **数据类型转换**:由于通过 `input()` 进行的用户输入严格属于字符串数据类型,因此我使用 `int()` 将输入显式转换为整数,以便它们能自然地用于网络端口计算。
- **UI 优化**:修改了连接引擎以屏蔽对“CLOSED”端口的记录。这使终端保持整洁,并仅突出显示可操作的情报(**OPEN** 端口)。
- **线性时间复杂度**:观察到顺序扫描会根据端口范围的大小呈线性 ($O(n)$) 增加执行时间,这为我稍后将通过多线程解决的确切性能问题奠定了基础。
## 🧠 我今天学到了什么(Day 5)
今天,我将扫描器从简单的端口检测升级为通过 Banner 抓取进行的**应用暴露评估**:
- **服务枚举**:我了解到开放的端口会运行后台软件,该软件在连接时会广播问候字符串(banner)。捕获此信息可帮助安全分析师识别软件名称和确切版本,从而映射潜在的 CVE 漏洞。
- **数据流捕获 (`s.recv(1024)`)**:实现了数据缓冲区约束,以便直接从活动的网络 socket 通道捕获最多 1024 字节的原始二进制数据。
- **数据标准化 (`.decode(errors='ignore')`)**:网络传输的是原始字节。我利用字符串解码配置将网络流量格式化为干净、易读的文本字符串,同时绕过未映射的安全字符。
- **嵌套超时保护**:了解到许多防御性服务或标准 Web 服务器(如 Google 的 80 端口)在发送有效的客户端 payload 之前会保持沉默。在执行树中处理 `socket.timeout` 可以防止安静的服务破坏扫描器流程。
标签:Banner抓取, Python, 插件系统, 数据统计, 无后门, 服务器安全, 端口扫描, 逆向工具