我如何构建一个 Python 网络扫描器,使其像攻击者一样思考
Source: Dev.to
问题
每个网络都有盲点。
- 防火墙规则被错误配置。
- 服务被创建后被遗忘。
- 开发者为“快速测试”打开了 3389 端口,却从未关闭。六个月后,勒索软件组织发现了它。
可怕的是?只要知道去哪里找,这些暴露点就非常容易被发现。
所以我构建了一个可以寻找这些问题的工具。
工具功能
网络扫描器与漏洞报告器 – 基于 Python 的实用工具,具备以下功能:
| 功能 | 描述 |
|---|---|
| 端口扫描 | 扫描目标 IP 或整个 CIDR 范围的开放端口 |
| 服务识别 | 检测每个开放端口上运行的服务 |
| 漏洞匹配 | 将每个服务与内置漏洞数据库进行比对 |
| ATT&CK 映射 | 将所有发现映射到 MITRE ATT&CK 技术 |
| 风险评分 | 计算 0 到 100 的整体风险评分 |
| 报告 | 生成包含整改建议的完整报告 |
| 导出 | 输出 JSON 以供 SIEM 或工单系统集成 |
| 零外部依赖 | 仅使用纯 Python 标准库 |
为什么我这样构建
大多数漏洞扫描器都是黑盒子。你运行 Nessus,得到一个 PDF,然后把它交给别人去解释。
我想了解 实际在底层发生了什么——扫描器到底在询问什么,响应意味着什么,以及如何将原始端口数据转化为可操作的内容。
这个工具就是我对这个问题的答案。
Source: …
技术架构
端口扫描 — 多线程 TCP
扫描器使用 socket 和 concurrent.futures.ThreadPoolExecutor 同时对 29 个常见端口发起 TCP 连接尝试。多线程使得即使在完整的 CIDR 范围内扫描也保持高速。
from concurrent.futures import ThreadPoolExecutor
with ThreadPoolExecutor(max_workers=50) as executor:
futures = {executor.submit(scan_port, ip, port): port for port in ports}
每个连接要么成功(端口打开),要么超时(关闭/过滤)。不发送原始数据包,不需要 root 权限。
服务识别
打开的端口通过静态字典映射到已知服务名称,例如:
22→ SSH445→ SMB3389→ RDP
……以及 29 种服务的其余映射。
漏洞匹配
对每个识别出的服务在内置漏洞数据库中进行检查。这不是 CVE 扫描,而是 风险模式匹配。
- 端口 23 开放? → Telnet – 明文协议 – 关键 风险。
- 端口 27017 开放? → MongoDB – 可能存在未认证访问。
数据库覆盖了在泄露报告中实际出现的服务:SMB(EternalBlue)、RDP(勒索软件入口)、Redis(无认证数据泄露)、Elasticsearch(未认证访问)等。
MITRE ATT&CK 映射
每个漏洞发现都会标记相应的 ATT&CK 技术:
| 发现项 | ATT&CK 技术 |
|---|---|
| RDP 暴露 | T1076 – 远程桌面协议 |
| SMB 暴露 | T1210 – 远程服务利用 |
| Telnet 开放 | T1040 – 网络嗅探 |
这将原始扫描输出转化为与对手行为对齐的情报——正是 SOC 或威胁情报团队所需要的框架。
风险评分
工具根据严重程度和发现数量计算综合风险评分(0 – 100):
| 分数 | 评级 |
|---|---|
| 70–100 | 🔴 关键 |
| 45–69 | 🟠 高 |
| 20–44 | 🟡 中 |
| 0–19 | 🟢 低 |
示例输出
=================================================================
NETWORK SCANNER & VULNERABILITY REPORTER
Target : 192.168.1.1
Open Ports : 4 | Vulnerabilities: 6
Risk Score : 85/100 [██████████████████████████████████░░░░░░]
Rating : 🔴 CRITICAL RISK
⚠️ VULNERABILITIES (6)
[CRITICAL] RDP Exposed to Internet (Port 3389)
MITRE ATT&CK : T1076 — Remote Desktop Protocol
Remediation : Restrict RDP to VPN only, enable NLA, use MFA
[CRITICAL] SMB Port Exposed (Port 445)
MITRE ATT&CK : T1210 — Exploitation of Remote Services
Remediation : Block SMB at firewall, apply MS17‑010 patch
实际应用
- 攻击面映射 – 在攻击者发现之前先找到暴露的服务是任何漏洞管理计划的第一步。
- 风险优先级排序 – 并非所有开放端口都一样重要。工具会对风险进行评分和排序,以便先修复最危险的暴露。
- SIEM 集成 – JSON 导出可以直接供 Splunk、Elastic 或任何工单系统(如 ServiceNow)使用。
- 合规支持 – 定期的网络扫描满足 NIST CSF、CIS Controls 和 ISO 27001 等控制要求。该工具生成所需的证据。
我学到的
- 多线程改变了一切。 在
/24上的单线程扫描器需要几分钟;使用 50 个并发线程则只需几秒。了解线程池大小和超时调优是一项真正的技能。 - 漏洞数据库是最难的部分。 编写端口扫描逻辑相对直接。决定哪些服务有风险、原因何在,以及如何向非技术利益相关者解释,这种 GRC 思维才让安全工具真正有用。
- MITRE ATT&CK 是一种沟通框架。 将发现映射到 ATT&CK 技术不仅是表面功夫;它让你能使用威胁情报团队、红队和事件响应者的共同语言。标记为 “
T1210— 远程服务利用” 的发现即可直接采取行动。
试一试
git clone https://github.com/SankethSubhas/network-scanner-vulnerability-reporter.git
cd network-scanner-vulnerability-reporter
# Follow the README for usage instructions
扫描愉快! 🚀
使用示例
扫描单个主机
(使用 scanme.nmap.org 进行合法测试)
python3 network_scanner.py scanme.nmap.org
扫描网络范围
python3 network_scanner.py 192.168.1.0/24
导出 JSON 报告
python3 network_scanner.py 192.168.1.1 --output report.json
⚠️ 重要: 仅扫描您拥有或已获得明确书面许可的系统。
链接
- GitHub: network-scanner-vulnerability-reporter
- Portfolio: sankethsubhas.pages.dev
- LinkedIn: linkedin.com/in/sanketh-subhas
