scapy构建icmp/ip报文并攻击
2014-09-07 00:49
274 查看
http://www.cnblogs.com/amaoxiaozhu/archive/2011/08/15/2134485.html
同绝大多数的网络协议类库一样,scapy中依旧采取分层的视图来对数据进行管理。
本次的任务,由于是伪装MAC,所以需要调用最底层的Ethernet层,这个层次,上一篇日志已经获取了本机的MAC、路由器的MAC。
只需要伪装的MAC地址,这个由参数传递。
ICMP包在协议中的位置是处于一个比较难分的,一直当做是IP扩展层来理解-^-
因此想要发送一个伪装的ICMP,就需要先构筑“下一层”的IP数据报了。
还是来看一下scapy中IP层的内容:
也正是IP首部的内容-20个字节的内容并不需要我们一一填充——尤其是chksum,当初花了不少时间来弄chksum,后来才发现原来checksum在scapy中是如此简单(代码中会展示出来)
回到IP层,我们现在填充IP
src自然要使用一个伪装的IP了,这个是从参数获取。
dst就是我们要欺骗的目的IP,也是从参数中获取。
type就是1,也就是表明数据报是一个ICMP包。
在ICMP包中,我们也只需要填充type类型——是请求(1)还是回显(8)
完成了ICMP包,我们加入数据—RAW层,直接使用RAW(‘填充内容')来初始化一个raw包。
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的抓包,我们可以看到一个正确的包被发送。
同绝大多数的网络协议类库一样,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的抓包,我们可以看到一个正确的包被发送。
相关文章推荐
- 利用raw socket结合icmp报文获取本机外网ip
- scapy学习icmp报文
- IP报文及ICMP报文结构原理
- 《TCP/IP具体解释卷2:实现》笔记--ICMP:Internet控制报文协议
- TCP/IP 原理 -- ICMP:因特网控制报文协议
- TCP/IP之ICMP(Internet控制报文协议),Ping程序和Traceroute程序
- TCP,IP详解,卷一:协议学习笔记之第六章 ICMP: Internet控制报文协议
- TCP/IP 第6章 ICMP internet 控制报文协议
- TCP-IP详解卷1-06:ICMP:Internet控制报文协议(Internet Control Message Protocol)
- TCP/IP 学习笔记-ICMP控制报文
- TCP/IP(6)ICMP Internet控制报文协议
- TCP/IP学习笔记之六 --- ICMP: Internet控制报文协议
- 自己动手学TCP/IP--ICMP(ping报文)
- TCP/IP(3.5)—网络控制报文协议ICMP
- TCP/IP详解--ICMP 控制报文和差错报文 && Tracerouter 命令的过程
- 路由器 网关| 公网、内网 | ICMP的IP重定向报文
- IP首部校验和(ICMP报文的校验和)的计算方法
- IP报文及ICMP报文结构原理
- 分片IP报文攻击