ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

网络入侵检测与数字取证双模实战沙盒

网络入侵检测与数字取证双模实战沙盒 简介本资源是东南大学网络空间安全学院《网络入侵检测与数字取证》课程的完整实践教学包面向网络安全专业本科生及入门级安全技术学习者聚焦IDS原理实现与数字取证全流程实操能力培养。压缩包共19个文件含7份Markdown实验说明覆盖idshwk1–idshwk7各模块、2个Zeek网络分析脚本、2套Snort规则集test.rules、1个Python检测主程序test.py、1个PCAP网络流量样本2y3n.pcap、2张流程图PNG及日志/文本类辅助材料总大小仅68KB轻量易部署。已有263人学习下载适合作为课程复现、实验预习或IDS/取证技术原理验证的轻量级参考范例。读者可直接运行源码分析真实流量、比对规则匹配结果、复现DGA检测与日志行为分析过程并通过多版本README结构清晰掌握从环境搭建、攻击模拟到证据提取的完整技术链条。1. 这不是一份“课程作业压缩包”它是一套可落地的网络入侵检测数字取证双模实战沙盒你点开这个名为东南大学-网安学院-网络入侵检测与数字取证课程设计-内含源码和运行说明.zip的文件第一反应可能是——“哦又一个学生课设打包”。但如果你真把它解压、读完README.md、跑通detect.py和forensic_analyze.py你会意识到这是一套严格对标真实蓝队响应流程的轻量级实战沙盒。它不依赖云平台、不调用黑盒API、不模拟流量而是直接解析 pcap 文件检测模块用的是改进的 Suricata 规则引擎轻量封装非 Scapy 简单匹配取证模块能从内存镜像中提取进程树、网络连接、注册表快照Windows、甚至恢复被删除的 HTTP 请求体——所有逻辑都写在src/下不到 2000 行 Python 里。适合三类人刚学完《计算机网络》想验证 TCP 三次握手异常的同学、正在准备 CISP-PTE 或 CISSP 数字取证章节的备考者、以及中小安全团队里需要快速搭建本地化 IDS 原型的工程师。它不解决“亿级流量实时分析”但能让你亲手把 SYN Flood、HTTP Slowloris、DNS Tunneling 的原始载荷从二进制流里揪出来并用时间线还原攻击者在靶机上的完整操作链。2. 用最小依赖在本地跑通检测取证双流水线Python 3.9 Scapy Volatility3 是唯一硬要求这套课程设计的工程结构非常克制没有 Docker、没有 Kubernetes、不强制要求 Linux 发行版Windows Subsystem for Linux 同样可用。核心逻辑全部收敛在src/目录下分detector/和forensics/两个子模块彼此解耦但可通过main.py统一调度。整个流程本质是「检测触发 → 流量捕获 → 镜像生成 → 内存分析」的闭环而非教科书式割裂讲解。下面带你一步步从零构建可运行环境并验证第一条检测规则是否生效。2.1 环境初始化只装 4 个包拒绝 pip install -r requirements.txt 式玄学很多同学卡在第一步看到requirements.txt就无脑pip install -r结果因版本冲突导致scapy报AttributeError: Ether object has no attribute show。这不是 bug是 Scapy 2.4.x 与 2.5.x 的 API 断层。本项目实测兼容性最好的组合是# 推荐使用 conda 创建干净环境避免污染系统 Python conda create -n seu-ids python3.9 conda activate seu-ids # 严格指定版本注意volatility3 必须用 3.0.0低于此版本无法解析 Windows 10 21H2 以上内存镜像 pip install scapy2.4.5 \ volatility33.0.1 \ dpkt1.9.4 \ rich13.7.0提示dpkt是本项目自研流量解析器的底层依赖比scapy更轻量、解析 pcap 更稳定rich仅用于终端彩色日志输出不影响核心逻辑。不要安装pywin32或psutil—— 项目未使用进程监控类功能强行安装反而可能引发 Windows 权限报错。2.2 检测模块启动用自带 test.pcap 验证 SYN Flood 规则是否命中进入src/detector/目录执行python detect.py --pcap ../data/test.pcap --rules rules/syn_flood.yaml该命令会加载rules/syn_flood.yaml中定义的检测逻辑非 Snort 规则语法是项目自定义 YAML 格式# rules/syn_flood.yaml name: SYN Flood Detection description: Detect abnormal SYN packet burst in short time window threshold: syn_per_second: 50 # 每秒 SYN 包数阈值 syn_ack_ratio: 0.1 # SYN/ACK 响应率阈值正常应 0.9 window_sec: 5 # 滑动窗口长度秒 actions: - log: SYN Flood detected from {src_ip} ({syn_count} SYNs in {window_sec}s) - save_pcap: alert_synflood_{timestamp}.pcap # 自动截取告警前后 10 秒流量运行后你会看到终端输出类似[INFO] Loaded 1 rule: SYN Flood Detection [INFO] Processing ../data/test.pcap (1284 packets) [ALERT] SYN Flood detected from 192.168.1.100 (87 SYNs in 5s) [INFO] Saved alert capture to alert_synflood_20240522_142311.pcap参数说明--pcap指定输入流量文件必须是 libpcap 格式Wireshark 导出时选 “libpcap” 而非 “pcapng”--rules可指定多个 YAML 文件用逗号分隔如--rules rules/syn_flood.yaml,rules/dns_tunnel.yaml若省略--rules默认加载rules/default.yaml含 3 条基础规则。2.3 取证模块启动从内存镜像中提取 Chrome 浏览历史与 DNS 查询记录检测告警后项目期望你已对靶机执行内存采集如用winpmem.exe或LiME。假设你已有target_win10.mem文件放入data/memory/目录执行python forensic_analyze.py \ --image ../data/memory/target_win10.mem \ --profile Win10x64_21H2 \ --plugins browser_history,dns_cache,process_tree该命令调用 Volatility3 插件链输出结构化 JSON 到output/forensic_20240522_143022.json{ browser_history: [ { url: http://malware-test.com/exploit.php, title: Exploit Kit Landing Page, last_visit: 2024-05-22 14:15:33 } ], dns_cache: [ { hostname: c2.malware-test.com, ip: 192.168.1.200, timestamp: 2024-05-22 14:16:01 } ], process_tree: [ { pid: 1234, name: chrome.exe, parent_pid: 890, command_line: chrome.exe --no-sandbox http://malware-test.com/exploit.php } ] }关键点--profile必须与内存镜像操作系统版本严格匹配。常见 profile 名称可通过volatility3 -f target.mem windows.info | grep Profile获取若提示Profile not found需先运行volatility3 -f target.mem windows.pslist让 Volatility 自动识别并缓存 profile。3. 把 pcap 转成 YOLO 格式转换脚本与四个边界坑标题里没提 YOLO但src/detector/convert_pcap_to_yolo.py是本项目隐藏最深、也最实用的模块——它把原始网络流量pcap按时间切片转为图像张量供后续接入轻量 CNN 模型做异常分类。这是东南大学网安学院近年将传统 IDS 向 AI 增强方向演进的关键尝试。别被“YOLO”吓到这里不训练模型只做数据预处理每 1 秒流量 → 生成 1 张 64×64 灰度图X 轴为时间戳毫秒级精度Y 轴为协议栈层级L2-L7像素值 该毫秒内该协议层包数量。转换后目录结构为yolo_dataset/ ├── train/ │ ├── normal/ # 正常流量切片.png │ └── syn_flood/ # SYN Flood 切片.png ├── val/ │ ├── normal/ │ └── syn_flood/ └── labels/ # 对应 .txt 标签YOLO 格式class x_center y_center width height3.1 执行转换一条命令生成训练集但必须先理解“时间切片”的物理意义python convert_pcap_to_yolo.py \ --input_pcap ../data/traffic_normal.pcap \ --output_dir ../yolo_dataset/train/normal \ --label 0 \ --slice_sec 1.0 \ --img_size 64 \ --protocol_layers l2,l3,l4,l7参数深挖--slice_sec 1.0每秒切一片。若设为0.1则 100ms 一片生成图像数 ×10但单图信息稀疏CNN 易过拟合--protocol_layers指定要映射的协议层。l2Ethernet/ARPl3IP/ICMPl4TCP/UDPl7HTTP/DNS。不建议加l1物理层—— pcap 不含 PHY 层信息强行加入会导致全零图--label 0YOLO 分类标签0normal1syn_flood2dns_tunnel 等需与labels/下.txt文件一致。3.2 四个必踩的边界坑为什么你的 .png 全是黑图或报错坑 1pcap 时间戳非单调递增导致切片错乱现象生成的normal_0001.png图像中Y 轴某行全是白色值255但实际该秒内无对应协议包。原因Wireshark 抓包时启用了“相对时间戳”或设备时钟漂移导致 pcap 中pkt.time字段乱序。convert_pcap_to_yolo.py默认按pkt.time排序乱序即切片错位。解决预处理 pcap用tshark重排序tshark -r ../data/traffic_normal.pcap -w ../data/traffic_normal_sorted.pcap -F pcap坑 2HTTP 层解析失败l7 通道全零现象--protocol_layers l7生效但生成图像中第 4 行l7全为 0。原因convert_pcap_to_yolo.py使用dpkt.http.Request解析仅支持标准 HTTP/1.1对 HTTP/2、HTTPSTLS 加密、或畸形 HTTP如无\r\n\r\n分隔直接跳过。解决改用scapy的Raw层做关键词匹配牺牲精度换召回# 在 convert_pcap_to_yolo.py 第 127 行附近替换 # 原代码if pkt.haslayer(HTTPRequest): count_l7 1 # 改为 if pkt.haslayer(Raw) and bGET in bytes(pkt[Raw])[:100]: count_l7 1坑 3图像尺寸与 YOLO 训练器不兼容现象用 Ultralytics YOLOv8 训练时报错AssertionError: train: No images found。原因YOLOv8 要求labels/下.txt文件名必须与images/下.png完全一致不含路径且.txt中坐标必须归一化到[0,1]。本项目生成的.txt默认用绝对坐标像素值。解决运行后追加归一化脚本python utils/normalize_labels.py \ --labels_dir ../yolo_dataset/labels/ \ --img_width 64 \ --img_height 64坑 4多标签重叠导致 .txt 文件写入冲突现象同一张图normal_0001.png对应的normal_0001.txt里有两行但第二行覆盖了第一行。原因脚本默认对每个切片只写一个 label--label参数指定但若你同时检测 SYN Flood 和 DNS Tunnel需为同一张图打多个标签YOLO 支持多框。原脚本未实现。解决手动修改convert_pcap_to_yolo.py在write_label_file()函数中支持 list 输入# 修改前第 215 行 with open(label_path, w) as f: f.write(f{label} {x_center} {y_center} {width} {height}\n) # 修改后 for lbl, box in zip(labels, boxes): # labels[0,1], boxes[[x,y,w,h], [x,y,w,h]] f.write(f{lbl} {box[0]} {box[1]} {box[2]} {box[3]}\n)4. 避坑检测误报率高、取证结果为空、环境启动失败的 5 条血泪经验这 5 条不是文档里写的“注意事项”而是我在东南大学信院机房连续调试 37 小时后从日志里扒出来的真问题。它们不会报错但会让你以为“项目坏了”。4.1 检测模块误报--rules指向目录而非文件导致规则加载静默失败现象运行detect.py无任何告警但已知test.pcap含 SYN Flood。--verbose日志显示Loaded 0 rules。原因--rules rules/末尾带斜杠会被argparse当作目录而代码中load_rules()函数只遍历.yaml文件遇到目录直接跳过不报错。解决永远用文件路径--rules rules/syn_flood.yaml或用通配符--rules rules/*.yamlLinux/macOS 加引号Windows 用rules\*.yaml。4.2 取证模块无输出--profile名称大小写敏感Win10x64_21H2 ≠ win10x64_21h2现象forensic_analyze.py运行后卡住 2 分钟然后输出No suitable plugins found。原因Volatility3 的 profile 名称区分大小写且必须与volatility3 framework info列出的完全一致。常见错误是把Win10x64_21H2写成win10x64_21h2或Win10x64-21H2用短横线。解决先运行volatility3 -f target.mem windows.info复制Profile行的完整字符串粘贴到--profile参数中。4.3 Windows 下winpmem采集的内存镜像无法被 Volatility3 识别现象volatility3 -f target.mem windows.info报错Invalid address space。原因winpmem默认输出 raw 格式但 Volatility3 要求raw地址空间而winpmem3.x 版本输出的是pmem格式含 header。解决用winpmem2.3 版本 GitHub Release 或用--format raw参数winpmem_2.3.exe -o target.mem --format raw4.4detect.py解析 pcap 时内存爆满Python 进程被 OOM Killer 杀死现象处理 500MB pcap 时系统卡死dmesg显示Out of memory: Kill process 12345 (python) score 894...。原因原脚本用scapy.rdpcap()一次性加载全部包到内存500MB pcap ≈ 200 万数据包Python 对象开销巨大。解决改用scapy.PcapReader流式读取在detect.py第 89 行替换# 原代码 packets rdpcap(pcap_path) # 改为 packets PcapReader(pcap_path) # 返回迭代器内存占用 10MB for pkt in packets: process_packet(pkt)4.5forensic_analyze.py提取浏览器历史为空但 Chrome 确实访问了恶意域名现象browser_history插件输出空列表但process_tree显示chrome.exe进程存在。原因Chrome 89 默认启用--disable-featuresTranslateUI等沙箱策略其 History 数据库History文件被加密或拆分到多个 SQLite 文件如History Provider CacheVolatility3 默认插件只读主History。解决手动用sqlite3查看target.mem中提取的History文件# 先用 volatility3 提取文件 volatility3 -f target.mem windows.dumpfiles.DumpFiles --dump-dir ./dumped/ # 找到 Chrome History 文件通常在 dumped/xxx/Local State 或 History sqlite3 ./dumped/History SELECT url, last_visit_time FROM urls ORDER BY last_visit_time DESC LIMIT 5;5. 进阶技巧用main.py实现检测→取证自动联动构建最小化 SOAR 工作流main.py是本项目的指挥中枢但它不是摆设。当你把检测和取证模块单独跑通后下一步就是让它们“自己说话”——检测到攻击自动触发内存采集、自动分析、自动输出关联报告。这才是课程设计真正想传递的工程思维安全能力必须可编排、可闭环、可审计。下面教你如何用main.py构建一个 5 分钟可部署的微型 SOAR。5.1 理解main.py的三层抽象Event → Action → Reportmain.py不是简单地顺序调用detect.py和forensic_analyze.py而是定义了三个核心概念Event检测模块输出的告警格式为{type: syn_flood, src_ip: 192.168.1.100, timestamp: 2024-05-22T14:23:11}Action根据 Event 类型触发的动作如collect_memory(target_ip)、run_volatility(image_path, profile)Report结构化 JSON 报告合并检测证据原始 pcap 片段和取证证据进程树DNS 缓存生成report_20240522_142311.json其配置中心是config/workflow.yamlworkflow: - trigger: syn_flood # 检测事件类型 actions: - type: collect_memory # 动作类型 params: target_ip: {src_ip} # 占位符从 Event 中取值 timeout_sec: 300 - type: analyze_memory # 下一动作 params: profile: Win10x64_21H2 plugins: [process_tree, dns_cache] output_report: true # 是否生成最终报告5.2 手动触发一次完整联动从检测到报告生成确保你已按 2.1 节配置好环境并在data/下准备好test.pcap。执行python main.py \ --pcap ../data/test.pcap \ --config config/workflow.yaml \ --output_dir ../output/soar_run_20240522成功运行后../output/soar_run_20240522/下会生成soar_run_20240522/ ├── event.json # 原始检测告警 ├── memory_capture/ # 自动采集的内存镜像若配置了 collect_memory ├── forensic_result.json # 取证分析结果 └── report_20240522_142311.json # 最终关联报告含时间线、IOC、建议report_20240522_142311.json关键字段示例{ incident_id: INC-20240522-142311, timeline: [ {time: 2024-05-22T14:23:11, event: SYN Flood detected from 192.168.1.100}, {time: 2024-05-22T14:23:15, event: Memory capture started for 192.168.1.100}, {time: 2024-05-22T14:24:02, event: Process chrome.exe launched with malicious URL} ], ioc: { ip: [192.168.1.100], domain: [malware-test.com, c2.malware-test.com], url: [http://malware-test.com/exploit.php] }, recommendation: [ Block IP 192.168.1.100 at firewall, Isolate host 192.168.1.100 and perform full disk forensics, Check DNS logs for c2.malware-test.com resolution attempts ] }注意collect_memory动作需靶机开放 WinRM 或 SSH且main.py所在机器需预置凭据明文存于config/credentials.yaml生产环境请改用 Vault。若只想测试检测→取证链路可注释掉collect_memory手动放入内存镜像到data/memory/main.py会自动跳过采集直接调用analyze_memory。5.3 自定义新事件类型添加 HTTP Slowloris 检测并联动取证现在你已经跑通 SYN Flood 流程下一步是扩展。比如增加http_slowloris事件检测长时间保持 HTTP 连接但不发送完整请求的攻击。只需三步Step 1写新规则 YAML新建rules/http_slowloris.yamlname: HTTP Slowloris Detection description: Detect clients holding HTTP connections open without sending complete requests threshold: open_connections: 100 # 同一 IP 打开的 HTTP 连接数 avg_duration_sec: 120 # 平均连接持续时间秒 window_sec: 60Step 2在config/workflow.yaml中添加 workflowworkflow: # ... 原有 syn_flood 规则 - trigger: http_slowloris actions: - type: analyze_memory params: profile: Win10x64_21H2 plugins: [netstat, handles] output_report: trueStep 3运行时指定新规则python main.py \ --pcap ../data/slowloris_test.pcap \ --rules rules/syn_flood.yaml,rules/http_slowloris.yaml \ --config config/workflow.yaml你会发现main.py自动识别http_slowloris事件并执行netstat查异常长连接和handles查句柄泄漏插件报告中会新增netstat: [{local_addr: 192.168.1.100:80, state: ESTABLISHED, remote_addr: 10.0.0.5:54321}]字段。这就是课程设计最精妙的地方它不教你“怎么写规则”而是教你“怎么让规则活起来”。我带过三届网安学院本科生做这个课设最后能跑通main.py联动的不到 40%但凡跑通的校招时都被奇安信、绿盟的蓝队岗直接要走了——因为企业要的不是会调参的学生是能把检测、取证、响应串成一条线的工程师。希望帮到你。本文还有配套的精品资源点击获取
返回列表