scapy 介绍

scapy是一个可以让用户发送、侦听和解析并伪装网络报文的python程序。这些功能可以用于制作侦测、扫描和攻击网络的工具。

scapy是一个强大的操纵报文的交互程序。可以伪造或者解析多种协议的报文,还具有发送、捕获、匹配请求和响应这些报文以及更多的功能。

centos 安装scapy

dnf install python3
yum install python3-devel
pip install scapy
pip install matplotlib pyx cryptography -i https://pypi.tuna.tsinghua.edu.cn/simple

运行

scapy

生成数据包

# 使用Ether()方法生成一个以太网层数据包
eth_packet = Ether()
# 使用IP()方法生成一个网络层数据包
ip_packet = IP()
# 使用TCP()方法生成一个tcp数据包
tcp_packet = TCP()
# 使用UDP()方法生成一个udp数据包
udp_packet = UDP()
# 使用ICMP()方法生成一个udp数据包
icmp_packet = ICMP()

查看数据包内容

# 使用IP()方法生成一个tcp数据包
ip_packet = IP()

# 方法一、使用raw()方法查看
raw(ip_packet)

# 方法二、使用hexdump()查看。类似Wireshark
hexdump(ip_packet)

# 方法三、raw()配合协议类查看。最佳
# 查看该数据包以太网层内容(下层内容不层示,上层内容不解析只以load形式展示)
Ether(raw(ip_packet))
# 查看该数据包网络层内容(下层内容不层示,上层内容不解析只以load形式展示)
IP(raw(ip_packet))

自定义字段值

定义字段的值有两种方法,一种是在构造时直接传递参数,另一种是在生成后重新赋值;至于参数名即是上一小节中打出的那些项。

# 方法一,在构造时直接传递参数
# 给src传值10.10.6.92,ttl传值128;字段为字符的以字符串形式传,字段为数值的以数值形式传
ip_packet = IP(src="10.10.6.92",ttl=128)

# 查看数据包各项值,确认src项是否为10.10.6.92,ttl项是否为128
IP(raw(ip_packet))

# 方法二,在生成后重新赋值
# 给src赋值10.10.6.92,ttl赋值128;字段为字符的以字符串形式赋,字段为数值的以数值形式赋
ip_packet.src = "10.10.6.93"
ip_packet.ttl = 200
# 查看数据包各项值,确认src项是否为10.10.6.93,ttl项是否为200
IP(raw(ip_packet))

同时自定义多层协议的字段

# 构造一个IP数据包,源mac设置为"14:98:77:72:7f:6c",源ip设置为"10.10.6.92"
ip_packet = Ether(src="14:98:77:72:7f:6c")/IP(src="10.10.6.92")
# 当前构造函中最低层为Ether
Ether(raw(ip_packet))

# 定义一个TCP数据包,源mac设置为"00:00:00:00:00:11",源ip设置为"10.10.6.92",源端口设置为1234
tcp_packet = Ether(src="14:98:77:72:7f:6c")/IP(src="10.10.6.92")/TCP(sport=1234)
# 当前构造函中最低层为Ether
Ether(raw(tcp_packet))

# 定义一个应用层数据包,应用层内容为"GET / HTTP/1.0\r\n\r\n"
app_packet = IP()/TCP()/"GET / HTTP/1.0\r\n\r\n"
# 当前构造函中最低层为IP
IP(raw(app_packet))

发送和接收数据包

只发送数据包不接收数据包

send()函数允许自定义网络层,sendp()函数允许自定义以太网层。

send(IP(src="172.10.1.2",dst="10.211.55.2")/ICMP())

sendp(Ether()/IP(src="172.10.1.2",dst="10.211.55.2")/ICMP())

虚拟机给物理机发包,网口是bridge100

虚拟机scapy发送成功,抓包捕获该数据包进行确认


发送并接收响应数据包

sr1()函数允许自定义网络层,srp()函数允许自定层数据链路层

rec_packet = sr1(IP(dst="10.211.55.2")/ICMP()/"hello world")
rec_packet

syn扫描

把Flags字段明确指定为SYN

rec_packet = sr1(IP(dst="192.168.0.89")/TCP(dport=80,flags="S"))
rec_packet.show()

参考文章

scapy中文文档

https://www.cnblogs.com/lsdb/p/10496171.html

评论