介绍
在这个实验中,你将学习如何使用 Scapy(一个强大的基于 Python 的数据包操作工具)来伪造网络数据包。你将探索如何制作和发送自定义 TCP 数据包的实用技术,并使用 Wireshark 分析结果。
本实验涵盖了关键步骤,包括 Scapy 的安装、Python 虚拟环境的设置以及数据包伪造操作。通过实践操作,你将深入了解网络流量操纵和安全测试方法。
安装 Scapy
在这一步中,你将安装 Scapy,它是一个强大的基于 Python 的交互式数据包操作工具,用于网络分析和安全测试。Scapy 允许你精细地制作、发送和捕获网络数据包。可以把它想象成网络数据包的“瑞士军刀”——你可以构建任何你需要的网络数据包。
在开始之前,确保你处于正确的工作目录。~/project 目录将是我们进行所有操作的地方:
cd ~/project
现在,我们将使用 Python 的包管理器 pip 来安装 Scapy。pip 就像是 Python 包的应用商店,它从 Python 包索引(PyPI)下载并安装软件:
pip install scapy
安装完成后,最好验证一下是否一切都安装正确。我们可以通过检查 Scapy 的版本号来完成这一步。这既能确认 Scapy 已安装,也能确认 Python 可以成功导入它:
python -c "import scapy; print(scapy.__version__)"
你应该会看到类似这样的输出(你的版本号可能会略有不同):
2.4.5
最后,让我们测试一下 Scapy 的交互式模式。这就像是一个“游乐场”,你可以在编写完整脚本之前先尝试数据包制作。要进入交互式 shell:
python -m scapy
当你看到 Scapy 的命令提示符 (>>>) 时,就说明它正常工作了。当你准备离开交互式 shell 时,可以输入 exit()。现在不用着急去探索它,我们将在后续步骤中介绍交互式功能。
设置 Python 环境
在这一步中,你将使用 Python 的虚拟环境为你的 Scapy 实验创建一个专用的工作空间。可以把这想象成搭建一个“洁净室”,你可以在其中工作而不会影响计算机上的其他项目。虚拟环境有助于管理包版本,并防止不同 Python 项目之间发生冲突。
首先,确保你从正确的位置开始。以下命令会导航到我们将设置项目的默认工作目录:
cd ~/project现在,我们将创建一个名为
scapy-env的虚拟环境。这将创建一个新文件夹,其中包含隔离环境所需的所有 Python 文件:python -m venv scapy-env要开始使用新环境,我们需要激活它。激活后,你会在终端提示符的开头看到
(scapy-env),它会提醒你正在使用哪个环境:source scapy-env/bin/activate即使你的系统上可能已经安装了 Scapy,我们还是要为这个环境专门安装它。这能确保我们拥有这个项目所需的确切版本:
pip install scapy让我们验证一下一切是否都已正确设置。以下命令会显示我们虚拟环境中安装的所有 Python 包。你应该会在列表中看到
scapy,这就确认它已可以使用:pip list当你完成工作后(不过现在先不要运行此命令,因为我们将在后续步骤中使用这个环境),你可以停用虚拟环境,回到正常的系统 Python:
deactivate
构建 TCP 数据包
在这一步中,你将使用 Scapy 来创建一个基本的 TCP 数据包。了解如何构建网络数据包对于网络分析和安全测试至关重要。我们将逐层构建一个 TCP 数据包,这模拟了真实网络通信的工作方式。
首先,确保你位于正确的目录,并且你的虚拟环境已激活。虚拟环境可以隔离你的 Python 包:
cd ~/project source scapy-env/bin/activate创建一个名为
craft_tcp.py的新 Python 脚本。我们将使用 nano 文本编辑器,但你可以使用任何你喜欢的编辑器:nano craft_tcp.py添加以下代码来创建一个简单的 TCP 数据包。让我们来分析一下每个部分的作用:
- IP 层定义源地址和目标地址
- TCP 层指定端口和连接标志(在这种情况下是 SYN)
/运算符将这些层组合成一个完整的数据包
from scapy.all import * ## Create IP layer ip = IP(src="192.168.1.100", dst="192.168.1.1") ## Create TCP layer tcp = TCP(sport=1234, dport=80, flags="S") ## SYN packet ## Combine layers to create packet packet = ip/tcp ## Display packet details packet.show()保存文件(在 nano 中按 Ctrl+O,回车,Ctrl+X)并运行它。
.show()方法将显示数据包的结构:python craft_tcp.py你应该会看到类似以下的输出,显示了数据包的所有字段。注意 Scapy 如何自动填充一些值,而其他值仍为 None(发送时会计算这些值):
###[ IP ]### version= 4 ihl= None tos= 0x0 len= None id= 1 flags= frag= 0 ttl= 64 proto= tcp chksum= None src= 192.168.1.100 dst= 192.168.1.1 \options\ ###[ TCP ]### sport= 1234 dport= http seq= 0 ack= 0 dataofs= None reserved= 0 flags= S window= 8192 chksum= None urgptr= 0 options= []
发送伪造数据包
在这一步中,你将修改 TCP 数据包脚本,以发送带有伪造源 IP 地址的数据包。这展示了攻击者如何在网络通信中隐藏自己的来源。伪造(Spoofing)是一种常见的技术,发送者会故意伪造 IP 数据包中的源地址,以隐藏自己的身份或冒充其他系统。
首先,确保你位于正确的目录,并且你的虚拟环境已激活。虚拟环境会为这个项目隔离你的 Python 包:
cd ~/project source scapy-env/bin/activate创建一个名为
send_spoofed.py的新 Python 脚本。我们将使用 nano 文本编辑器,它对初学者来说很简单:nano send_spoofed.py添加以下代码来发送伪造的 TCP 数据包。该代码会在私有范围(192.168.x.x 和 10.x.x.x)内生成随机 IP 地址,这些地址用于测试是安全的。TCP 数据包会以 SYN 标志发送到 Google 的 DNS 服务器(8.8.8.8)的 53 端口:
from scapy.all import * import random ## Spoofed source IP (using private IP range) spoofed_ip = f"192.168.{random.randint(1,254)}.{random.randint(1,254)}" ## Create and send packet packet = IP(src=spoofed_ip, dst="8.8.8.8")/TCP(dport=53, flags="S") send(packet, verbose=False) print(f"Sent spoofed TCP packet from {spoofed_ip} to 8.8.8.8")保存文件(在 nano 中按 Ctrl+O,回车,Ctrl+X)并运行它。脚本将生成并发送一个伪造的数据包:
python send_spoofed.py你应该会看到类似以下的输出,显示生成的伪造源 IP:
Sent spoofed TCP packet from 192.168.45.123 to 8.8.8.8要发送多个数据包并查看不同的伪造 IP 生效情况,修改脚本以包含一个循环。这将从 10.x.x.x 范围发送 3 个带有不同随机源 IP 的数据包:
for i in range(3): spoofed_ip = f"10.0.{random.randint(1,254)}.{random.randint(1,254)}" packet = IP(src=spoofed_ip, dst="8.8.8.8")/TCP(dport=53, flags="S") send(packet, verbose=False) print(f"Sent packet {i+1} from {spoofed_ip}")
使用 Wireshark 验证
在这一步中,你将使用 Wireshark 来验证你在上一步中发送的伪造数据包。Wireshark 是一款强大的网络协议分析器,它允许你实时捕获和检查网络流量。这个验证过程至关重要,因为它能帮助你确认你的伪造数据包是否真的以修改后的源 IP 地址在网络上传输。
首先,确保你位于正确的目录,并且你的虚拟环境已激活。虚拟环境包含了本实验所需的所有 Python 包:
cd ~/project source scapy-env/bin/activate在 LabEx 虚拟机中安装 Wireshark。Wireshark 没有预装,所以我们需要先安装它:
sudo apt-get update sudo apt-get install -y wireshark在后台启动 Wireshark。
&符号允许你在 Wireshark 运行时继续使用终端:wireshark &在 Wireshark 的界面中:
- 选择活动的网络接口(通常是 eth0)——这代表你的网络连接
- 点击鲨鱼鳍图标开始数据包捕获——这将开始记录所有网络流量
- 应用显示过滤器:
tcp.port == 53——这将视图过滤为仅显示 53 端口(DNS 端口)上的 TCP 流量
在另一个终端中,再次运行你的伪造数据包脚本。这将生成新的流量供 Wireshark 捕获:
python send_spoofed.py在 Wireshark 中观察结果:
- 你应该会看到发往 53 端口的 TCP SYN 数据包——这些是连接发起数据包
- 验证源 IP 地址是否与你伪造的 IP 地址匹配——确认伪造操作成功
- 注意 TCP 握手尝试(SYN 数据包)——这些显示了连接尝试
若要保存捕获内容以便后续分析:
- 点击“文件”→“保存”
- 将其保存为
spoofed_capture.pcap,保存路径为~/project——PCAP 文件包含原始数据包数据,可供未来参考
总结
在本实验中,你学习了如何在隔离的 Python 虚拟环境中安装和配置 Scapy 以进行网络数据包操作。这个过程包括设置环境、安装 Scapy,并通过版本检查和交互式测试来验证其功能。
你还获得了实际操作经验,包括构建 TCP 数据包、发送伪造数据包以模拟网络流量,以及使用 Wireshark 分析结果。这些技能为网络安全测试和数据包操作技术奠定了基础。


