#import "labtemplate.typ": * #show: nudtlabpaper.with(title: "数据包嗅探与伪造实验", author: "程景愉", id: "202302723005", training_type: "无军籍", grade: "2023", major: "网络工程", department: "计算机学院", advisor: "柳林", jobtitle: "教授", lab: "307-208", date: "2026.04.07", header_str: "《网络安全》实验报告", ) #set page(header: [ #set par(spacing: 6pt) #align(center)[#text(size: 11pt)[《网络安全》实验报告]] #v(-0.3em) #line(length: 100%, stroke: (thickness: 1pt)) ],) #outline(title: "目录",depth: 3, indent: 2em) #pagebreak() #outline( title: [图目录], target: figure.where(kind: image), ) #pagebreak() = 实验目的 #para[ 本实验旨在深入理解网络协议栈底层的通信机制,掌握数据包嗅探(Sniffing)与伪造(Spoofing)的关键技术。通过本实验,学员应达到以下目标: ] - 掌握使用 Scapy 库进行快速原型开发,实现自定义协议包的捕获与重构。 - 理解原始套接字(Raw Socket)的工作原理,掌握在 C 语言中手动构造 IP 和 ICMP 报文头的方法。 - 熟悉 libpcap 库的使用,了解 Berkeley Packet Filter (BPF) 过滤语法。 - 深入理解局域网内 ARP 协议与 ICMP 协议的交互逻辑,能够分析并解释嗅探与伪造中的异常现象。 - 掌握在 Docker 虚拟化网络环境下进行网络安全实验的基本流程。 = 实验原理 == 数据包嗅探(Sniffing) #para[ 数据包嗅探是指在不影响网络正常运行的前提下,捕获网络中流动的数据包并进行分析。其技术核心在于将网卡设置为“混杂模式”(Promiscuous Mode),从而使其能够接收所有流经物理链路的帧,而不仅仅是发往本机的帧。 ] - *libpcap & Scapy*: libpcap 是底层捕获库,Scapy 是基于 Python 的高级库。它们通过内核提供的 `AF_PACKET` 套接字直接读取网卡驱动层的原始二进制流。 - *BPF 过滤器*: 使用 BPF 语法(如 `icmp`, `tcp port 23`)在内核态进行报文过滤,大幅减少了用户态处理不必要数据的开销。 == 数据包伪造(Spoofing) #para[ 伪造技术允许攻击者构造并发送具有任意首部字段(如源 IP、校验和等)的数据包。 ] - *IP_HDRINCL*: 在使用原始套接字时,通过设置 `IP_HDRINCL` 选项,告知操作系统协议栈不要自动填充 IP 头部,而是由应用程序自行构造。 - *Checksum 计算*: 传输层和网络层协议通常要求对头部和数据进行校验。计算方法为将数据按 16 位求和并取反,这是确保伪造包被受害者接受的关键。 == ARP 与嗅探的交互 #para[ 在以太网局域网中,ICMP 通信依赖于 ARP 地址解析。如果目标 IP 在本地子网内但物理地址(MAC)未知,发送方必须先进行 ARP 广播。若 ARP 失败,则后续的 ICMP 包无法被构造和发出,这对“嗅探并回复”类的攻击构成了逻辑约束。 ] = 实验环境 == 实验平台 #align(center)[#table( columns: (auto, auto), rows:(2em, 2em, 2em), inset: 10pt, align: horizon+center, table.header([*硬件/软件*], [*详细配置*]), "物理机", "ThinkPad T14 Gen4", "操作系统", "CachyOS (Linux kernel 6.x)", "虚拟化环境", "Docker Engine 24.x & Docker Compose", "实验镜像", "SEED-Ubuntu 20.04 (handsonsecurity/seed-server)", )] == 网络拓扑与部署 #para[ 本实验通过 Docker 创建了一个 `net-10.9.0.0/24` 的独立网络。攻击者(Attacker)容器运行在 `host` 网络模式下,可以直接访问宿主机的虚拟网桥接口(如 `br-c031fbf1a197`),从而监听整个实验网络的流量。 ] #figure( image("dockerps.png", width: 90%), caption: [使用 Docker Compose 部署的实验环境状态], ) = 实验步骤及结果 == 任务集 1:使用 Scapy 进行嗅探与伪造 === 任务 1.1A:权限与基础嗅探 #para[ 编写 `sniffer.py`。关键逻辑是调用 `sniff()` 函数并指定接口名。由于涉及原始套接字操作,必须使用 `root` 权限。 ] #figure( image("task1.1a_root.png", width: 85%), caption: [Root 权限下成功捕获 Host B 发往 Host A 的 ICMP 包], ) #para[ *权限对比*:不带 `sudo` 运行时,内核拒绝创建套接字,抛出 `PermissionError`。 ] #figure( image("task1.1a_user.png", width: 85%), caption: [非特权用户运行失败截图], ) === 任务 1.1B:BPF 过滤器应用 #para[ 通过设置复杂的 BPF 字符串,实现精准捕获。例如 `tcp and src host 10.9.0.6 and dst port 23` 专门针对 Telnet 握手包。 ] #figure( image("task1.1b_tcp.png", width: 85%), caption: [精准捕获来自 10.9.0.6 的 TCP 端口 23 连接请求], ) #figure( image("task1.1b_subnet.png", width: 85%), caption: [捕获整个 10.9.0.0/24 网段的 ARP 解析过程], ) === 任务 1.2 & 1.3:伪造报文与 Traceroute #para[ 伪造包的核心在于重载的 `/` 运算符:`IP(src='1.2.3.4')/ICMP()`。Traceroute 则是通过步进增加 `ttl` 字段。 ] #figure( image("task1.2_result.png", width: 85%), caption: [验证伪造:嗅探器显示源 IP 为 1.2.3.4 的报文], ) #figure( image("task1.3_result.png", width: 85%), caption: [自定义 Traceroute 成功探测到外部多跳节点], ) === 任务 1.4:嗅探与伪造结合 #para[ 该任务实现了“反应式伪造”。实验中对 `10.9.0.99` 的 Ping 失败,证实了 ARP 解析是局域网嗅探攻击的前提条件。而对 `1.2.3.4` 的成功伪造则展示了跨网段通信中网关转发的特性。 ] #figure( image("task1.4_result.png", width: 85%), caption: [嗅探并回复程序对不同类型目标的处理结果], ) == 任务集 2:使用 C 语言进行嗅探与伪造 === 任务 2.1:基于 libpcap 的嗅探 #para[ C 代码中,通过 `pcap_open_live` 捕获数据。相比 Python,C 语言需要手动偏移指针来跳过以太网头部(14 字节)以获取 IP 包。 ] #figure( image("task2.1_result.png", width: 85%), caption: [C 语言嗅探程序捕获 ICMP 原始数据], ) === 任务 2.2:基于 Raw Socket 的伪造 #para[ 在 `spoofer.c` 中,手动构造了 `struct iphdr` 和 `struct icmphdr`。注意校验和计算前必须将对应字段置 0,否则结果将错误。 ] #figure( image("task2.2_result_c.png", width: 85%), caption: [C 语言程序成功通过 Raw Socket 发出伪造 IP 报文], ) === 任务 2.3:综合实现 #para[ 这是实验中最具挑战性的部分。程序在监听到 ICMP Echo Request 时,实时提取其 ID 和 Sequence,原样封装进伪造的 Echo Reply 中发回。 ] #figure( image("task2.3_result_c.png", width: 85%), caption: [C 语言综合程序:实现对 ICMP 请求的实时伪造响应], ) = 实验总结 #para[ 本次实验在 *ThinkPad T14 Gen4* 物理机上圆满完成。实验不仅巩固了对 Scapy 和 C 语言网络编程的理解,更通过对 ARP 和网关机制的分析,揭示了网络攻击与防御中协议层级间的依赖关系。Scapy 的灵活性极大提高了实验效率,而 C 语言实现则让我对报文校验和(Checksum)及内存对齐等底层细节有了深刻认知。这为后续学习防火墙原理及入侵检测系统打下了坚实基础。 ]