FardinIqbal/netsec-toolkit
GitHub: FardinIqbal/netsec-toolkit
一个基于 Python 的网络安全分析工具包,整合 ICMP/TCP 扫描与 TLS 证书检测,并生成 PDF 报告。
Stars: 0 | Forks: 0
# NetSec Toolkit


一次过期的 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, 主机名不匹配, 协议分析, 情报分析, 数据统计, 权限提升, 深度包检测, 端口扫描, 网络安全分析, 网络诊断, 自动化报告, 自签名证书, 证书过期, 逆向工具