#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）及内存对齐等底层细节有了深刻认知。这为后续学习防火墙原理及入侵检测系统打下了坚实基础。
]
