Files
nudtns2026spring/Sniffing_Spoofing/main 副本.typ
2026-04-07 20:49:20 +08:00

169 lines
7.3 KiB
Typst
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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.1BBPF 过滤器应用
#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` 捕获数据。相比 PythonC 语言需要手动偏移指针来跳过以太网头部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及内存对齐等底层细节有了深刻认知。这为后续学习防火墙原理及入侵检测系统打下了坚实基础。
]