我如何构建一个 Python 网络扫描器,使其像攻击者一样思考

发布: (2026年3月9日 GMT+8 07:09)
7 分钟阅读
原文: Dev.to

Source: Dev.to

Sanketh Subhas

问题

每个网络都有盲点。

  • 防火墙规则被错误配置。
  • 服务被创建后被遗忘。
  • 开发者为“快速测试”打开了 3389 端口,却从未关闭。六个月后,勒索软件组织发现了它。

可怕的是?只要知道去哪里找,这些暴露点就非常容易被发现。

所以我构建了一个可以寻找这些问题的工具。

工具功能

网络扫描器与漏洞报告器 – 基于 Python 的实用工具,具备以下功能:

功能描述
端口扫描扫描目标 IP 或整个 CIDR 范围的开放端口
服务识别检测每个开放端口上运行的服务
漏洞匹配将每个服务与内置漏洞数据库进行比对
ATT&CK 映射将所有发现映射到 MITRE ATT&CK 技术
风险评分计算 0 到 100 的整体风险评分
报告生成包含整改建议的完整报告
导出输出 JSON 以供 SIEM 或工单系统集成
零外部依赖仅使用纯 Python 标准库

为什么我这样构建

大多数漏洞扫描器都是黑盒子。你运行 Nessus,得到一个 PDF,然后把它交给别人去解释。

我想了解 实际在底层发生了什么——扫描器到底在询问什么,响应意味着什么,以及如何将原始端口数据转化为可操作的内容。

这个工具就是我对这个问题的答案。

Source:

技术架构

端口扫描 — 多线程 TCP

扫描器使用 socketconcurrent.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 → SSH
  • 445 → SMB
  • 3389 → 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

⚠️ 重要: 仅扫描您拥有或已获得明确书面许可的系统。

链接

0 浏览
Back to Blog

相关文章

阅读更多 »