我曾经写过一篇关于Scapy
使用的文章,但是那篇文章已经是数年前发布的了。而计算机技术发展是爆炸性的,我在发布那篇文章的时候,我常用的 Python 版本是python 2.7
,而知道我现在发出这篇文章的时候,其最新版已经是python 3.12
了。所以几年没上 CSDN 写文章,今天再次回来,我觉得应该首先先再次写一篇这个 Python 之中最为强大的网络编程第三方库——Scapy
的介绍和使用的文章。
那么,接下来便是最首要的几个问题:
Scapy是一个功能强大且灵活的Python库,用于操作和探索计算机网络中的数据包。它允许用户构建各种类型的网络数据包,并支持多种网络协议,如TCP、UDP、ICMP、ARP等。Scapy不仅可以发送和接收数据包,还可以捕获、修改和解析网络流量,使用户能够深入研究网络通信并进行网络安全测试。
你可以使用Scapy
构建任何形式的数据包,它可以使得你无需使用socket
库进行直接定义一个协议的数据包。后者可能常常使得你构建的数据包标识头错误而导致你的数据包失效,而使用Scapy
可以轻松避免这一点。
在使用Scapy
之前,注意不要忘记使用from scapy.all import *
来导入Scapy
中的函数,当然,你也可以指定你需要的内容,譬如from scapy.all import IP, TCP
。
然而,Scapy
这个库的导入比较特殊,事实上,在你指明要从scapy.all
导入的时候,Python 已经完全初始化并导入了所有的Scapy
函数,所以你可以放心大胆的使用*
这么一个通配符来导入Scapy
。
ack_packet = IP(src=source_ip, dst=target_ip)/TCP(sport=RandShort(), dport=target_port, flags="A")
IP
类指明以下信息:
src
:数据包的来源dst
:数据包的发送目的地址sport
:指明发出该数据包的本地端口,RandShort()
表示使用随机的未占用端口dport
:指明该数据包发送的目标端口flags
:声明该数据包为ACK
数据包事实上,这里面s
或者d
开头的其实就是source(来源)
和destination(目的地)
的单词缩写。
黑客常常将src
设置成一个未知的 IP 地址来伪造攻击源,如果你在进行网络安全测试,你可以将dport
设置为80
或者443
来干扰破坏正常计算机的网络访问,因为我们常常使用80
和443
端口作为HTTP
和HTTPS
协议的出端口。
有趣的是,在我数年前写Scapy
的时候,它似乎还并不能像这样创建ACK
数据包。
arp = ARP()
arp.psrc = selfip
arp.hwsrc = selfmac
arp.pdst = target
arp.op = 2
当然,你也可以这样:
arp = ARP(
psrc=selfip,
hwsrc=selfmac,
pdst=target
op=2
)
这两者是等效的,选择哪一种方式纯粹看个人喜好。前者是先声明ARP
类,随后在设置ARP
数据包的相关参数,后者是直接传入所需的参数,但是结果是相同的。