python模块之scapy模块

ls(*) Ether、IP、ICMP、TCP、UDP、ARP 可查看详细配置参数

1.构建数据包(不同层之间需要用/分隔)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Ether = Ether(src="源MAC地址",dst="目的MAC地址")//以太网层=二层

IP = IP(src="源地址ip",dst="目的ip或者URL") //IP层 = 三层

XY = ICMP()、TCP()、UDP() [都可以用dport=目的端口,sport=源端口]//协议封装在IP层

ARP = ARP(hwsrc='二层源mac',psrc='三层源IP',hwdst='二层目的mac',pdst='三层目的IP')

SJ = padding(load='x'*8) //数据位,填充 x乘8

RandMAC() 任意MAC地址

RandIP() 任意IP地址

构建二层包:(以Ether层开头)
1
2
3
pkt=Ether/IP/ARP

pkt=(Ether(src="源MAC地址",dst="目的MAC地址")/IP(src="源地址ip",dst="目的ip或者URL")/ARP = ARP(hwsrc='二层源mac',psrc='三层源IP',hwdst='二层目的mac',pdst='三层目的IP') )
构建三层包:(以IP层开头)
1
2
3
pkt=IP/XY/SJ

pkt=(IP(src="源地址ip",dst="目的ip或者URL")/TCP(spost=源端口,dpost=目的端口)/padding(load='x'*8))

2.只发送

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
二层:sendp() //给定网卡接口

三层:send() //自动根据路由表进行路由发送

如发二层包:

sendp(pkt,iface="eth0",loop=1,inter=1

参数:

pkt 构建包的变量

iface="eth0" 选择网卡为eth0

loop=1 循环发送

inter=1 每隔1秒发送

timeout=1 超时1秒就丢弃,实际时间看程序处理能力而定

3.发送并返回

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
二层:

srp() //发送包, 返回答复和没有答复的包的数量

srp1() //发送包, 返回只答复或者发送的包的详细信息| .参数,显示这个参数的返回数据

三层:

sr( ) //发送包, 返回答复和没有答复的包的数量
ans,unans =sr(IP(dst="www.baidu.com")/TCP(dport = [22,21,80,445]))

sr1( ) //发送包, 返回只答复或者发送的包的详细信息|.参数,显示这个参数的返回数据
ans,unans =sr1(IP(dst="www.baidu.com")/TCP(dport = [22,21,80,445]))
如二层发收包:

srp1(pkt,timeout=1,verbose=0

参数:

pkt 构建包的变量

timeout=1 超时1秒就丢弃,实际时间看程序处理能力而定

verbose=0 不显示详细信息

4.函数使用

可以用ls()函数来查看scapy支持的网络协议, 可以看到网工们耳熟能详的ARP, BOOTP, Dot1Q, DHCP, DNS, GRE, HSRP, ICMP, IP, NTP, RIP, SNMP, STP, PPPoE, TCP, TFTP, UDP等等统统都支持。

image-20210715142200772

除了ls()外,还可以用lsc()函数来查看scapy的指令集(函数)。比较常用的函数包括arpcachepoison(用于arp毒化攻击,也叫arp欺骗攻击),arping(用于构造一个ARP的who-has包) ,send(用于发3层报文),sendp(用于发2层报文), sniff(用于网络嗅探,类似Wireshark和tcpdump), sr(发送+接收3层报文),srp(发送+接收2层报文)等等。

image-20210715142500326

image-20210715142930305

show(), summary(), nsummary()等方法来查看ans的内容

image-20210715143854885

使用RandShort(), RandNum()和Fuzz()这几个函数来让scapy帮你自动生成一个随机的端口号,通常可以用作sport(源端口号)

image-20210715151538292

如果你想指定scapy生成端口号的范围,可以使用RandNum(),比如你只想在1000-1500这个范围内生成端口号,可以使用RandNum(1000,1500)来指定

image-20210715152715061

fuzz()函数,前面的RandShort()和RandNum()都是写在sport后面的(当然也可以写在dport后面用来随机生成目的端口号),用fuzz()的话则可以省略sport这部分,fuzz()会帮你检测到你漏写了sport,然后帮你随机生成一个sport也就是源端口号

image-20210715153119604