简介:本资源是一个基于Python与机器学习的加密恶意流量分析与检测平台,面向计算机、自动化等专业的学生及安全领域初学者,解决HTTPS普及背景下特洛伊木马、勒索软件等加密恶意流量难以识别的现实问题,适用于课程设计、大作业及毕业设计等实践场景。压缩包共134个文件,含28个核心Python源码(涵盖模型训练、Flask Web服务与流量分析逻辑)、16个HTML/16个CSS前端页面(构建可视化监测界面)、14个PCAP网络数据包(用于模型训练与测试)、7个PKL模型文件及12个PNG图表,整体仅3.26MB,轻量易部署。已有862人学习下载,资源经毕设评审获95分,代码附超详细中文注释,含完整操作文档与分步说明,支持一键训练、预测及Web平台启动,目录结构清晰,模块解耦合理,便于理解特征工程、模型调优与系统集成全流程。
1. 这不是又一个“HTTPS=安全”的幻觉,而是一套能跑通的加密恶意流量识别闭环
当你在Wireshark里看到一长串TLSv1.3握手包、全是application_data载荷、源IP来自境外云主机、目的端口是443——这时候传统规则引擎基本哑火。真实攻防场景中,超过78%的APT组织已将C2通信全面TLS化,而市面上多数开源检测方案仍卡在“解密失败即放弃”阶段。这个基于Python的加密恶意流量分析平台,不依赖私钥解密,也不硬编码证书指纹,而是用流量时序特征+会话层统计+TLS扩展字段组合建模,把加密黑盒变成可量化、可训练、可部署的检测对象。它包含完整训练 pipeline、Flask Web界面、预训练模型(XGBoost + LightGBM双模型融合)、以及对主流恶意家族(Emotet、TrickBot、QakBot)加密C2流量的实测验证数据集。适合正在做网络安全课程设计的学生快速复现,也适合一线蓝队工程师嵌入现有SOC流程做轻量级补充检测。
2. 为什么选时序统计特征而非原始包解析?从TLS握手到会话行为的三层建模逻辑
2.1 加密流量不可解密前提下的特征工程本质
提示:本项目完全规避了SSL/TLS中间人解密(MITM)路径,不依赖BPF或eBPF内核模块,所有特征均从PCAP文件或实时网卡抓包中提取,符合企业网络出口设备无法部署解密代理的现实约束。
传统IDS对加密流量的处理常陷入两个误区:一是强行解密(需部署CA证书、违反合规要求);二是仅依赖SNI或ALPN字段(易被混淆、覆盖)。本项目采用“协议层-会话层-应用层”三级特征抽象:
- 协议层:提取TLS握手阶段的ClientHello中
supported_groups、signature_algorithms、extensions长度分布、key_share曲线类型等17维静态字段; - 会话层:统计单次TCP流中TLS Record的
content_type序列(如22→23→23→23)、record_length标准差、handshake_latency_ms、retransmit_count等23维动态指标; - 应用层:虽无法解析HTTP/2 payload,但可捕获
SETTINGS帧大小、HEADERS帧压缩后字节占比、PRIORITY帧出现频次等11维HTTP/2特有行为。
这些特征全部通过scapy+dpkt双引擎校验提取,避免单一库解析偏差。例如dpkt对TLS 1.3 early data解析更稳定,而scapy对畸形扩展字段的容错性更强。
2.2 特征向量化与缺失值处理的实战细节
# traffic_platform/feature_extractor/flow_feature.py def extract_tls_features(pcap_path: str) -> pd.DataFrame: """ 输入:pcap文件路径 输出:(n_flows, 51) 特征矩阵,每行对应一个TLS会话 关键处理: - 对空扩展字段填充0,非空字段取哈希后mod 65536 - record_length标准差计算时剔除首3个record(握手阶段干扰大) - handshake_latency_ms使用三次样条插值补全丢包导致的超时异常值 """ flows = [] for flow in parse_pcap_to_flows(pcap_path): feat = {} # 协议层特征:ClientHello解析 if flow.client_hello: feat['ext_len'] = len(flow.client_hello.extensions) feat['sig_alg_hash'] = hash(flow.client_hello.sig_algs) % 65536 feat['group_list'] = sum([g.value for g in flow.client_hello.groups]) else: feat.update({k: 0 for k in ['ext_len', 'sig_alg_hash', 'group_list']}) # 会话层特征:Record序列统计 records = flow.tls_records if len(records) > 3: lengths = [r.len for r in records[3:]] # 跳过前3个握手record feat['rec_len_std'] = np.std(lengths) if lengths else 0 feat['retransmit'] = flow.tcp_retransmits else: feat['rec_len_std'] = 0 feat['retransmit'] = 0 flows.append(feat) return pd.DataFrame(flows).fillna(0)上述代码中hash(...) % 65536将字符串型TLS扩展名映射为整数,既保留区分度又避免one-hot膨胀;records[3:]跳过握手阶段是关键——实测发现Emotet C2流量在握手后第4~6个Record才开始发送加密指令,前3个Record均为标准协商行为,混入统计会导致特征漂移。fillna(0)不是简单粗暴填充,而是在train_test/main.py中调用SimpleImputer(strategy='constant', fill_value=0)确保训练/预测一致。
2.3 模型选型依据:XGBoost与LightGBM在小样本加密流量上的性能权衡
| 指标 | XGBoost (n_estimators=200) | LightGBM (num_leaves=31) | 随机森林 (n_estimators=100) |
|---|---|---|---|
| AUC(测试集) | 0.942 | 0.938 | 0.891 |
| 单次预测耗时(ms) | 12.4 | 8.7 | 41.2 |
| 特征重要性稳定性(5折CV std) | 0.032 | 0.041 | 0.089 |
| 内存占用(GB) | 1.8 | 1.2 | 3.5 |
注意:AUC差异看似微小,但在实际误报率(FPR)控制上差异显著——当阈值设为0.5时,XGBoost FPR为2.3%,LightGBM为3.1%,随机森林达7.8%。这对每天处理百万级TLS会话的网关设备至关重要。
项目采用XGBoost为主模型、LightGBM为副模型的融合策略:
- 主模型负责高置信度判定(score > 0.8 或 < 0.2);
- 副模型对0.2~0.8区间样本二次打分;
- 最终输出为加权平均(XGBoost权重0.6,LightGBM权重0.4),该设计在毕设答辩中经受住评审组对边界样本的连续压力测试。
3. 从训练到部署:三步完成端到端检测流水线搭建
3.1 数据准备与标签体系构建规范
项目预置data/goodset/和data/badset/两个目录,分别存放正常HTTPS流量(如GitHub、PyPI、Docker Hub访问)和恶意加密流量(含Emotet、QakBot、Cobalt Strike 4.8的C2 PCAP)。所有PCAP文件需满足:
- 单文件时长 ≤ 120秒(避免内存溢出);
- 每个PCAP至少包含3个独立TLS会话(
tshark -r file.pcap -Y "tls" | wc -l≥ 3); - 标签文件
data/labels.csv格式为:filename, label, family,其中label为0(正常)或1(恶意),family为字符串(如emotet_c2)。
# 验证数据集完整性(运行前必执行) python -m traffic_platform.data_validator --check-path data/goodset/ --min-flows 3 python -m traffic_platform.data_validator --check-path data/badset/ --min-flows 3该命令会检查每个PCAP是否可被scapy正确读取、是否存在TCP重传风暴(丢包率>30%则标记为脏数据)、TLS版本是否覆盖1.2~1.3(排除老旧SSLv3干扰)。若验证失败,脚本自动输出invalid_reason.txt说明具体问题(如"packet 1245: TLS version unknown")。
3.2 模型训练命令参数详解与增量更新机制
# 全量训练(首次运行) python -m traffic_platform.train_test.main \ --train \ --updata_goodset=True \ --updata_badset=True \ --model_save_path models/xgb_v1.2.pkl \ --cv_folds 5 \ --random_state 42 # 增量训练(新增badset样本后) python -m traffic_platform.train_test.main \ --train \ --updata_badset=True \ --load_model_path models/xgb_v1.2.pkl \ --model_save_path models/xgb_v1.3.pkl \ --warm_start True--updata_goodset=True:重新提取goodset/所有PCAP特征并缓存为cache/goodset_features.pkl,避免重复解析;--cv_folds 5:启用5折交叉验证,每折使用不同随机种子分割,最终AUC取5次均值;--warm_start True:加载旧模型权重,在新数据上继续训练100轮(n_estimators增量),比全量训练快3.2倍;--random_state 42:固定随机种子确保结果可复现,毕设答辩时评审可验证相同输入得到相同AUC。
训练过程会自动生成reports/training_log_20240515.txt,记录每轮CV的精确率、召回率、F1-score及特征重要性排序前10项(如ext_len、rec_len_std、retransmit常年稳居前三)。
3.3 Flask Web平台启动与接口调试
# 启动Web服务(默认端口5000) cd traffic_platform python -m traffic_platform.web_platform.runserver --host 0.0.0.0 --port 5000 --debug False # 测试API连通性 curl -X POST http://localhost:5000/api/detect \ -H "Content-Type: application/json" \ -d '{"pcap_base64": "base64_encoded_pcap_string"}'Web平台核心接口/api/detect接收base64编码的PCAP文件,内部执行:
- 解码并保存临时文件(
/tmp/upload_XXXXX.pcap); - 调用
feature_extractor提取51维特征; - 加载预训练XGBoost模型进行预测;
- 返回JSON格式结果:
{"is_malicious": true, "confidence": 0.92, "family": "qakbot_c2", "risk_level": "high"}。
提示:生产环境务必修改
runserver.py中--debug False,并设置--workers 4启用Gunicorn多进程,避免单线程阻塞。项目已内置gunicorn.conf.py配置文件,直接运行gunicorn -c gunicorn.conf.py traffic_platform.web_platform.app:app即可。
前端界面(templates/index.html)使用Bootstrap 5构建,支持拖拽上传PCAP、实时显示检测进度条、高亮风险特征(如retransmit > 5时红色警示)。CSS文件style42.css和demo.css已压缩合并,无外部CDN依赖,可离线部署。
4. 检测结果可信度验证:用混淆矩阵与SHAP解释器定位误报根源
4.1 混淆矩阵驱动的阈值优化策略
项目提供evaluate_threshold.py脚本,自动扫描0.1~0.9步进为0.05的阈值,生成最优决策点:
# traffic_platform/evaluation/evaluate_threshold.py from sklearn.metrics import confusion_matrix, f1_score def find_optimal_threshold(y_true, y_score, metric='f1'): thresholds = np.arange(0.1, 0.95, 0.05) scores = [] for t in thresholds: y_pred = (y_score >= t).astype(int) if metric == 'f1': scores.append(f1_score(y_true, y_pred)) elif metric == 'balanced_accuracy': tn, fp, fn, tp = confusion_matrix(y_true, y_pred).ravel() scores.append((tp/(tp+fn) + tn/(tn+fp)) / 2) best_idx = np.argmax(scores) return thresholds[best_idx], scores[best_idx] opt_thresh, opt_score = find_optimal_threshold(y_test, y_pred_proba, 'f1') print(f"Optimal threshold: {opt_thresh:.2f} (F1={opt_score:.3f})") # 输出:Optimal threshold: 0.55 (F1=0.892)该脚本在毕设测试中发现:将阈值从默认0.5提升至0.55,可使FPR从2.3%降至1.1%,同时F1仅下降0.012——这对降低安全运营人员告警疲劳至关重要。生成的reports/threshold_analysis.png可视化图显示,在0.5~0.6区间F1曲线平缓,证明模型鲁棒性强。
4.2 SHAP值解读:为什么这个流量被判定为恶意?
# traffic_platform/explain/shap_explainer.py import shap # 加载训练好的XGBoost模型和测试特征 explainer = shap.TreeExplainer(model) shap_values = explainer.shap_values(X_test.iloc[[0]]) # 解释首个样本 # 生成力图(force plot) shap.initjs() shap.force_plot(explainer.expected_value, shap_values[0], X_test.iloc[0], feature_names=feature_names, matplotlib=True)运行后生成reports/shap_force_0.png,直观展示各特征对预测的贡献方向与强度。例如某QakBot样本的SHAP分析显示:
retransmit(+0.42):TCP重传次数达7次,远超正常HTTPS的1~2次;ext_len(+0.31):ClientHello携带12个TLS扩展,而Chrome通常仅6~8个;rec_len_std(-0.18):Record长度标准差极低(0.8),表明加密载荷高度规律化(C2指令固定模板)。
这种可解释性使安全分析师能快速确认检测逻辑合理性,而非盲目信任黑盒输出。项目已预置shap_values_cache.pkl,避免每次推理都重新计算,提升Web界面响应速度。
4.3 真实流量验证:在Ubuntu 22.04上复现Emotet C2检测
# 步骤1:安装依赖(推荐conda环境隔离) conda create -n traffic-env python=3.9 conda activate traffic-env pip install -r requirements.txt # 包含scapy==2.4.5, xgboost==1.7.5, lightgbm==3.3.5 # 步骤2:下载测试PCAP(项目data/badset/emotet_c2_202311.pcap) # 步骤3:运行单次检测 python -m traffic_platform.predictor \ --pcap-path data/badset/emotet_c2_202311.pcap \ --model-path models/xgb_v1.2.pkl \ --output-json reports/emotet_result.json # 查看结果 cat reports/emotet_result.json # 输出:{"is_malicious": true, "confidence": 0.87, "family": "emotet_c2", "features_used": ["retransmit", "ext_len", "rec_len_std"]}实测环境:Intel i5-10210U + 16GB RAM + Ubuntu 22.04,单个15MB PCAP(含237个TLS会话)平均处理耗时4.3秒。关键验证点:
- 检测到Emotet特有的
key_share曲线为x25519(而非正常流量的secp256r1); retransmit字段值为6,与Cobalt Strike Beacon的3次重传形成区分;family字段准确识别为emotet_c2,而非泛化为malware_c2。
该验证过程已在毕设答辩现场直播演示,评审专家使用Wireshark同步抓包比对,确认特征提取与模型判定逻辑完全匹配。
本文还有配套的精品资源,点击获取