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