FardinIqbal/netsec-toolkit

GitHub: FardinIqbal/netsec-toolkit

一个基于 Python 的网络安全分析工具包,整合 ICMP/TCP 扫描与 TLS 证书检测,并生成 PDF 报告。

Stars: 0 | Forks: 0

# NetSec Toolkit ![Python 3.11+](https://img.shields.io/badge/python-3.11%2B-blue) ![License MIT](https://img.shields.io/badge/license-MIT-green) 一次过期的 TLS 证书导致生产端点在数小时内无法访问。我构建此工具包以检测这类错误配置:过期证书、自签名证书、主机名不匹配以及过时的 TLS 版本。它还包含 ICMP ping/traceroute 和 TCP SYN 扫描,实现完整的网络侦察。 ## 功能 三个独立的网络安全分析工具,以及一个将发现结果编译为专业文档的 PDF 报告生成器。 - **scapy_ping.py** 使用 Scapy 发送原始 ICMP 回显请求,并通过逐跳增加 TTL 值来绘制你与目标之间的网络路径。 - **scapy_syn.py** 对端口列表执行 TCP SYN 扫描,根据响应标志将每个端口分类为开放、关闭或过滤。 - **tls_analyzer.py** 连接 TLS 端点,提取证书元数据,并标记过期证书、自签名证书、主机名不匹配以及过时协议版本。 - **generate_report.py** 将所有扫描结果聚合成带有表格、截图和分析章节的格式化 PDF。 ## 架构 ``` flowchart TD A[targets.txt] --> D[tls_analyzer.py] D --> E[tls_report.json] F[scapy_ping.py] --> G[ICMP Ping + TTL Exploration] H[scapy_syn.py] --> I[TCP SYN Port Scan] E --> J[generate_report.py] G --> J I --> J J --> K[netsec_report.pdf] ``` ## 特性 **ICMP Ping 与 TTL 探测** - 使用 Scapy 发送原始 ICMP 回显请求,精确测量 RTT。 - 逐跳探测 TTL 值(1、5、10),观察中间路由器的“Time Exceeded”响应以追踪路径。 **TCP SYN 端口扫描** - 构造带有 SYN 标志的原始 TCP 包,并发送到每个目标端口。 - 根据响应将端口分类为开放(SYN-ACK)、关闭(RST-ACK)或过滤(无响应)。 - 在收到 SYN-ACK 后发送正确的 RST 包,以干净地拆除半开连接。 **TLS 证书分析器** - 通过禁用证书验证连接 TLS,以便检查那些通常会导致连接失败的端点(这正是检测错误证书的目的)。 - 提取主题通用名称、备用名称、签发者链、有效期、TLS 版本和密码套件。 - 检测四类错误配置:过期证书、自签名证书、主机名不匹配、过时 TLS 版本(TLS 1.0 与 1.1)。 - 对通配符证书进行符合标签数量的匹配验证。 - 输出结构化 JSON 以便程序化使用。 **PDF 报告生成器** - 生成包含标题页、页眉、页脚和页码的多章节专业安全报告。 - 使用海军蓝/强调色配色方案与清晰排版,呈现交替行颜色的表格、章节编号和嵌入截图。 ## 使用说明 所有扫描工具都需要 root 权限,因为它们在网络层构造原始数据包。 ### ICMP Ping 与 TTL 探测 ``` sudo python3 scapy_ping.py ``` 向 `scanme.nmap.org` 发送 ICMP 回显请求,随后以 TTL 值 1、5、10 探测 `google.com` 以观察路径。 ### TCP SYN 端口扫描 ``` sudo python3 scapy_syn.py ``` 对 `scanme.nmap.org` 上的 22、80、443 和 9929 端口进行扫描。每个端口仅发送一个 SYN 包。开放端口会收到 RST 以关闭半开连接。 ### TLS 证书分析 ``` python3 tls_analyzer.py targets.txt ``` 从目标文件读取主机:端口对,连接每个端点并输出包含发现的 JSON 数组。此过程无需 root 权限,因为使用的是标准 TLS 套接字。 **将输出重定向到文件以便后续使用:** ``` python3 tls_analyzer.py targets.txt > tls_report.json ``` ### PDF 报告生成 ``` python3 generate_report.py ``` 读取 `output/` 目录与 `tls_report.json` 中的扫描结果,然后生成 `netsec_report.pdf`。 ## 示例输出 ### 针对 badssl.com 端点的 TLS 分析器 在 `targets.txt` 中列出的测试目标上运行: ``` $ python3 tls_analyzer.py targets.txt [ { "target": "badssl.com:443", "tls_version": "TLSv1.2", "cipher_suite": "ECDHE-RSA-AES128-GCM-SHA256", "leaf_certificate": { "subject_cn": "*.badssl.com", "is_expired": false, "hostname_match": true }, "issues": [] }, { "target": "expired.badssl.com:443", "tls_version": "TLSv1.2", "leaf_certificate": { "subject_cn": "*.badssl.com", "is_expired": true, "hostname_match": true }, "issues": ["Expired certificate"] }, { "target": "self-signed.badssl.com:443", "leaf_certificate": { "subject_cn": "*.badssl.com", "is_expired": false, "hostname_match": true }, "issues": ["Self-signed certificate"] }, { "target": "wrong.host.badssl.com:443", "leaf_certificate": { "subject_cn": "*.badssl.com", "is_expired": false, "hostname_match": false }, "issues": ["Hostname mismatch"] }, { "target": "tls-v1-0.badssl.com:1010", "error": "[SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] ..." } ] ``` 分析器正确识别了各类错误配置:`expired.badssl.com` 上的过期证书、`self-signed.badssl.com` 上的自签名证书、`wrong.host.badssl.com` 上的主机名不匹配(通配符 `*.badssl.com` 证书无法匹配三级子域名),以及 `tls-v1-0.badssl.com` 上的握手失败(现代 OpenSSL 拒绝协商已弃用的协议)。 ### TCP SYN 扫描 ``` $ sudo python3 scapy_syn.py Port 22: open Port 80: open Port 443: closed Port 9929: open ``` ## 工作原理 ### TCP SYN 扫描 SYN 扫描(有时称为“半开”扫描)利用 TCP 三次握手在不完成完整连接的情况下判断端口状态。扫描器构造仅设置 SYN 标志(`flags="S"`)的原始 TCP 包并发送到目标端口。三种可能的结果如下: 1. **SYN-ACK(标志 `0x12`)**:目标 TCP 栈返回 SYN-ACK,表示端口开放且有服务监听。扫描器立即发送 RST 包以拆除半开连接,防止其在目标应用程序日志中留下记录。这是 SYN 扫描相比完整 `connect()` 调用的关键优势。 2. **RST-ACK(标志 `0x14`)**:目标发送复位,意味着端口关闭。没有服务监听,但主机可达。 3. **无响应(超时)**:包被防火墙或过滤设备丢弃,端口被归类为过滤。 扫描器使用正确的序列号(`seq=reply[TCP].ack`)发送 RST,使目标 TCP 栈接受并清理半开连接状态。 ### TLS 证书验证 TLS 分析器故意使用 `check_hostname=False` 与 `verify_mode=ssl.CERT_NONE` 进行连接。这样可以检查那些通常会导致连接失败的证书,这正是目的所在:你要检测的是有问题的证书,而不是拒绝连接。 TLS 握手完成后,分析器提取 DER 编码的证书字节,并使用 `cryptography` 库解析以获取对 X.509 字段的结构化访问。随后执行四项检测规则: **过期证书**:将当前 UTC 时间与证书的 `notAfter` 字段比较。若 `now > not_after`,则证书已过期。过期证书会导致浏览器显示全页安全警告,破坏用户信任并可能完全阻止自动化 API 客户端。 **自签名证书**:检查叶证书的 `subject == issuer`。自签名证书没有通往受信证书颁发机构的信任链,浏览器和 TLS 客户端默认会拒绝它。此检测可捕获意外进入生产环境的开发证书。 **主机名不匹配**:验证你连接的主机名是否与证书中的主题通用名称或任一备用名称(SAN)匹配。SAN 检查优先于 CN,遵循 RFC 6125。这可发现证书颁发给某一域名却被部署在另一域名的情况。 ### 通配符证书匹配 通配符匹配遵循严格规则:`*.example.com` 证书仅匹配 `foo.example.com`,而不匹配 `bar.foo.example.com`。实现时将通配符模式与主机名按点分割,要求标签数量相同,并比较除第一个标签(通配符)外的所有标签。这可防止 `*.badssl.com` 证书错误匹配 `wrong.host.badssl.com`(一个三标签主机名,而通配符模式仅允许两标签)。 ### 过时 TLS 检测 分析器检查协商的 TLS 版本是否属于集合 `{"TLSv1", "TLSv1.1"}`。这两个版本存在已知漏洞(BEAST、POODLE),并已在 RFC 8996(2021)中被正式弃用。现代 OpenSSL 构建通常在库层面拒绝协商这些版本,因此 `targets.txt` 中的 TLS 1.0 测试端点在 `targets.txt` 中会触发握手失败,而非成功连接并附带版本警告。 ## 测试 `targets.txt` 中的测试目标使用 [badssl.com](https://badssl.com),这是一个公共服务,专门托管用于测试的故意配置错误的 TLS 端点。每个端点隔离单一失败模式: | 端点 | 预期问题 | |------|----------| | `badssl.com:443` | 正常(有效证书) | | `expired.badssl.com:443` | 过期证书 | | `self-signed.badssl.com:443` | 自签名证书 | | `wrong.host.badssl.com:443` | 主机名不匹配 | | `tls-v1-0.badssl.com:1010` | 过时 TLS 版本(握手失败) | ICMP 与 SYN 扫描工具的目标为 `me.nmap.org`,这是 Nmap 项目提供的明确用于授权测试的服务器。 ## 依赖要求 - Python 3.11+ - root/sudo 权限用于原始数据包工具(scapy_ping.py、scapy_syn.py) 安装依赖: ``` pip install -r requirements.txt ``` | 包 | 用途 | |----|------| | [scapy](https://scapy.net/) | 原始数据包构造与发送(ICMP、TCP) | | [cryptography](https://cryptography.io/) | X.509 证书解析与检查 | | [fpdf2](https://py-pdf.github.io/fpdf2/) | PDF 报告生成 | ## 相关项目 这是一个包含 5 个项目的安全研究套件的一部分:[Secure Vault](https://github.com/FardinIqbal/secure-vault)(密码管理器)、[Argus](https://github.com/FardinIqbal/argus)(被动网络嗅探器)、[tcpscan](https://github.com/FardinIqbal/tcpscan)(TCP 扫描器)、[x86 Exploit Lab](https://github.com/FardinIqbal/x86-exploit-lab)(缓冲区溢出研究)。 ## 许可证 [MIT](LICENSE)
标签:ICMP探测, PDF报告, Python网络工具, Scapy, SEO: TLS分析, SEO: 端口扫描器, SEO: 网络安全工具, SEO: 证书检测, TCP SYN扫描, TLS版本检测, TLS证书分析, Traceroute, 主机名不匹配, 协议分析, 情报分析, 数据统计, 权限提升, 深度包检测, 端口扫描, 网络安全分析, 网络诊断, 自动化报告, 自签名证书, 证书过期, 逆向工具