scapy发送伪装包(1) 获取本机信息

目标:获取本机信息

广告时间:  scapy功能很强大啊。但是基本信息还用不到,使用python简单的获取即可。

发送伪造包,就要从ether层进行发送,不然发送例程调用arp来获取目标mac地址的时候,会把本机真实的mac也放在首部。

简单的看下首部:

>>> ls(Ether)
dst        : DestMACField         = (None)
src        : SourceMACField       = (None)
type       : XShortEnumField      = (0)
dst为目标的首部

src为源mac

type为请求类型

校验码是由驱动来完成。所以此次只需要填充这三个就好了。

1. 第一个要解决的问题就是目标mac了,我使用了一个比较简单的方法,就是直接从route表里面查找默认网关,请求网关的地址------

                        传入参数为本机ip、本机mac地址和是否使用默认写入的网关地址flag。flag为false的话,直接返回一个事先查找好的mac地址。

def GetGateWay(ip,t_hw,flag):
"""
get local gateway
"""
if flag == True:
afile
= os.popen("route")
data
= afile.read()
afile.close()
#the ip of the gateway
p = re.compile(r'default +(([0-9]+\.?){4})')
gateway
= p.findall(data)[0][0]
#send a arp to get the hwaddress
arp = ARP(hwtype = 0x0001,ptype = 0x0800,op = 0x0001,hwsrc = t_hw,psrc = ip,pdst = gateway)
recv
= sr1(ARP(str(arp)))
return recv[0].hwsrc
else:
return 'XX:XX:XX:XX:XX:XX'

   这个方法的缺点就是如果当时的arp请求很少,那么通过arp包就可以反向查找到真实发送端的ip。可以考虑使用sniff等待一个arp查询。

2. 第一个问题解决后,mac首部就剩下本机mac和类型了

      类型直接填入0x0800就好了,

    mac获取可以用流传很广的方法:

#=====================================
#
return a string like xx:xx:xx:xx:xx:xx
#
=====================================
def GetMac():
"""
get the local mathine`s mac address
"""
hwaddress
= uuid.uuid1().hex[-12:]
p
= re.compile(r'([0-9a-fA-F]{2})')
return p.subn(r'\1:',hwaddress)[0][:-1]

这个方法来查本机的真实ip也很容易找到:

    
#=====================================
#
return a string like 192.168.2.1
#
=====================================
def GetIp():
"""
get local ip
"""
return socket.getaddrinfo(socket.gethostname(),None)[-1][4][0]


需求的辅助函数已经完成了,下次就可以开始进行构造了。

posted @ 2011-08-08 09:53  阿毛小猪  阅读(3072)  评论(0编辑  收藏  举报