现在的位置: 首页 > 综合 > 正文

scapy构建icmp/ip报文并攻击

2018年04月12日 ⁄ 综合 ⁄ 共 1996字 ⁄ 字号 评论关闭

   http://www.cnblogs.com/amaoxiaozhu/archive/2011/08/15/2134485.html

同绝大多数的网络协议类库一样,scapy中依旧采取分层的视图来对数据进行管理。

本次的任务,由于是伪装MAC,所以需要调用最底层的Ethernet层,这个层次,上一篇日志已经获取了本机的MAC、路由器的MAC。

只需要伪装的MAC地址,这个由参数传递。

>>> ls(Ether())
WARNING: Mac address to reach destination
not found. Using broadcast.
dst : DestMACField
= 'ff:ff:ff:ff:ff:ff' (None)
src : SourceMACField
= '00:00:00:00:00:00' (None)
type : XShortEnumField
= 0 (0)

ICMP包在协议中的位置是处于一个比较难分的,一直当做是IP扩展层来理解-^-

因此想要发送一个伪装的ICMP,就需要先构筑“下一层”的IP数据报了。

还是来看一下scapy中IP层的内容:

复制代码
>>> ls(IP())
version : BitField
= 4 (4)
ihl : BitField
= None (None)
tos : XByteField
= 0 (0)
len : ShortField
= None (None)
id : ShortField
= 1 (1)
flags : FlagsField
= 0 (0)
frag : BitField
= 0 (0)
ttl : ByteField
= 64 (64)
proto : ByteEnumField
= 0 (0)
chksum : XShortField
= None (None)
src : Emph
= '127.0.0.1' (None)
dst : Emph
= '127.0.0.1' ('127.0.0.1')
options : PacketListField
= [] ([])
复制代码

也正是IP首部的内容-20个字节的内容并不需要我们一一填充——尤其是chksum,当初花了不少时间来弄chksum,后来才发现原来checksum在scapy中是如此简单(代码中会展示出来)

回到IP层,我们现在填充IP

src自然要使用一个伪装的IP了,这个是从参数获取。

dst就是我们要欺骗的目的IP,也是从参数中获取。

type就是1,也就是表明数据报是一个ICMP包。 

在ICMP包中,我们也只需要填充type类型——是请求(1)还是回显(8)

完成了ICMP包,我们加入数据—RAW层,直接使用RAW(‘填充内容')来初始化一个raw包。

复制代码
 1 #! /env/lib python
2 import sys
3 import os
4 from scapy.all import *
5 from usual import *
6 conf.vert = 1
7
8 if __name__ == "__main__":
9 #get hwaddress\ip\gateway and init
10 t_hw = GetMac()
11 t_ip = GetIp()
12 gatemac = GetGateWay(t_ip,t_hw,False)
13 target = '192.168.3.25'
14 fakeip = t_ip
15 fakemac = t_hw
16
17 #parse the input
18 for i in range(1,len(sys.argv)):
19 l = sys.argv[i].split('=')
20 if l[0] == '-t':
21 target = l[1]
22 elif l[0] == '-ip':
23 fakeip = l[1]
24 elif l[0] == '-mac':
25 fakemac = l[1]
26
27 pack_ip = IP(dst = target,src = fakeip,proto = 1)
28 pack_icmp = ICMP(type = 8)
29 pack_ether = Ether(src = fakemac,dst = gatemac,type = 0x0800)
30 #add info
31 info = Raw('ip:'+t_ip+' mac:'+ t_hw +' ')
32 t = str(pack_ether/pack_ip/pack_icmp/info)
33 s = Ether(t)
34 # s.pdfdump("/home/jack13/trade.pdf")
35 sendp(s)
复制代码

 10-15行,调用上一篇日志中的函数获取相应的信息、初始化部分变量

 17-25行,解析输入变量

 27-31行,单独生成各层对象

 32-33行,整合各层对象,同时生成发送包s。(这两行就可以完成checksum的工作)

 35行,      发送伪装数据

运行:

sudo python send7.py -t=192.168.3.62 -ip=192.168.0.1 -mac=00:11:22:33:44:55

包是无法返回的,但是通过wireshark的抓包,我们可以看到一个正确的包被发送。

抱歉!评论已关闭.