scapy 介绍
scapy是一个可以让用户发送、侦听和解析并伪装网络报文的python程序。这些功能可以用于制作侦测、扫描和攻击网络的工具。
scapy是一个强大的操纵报文的交互程序。可以伪造或者解析多种协议的报文,还具有发送、捕获、匹配请求和响应这些报文以及更多的功能。
centos 安装scapy
1 2 3 4
| dnf install python3 yum install python3-devel pip install scapy pip install matplotlib pyx cryptography -i https://pypi.tuna.tsinghua.edu.cn/simple
|
运行
生成数据包
1 2 3 4 5 6 7 8 9 10
| # 使用Ether()方法生成一个以太网层数据包 eth_packet = Ether() # 使用IP()方法生成一个网络层数据包 ip_packet = IP() # 使用TCP()方法生成一个tcp数据包 tcp_packet = TCP() # 使用UDP()方法生成一个udp数据包 udp_packet = UDP() # 使用ICMP()方法生成一个udp数据包 icmp_packet = ICMP()
|
查看数据包内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| # 使用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))
|
自定义字段值
定义字段的值有两种方法,一种是在构造时直接传递参数,另一种是在生成后重新赋值;至于参数名即是上一小节中打出的那些项。
1 2 3 4 5 6 7 8 9 10 11 12 13
| # 方法一,在构造时直接传递参数 # 给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))
|
同时自定义多层协议的字段
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| # 构造一个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()函数允许自定义以太网层。
1 2 3
| 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()函数允许自定层数据链路层
1 2
| rec_packet = sr1(IP(dst="10.211.55.2")/ICMP()/"hello world") rec_packet
|
syn扫描
把Flags字段明确指定为SYN
1 2
| 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