Mohxndaziz/TCP-Port-Scanner-using-python
GitHub: Mohxndaziz/TCP-Port-Scanner-using-python
基于 Python 多线程 Socket 的 TCP 端口扫描器,支持服务指纹识别、DNS 解析和 JSON 报告导出,旨在帮助开发者从零理解端口扫描的核心网络概念。
Stars: 0 | Forks: 0
## 从零开始构建 TCP 端口扫描器
### 项目目标与动机
我正在构建一个名为 portscanner.py 的 Python CLI 工具,它可以扫描目标主机的开放 TCP 端口,通过 banner grabbing 识别服务指纹,处理 SSL/TLS 连接,并执行 DNS 解析。这将通过让我亲自实现核心网络概念,帮助我理解端口扫描器的内部工作原理。

### 选择安全且合规的测试目标
测试目标是 scanme.nmap.org。它是安全的,因为它由 Nmap Project 专门设置和维护,用于测试端口扫描器并了解其工作原理。
## 使用多线程 Socket 扫描端口
### 设计核心扫描引擎
在这一步中,我正在构建 TCP connect scan 功能,通过尝试与目标主机上的每个端口建立完整连接来测试单个端口,以便了解哪些端口是开放的,哪些是关闭或被过滤的。
### connect_ex() 如何驱动端口检测
connect_ex() 返回 0 表示成功(开放),返回非 0 表示失败(关闭)。
## 通过 Banner Grabbing 和 SSL 识别服务指纹
### 添加服务检测功能
在这一步中,我将添加一个 banner grabber 和 SSL/TLS 支持,以识别加密服务的指纹,并使用正则表达式模式匹配提取服务版本。
### 实时服务检测结果
我检测到服务为 "SSH",版本为 OpenSSH_6.6.1p1
## DNS 解析与完善的 CLI 界面
### 构建命令行界面
在这一步中,我将为目标侦察添加正向和反向 DNS 解析,并使用 argparse 构建灵活的 CLI,以便用户可以从终端配置扫描,同时创建一个看起来专业的格式化结果表。
### DNS 解析如何处理主机名和 IP
当它接收到一个主机名时,它会尝试使用 socket.gethostbyname(target) 将此域名解析为 IP 地址(正向 DNS 查询)。
错误处理:如果查询失败(例如,由于主机名拼写错误或没有互联网访问,这会引发 socket.gaierror),它会打印清晰的错误消息,并使用 raise SystemExit(1) 立即终止程序。当它接收到一个 IP 时,它会尝试使用 socket.gethostbyaddr(target) 执行反向 DNS 查询以找到相应的域名。如果查询成功,它会提取主域名并将其保存到 hostname 变量中。如果查询失败(例如,如果该 IP 在 DNS 服务器上没有反向指针记录,从而引发 socket.herror),它会捕获该错误并将 hostname 置为 None。
## 导出结构化的 JSON 扫描报告

### 设计机器可读的安全输出
在这个项目扩展中,scan_metadata 包含了有关扫描配置的所有信息:target、IP、hostname、port count、thread count、timeout、timestamp 和 duration。results 列表已经是一个字典列表(来自 identify_service()),因此它可以直接序列化为 JSON。结构化输出非常有用,因为您可以将 JSON 报告加载到 Python 脚本、Web 仪表板或 SIEM 工具中,而无需编写自定义解析器。纯文本报告需要人工阅读或使用脆弱的正则表达式解析。
## 完整扫描流程图:
解析 CLI → 解析 hostname → 扫描端口 → 抓取 banner → 检测服务 → 打印结果 → 导出 JSON
```
port_scanner/
├── scanner/
│ ├── __init__.py
│ ├── models.py
│ ├── constants.py
│ ├── resolver.py
│ ├── port_scan.py
│ ├── service_detect.py
│ ├── cli.py
│ └── report.py
├── main.py
├── requirements.txt
└── README.md
```
标签:Python, Scrypt密钥派生, 插件系统, 数据统计, 无后门, 服务指纹识别, 端口扫描, 网络扫描器, 逆向工具