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等等统统都支持。

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


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

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

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

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