公寓上网新认证方式破解研究

【分析客户端文件】
客户端有三个文件,一个.exe,一个.pid,一个Skin.7z。最后一个文件里都是皮肤。前两个文件的名字,以及第二个文件的内容都是一串相同的字符串,还不知道有什么意义。

【分析日志】
客户端提供了查看日志功能,这给破解带来了很大方便,软件运行的大致流程日志中一目了然,一些有用的信息也在此暴露:
模块“本机网络配置信息”,检查了本机网卡和活动链接信息,其中注意到一句:“是否支持802.1x:Yes”。说明这套系统很可能会支持802.1x认证协议。这应该不是好消息。
模块“多路路由管理”,检查了本机路由链路信息。
模块“代理软件检测”,检查了本机环境。
模块“PPPoE、L2TP、PPTP拨号认证协议”,取得了一些本机信息。
最后,创建PPPoE拨号连接。之后一条日志:“W117S733B20140928A-RASDial.pppoe”,这行信息在客户端“版本信息”中也能看到。这似乎说明:认证方式是pppoe、调用了系统自带的RASDial工具。这种方式应该是最简单的,只要今后不更换认证方式,破解就一定是有可能的。
还有一条日志:“RASDial Phone Book:C:\Users\YLD\AppData\Local\Temp\Rasphone.pbk” 。百度了一下Rasphone.pbk,没有很详细的信息,但知道它和RASDial有关,保存了一些拨号配置信息。这个文件应该有用。

【分析Rasphone.pbk】
复制出来以纯文本方式打开,里面有很多参数,注意到这个连接的名字叫做[SRun3K专用宽带拨号连接]。
果断百度一下,发现SRun3K是一种叫“深澜”的认证系统。SRun3K在日志中也出现了,不够敏感没有注意到。
进一步百度深澜,发现还有一些高校等地方用这种认证,客户端界面跟我的差不多。看来深澜这家伙每次把Skin.7z里的皮肤图片换一换就大价钱卖给不同的高校了,真是暴利。
之前以为这个系统是学校单独做的,知道了SRun3K,是好消息也是坏消息:好消息是我不是一个人,可以到网上获取有关信息;坏消息是这个系统既然比较通用,那肯定相对成熟,破解不会很容易。
继续看Rasphone.pbk,发现里面有“PhoneNumber=”键,但没有值。现在学校网络还没换好,等换好了肯定要登陆了再来看这个值。不知道是不是这样就能得到真实的账户名,如果是的话就太好了。密码估计不会在这明文保存,不奢求。

【百度与思考】
如果只是想突破Windows下的Wifi共享限制的话,网上找到可用的解决方案应该是不难的。最通用的方法就是把客户端运行在360沙箱里,这个方法据说是好使的。
可是我觉得这样没什么意义,为了上个网,你的电脑要运行360或者其它什么破解用的工具,还要运行分享Wifi用的工具或者操作命令行,还要运行官方客户端,其他所有人的流量都要由你的电脑转发。这么搞很麻烦,而且肯定会影响速度。有这功夫不如去买CMCC,淘宝不贵。
我的目标是像正常一样让一切工作在路由器自动完成。这个目标是有实现可能的:路由器可以运行Linux系统;认证方式是pppoe。
根据破解锐捷,以及百度得到的经验,破解的难点和思路有两处,一是获得pppoe拨号的真实用户名和密码(然后就可以在Linux下不用官方客户端拨号登录) ;二是通过网络抓包了解心跳认证的机制(然后就可以在Linux下模拟发送心跳包保持在线)。
对于前者:我找到的Rasphone.pbk可能有用;网上还有查看Windows事件查看器的方法可以尝试。而且貌似密码是没有经过深度加密的,如果是的话就很难办。
对于后者:之前接触过一些网络嗅探的方法可以用得上;网上可以找到Windows下的SRun3K心跳包发送器,不知道支不支持我的版本,如果直接嗅探客户端没有结论的话,可以试着嗅探这个工具。
好了,一切只等假期网络升级完毕 。

【抓取心跳包】
从网上下载了一个Windows下深澜心跳包发送器。 用Wireshark抓取到了心跳包。
Udp心跳包,每50s,由本机(路由器WAN口)IP的58***端口(53238,58151等),发送到服务器IP(客户端中有写)的3338端口。
分析Udp包内容,共56字节十六进制数据:
前32字节,是原始账号的十六进制ASCII码,不足32字节的后面补十六进制00。
接着17字节,是本机(路由器WAN口)MAC地址(冒号分隔)的十六进制ASCII码。
最后7字节,是十六进制00。

pppoe的真实密码即是原始密码;真实账号的加密方式是,原始账号按ASCII码推移几位,再加上前缀{SRUN}。

如果我们的客户端认证方式和这个一样,那么完美破解就是必然的。
“如何在openwrt下每50s发送特定Udp包”是要研究的问题,网上资料不多。

【拿到路由器实测】

按原来的方法,极路由刷mentohust:
固件下载地址:

 

Winscp上传aaa.bin文件到/tmp目录。

Rutty连接。

指令:
root@Hiwifi:~# cd /tmp
root@Hiwifi:/tmp# ls
root@Hiwifi:/tmp# mtd write aaa.bin firmware
完成后:
root@Hiwifi:/tmp# reboot

在设置向导中pppoe拨号(家里的)。
在软件包管理中安装netcat。
(管理-状态-路由表-活跃ARP是连接的电脑)

Rutty:
# echo 1234567890|nc -u -p7777 192.168.1.238 8888

在192.168.1.238电脑上,用wireshark抓包,能抓到来自192.168.1.1:7777去往192.168.1.238:8888,内容为1234567890的UDP包,后面跟着7字节00。
研究了echo的输出转义。

【openwrt下用netcat发送心跳包】

# echo -e -n '1234567890\0000\0000\0000\0000\0000\0000\00
00\0000\0000\0000\0000\0000\0000\0000\0000\0000\0000\0000\0000\0000\0000\0000AC:
22:0B:00:77:9A\0000\0000\0000\0000\0000\0000\00
00'|nc -u -p49867 192.168.1.238 3338


用wireshark抓包,这个包和心跳包发送器发的包,长度和Data部分完全相同,只有头部不同。UDP协议头部具体我不清楚,不过我觉得这应该不是问题。
怎样发包的问题朝思暮想各处发帖求问了一天,最后拿到路由器尝试着就解决了,非常开心,不需要用到socket编程,也是让石头落了地。

之前主要的难题就是怎样构建包中的00字节。从各种角度思考,最后还是靠man echo解决了。这里也算是第一次真正体会到linux的强大之处,管道“|”,和选项参数的使用可谓巧妙。

接下来就是怎样在linux下每50s执行这段命令的问题。

【实现每50s发送】
先是尝试了crontab计划任务,这段任务可以实现:
*/1 * * * * echo -e -n '1234567890\0000\0000\0000\0000\0000\0000\0000\0000\0000\0000\0000\0000\0000\0000\0000\0000\0000\000\0000\0000\0000\0000AC:22:0B:00:77:9A\0000\0000\0000\0000\0000\0000\0000'|nc -c -u -p49867 192.168.1.238 3338

一开始研究crontab的时候,用wireshark抓包,只能抓到nc发送的第一个包。后来查看openwrt系统日志发现,执行过一次nc后再执行,就会有“Process already running” 错误。研究了很久,最后发现了nc的一个参数"-c",在EOF后关闭。这样问题就解决了!

单纯利用crontab不太好实现精确到1min以内的调用。就想到Linux Shell脚本。研究shell脚本的时候发现openwrt提供了直接写启动脚本的地方,这真是太方便了!于是用shell脚本死循环自启动解决了这个问题:

echo My shell start!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
while true
do
echo -e -n '1234567890\0000\0000\0000\0000\0000\0000\0000\0000\0000\0000\0000\0000\0000\0000\0000\0000\0000\000\0000\0000\0000\0000AC:22:0B:00:77:9A\0000\0000\0000\0000\0000\0000\0000'|nc -c -u -p49867 192.168.1.238 3338
sleep 5
echo KeepAlive Udp sent!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
done
至此,经过三天不懈努力,破解新认证已经理论上完成了!开心!
【总结】
1.获取真实PPPOE账号。
电脑用官方客户端登陆一次。查看Rasphone.pbk,得到真实账号(如果得不到,用此方法:右键我的电脑-管理-事件查看器-windows日志-系统,右侧搜索“来源”为"RasMan"的信息)。
用此账号和密码,尝试用电脑建立新PPPOE连接。如果连接成功,则破解成功一半。

对比真实和原始账号,结合心跳包工具,确定加密方式备用。


2.判断心跳包机制。
不用官方客户端的情况下:
观察是否断网和断网间隔。
打开心跳包工具,观察是否断网和断网间隔,同时用wireshark观察记录心跳包工具发送的包备用。
如果心跳包工具能使不断网,则破解一定成功。


3.结合观察心跳包工具发送的包,编写适用于netcat的心跳包。


4.连接路由器。

5.路由器设置向导中pppoe拨号。

6.(趁没有断网时)在软件包管理中安装netcat。


7.写入自启动脚本。

【实测】

实际账户名里竟然包含回车符。加密可以用技术,但这简直是玩阴的,不开心。

有点气馁,还是没逃过要修改和编译源代码。

【继续】
走上一条不归路,开搞openwrt源代码。

 
 

【编译openwrt】

目标路由器:极路由1S型号HC5661(CPU MT7620A)。


编译环境操作系统:Fedora 20。
安装可能需要的软件包:
sudo yum install gcc
sudo yum install gcc-g++
sudo yum install ncurses-devel
sudo yum install zlib-devel
sudo yum install bison
sudo yum install flex
sudo yum install autoconf
sudo yum install gawk
sudo yum install gettext
sudo yum install patch
sudo yum install subversion
sudo yum install sqlite
sudo yum install git


下载openwrt trunk源码:
svn co svn://svn.openwrt.org/openwrt/trunk


进入目录:
cd trunk


更新软件包:
./scripts/feeds update –a
./scripts/feeds install –a


配置工具:
make defconfig
make menuconfig


配置工具界面选项:
Target System:Ralink RT288x/RT3xxx
Subtarget:MT7620a based boards
集成ncat等软件包。
Ntpclient编译时无法下载,应移除。


{其它修改}


编译:
make V=s


固件保存在/home/trunk/bin/主控芯片系列/目录下,有3个对应不同刷机模式的bin文件。取*factory.bin。

 

编译似乎没有成功,没有生成预想的bin。

【修改配置文件和firefox-firebug方法】
失败。
用winscp,和16进制编辑器修改了/etc/config/network,包含回车后openwrt内部错误。
Firebug的方法,回车及其后内容并没有生效。

 

【唯一的思路】
之前openwrt的编译算是成功了,可以刷。但是不知道为什么都是sysupdate而没有factory。而且肯定也要按那篇文章所说对极路由添加特别支持。这个先不管。
现在知道了负责pppoe拨号的是ppp 2.4,从github上下的版本和openwrt里看到的一样。搞吧。开源万岁。

trunk/dl里有ppp-2.4.7.tar.gz。对这个文件做手脚。慢慢分析源代码吧,只有这样了。


【Take it easy..】

本来研究破解这事完全是凭借兴趣的,并且打算如果成功了会公开方法。结果前几天在学校贴吧发个帖子,说如果我200块钱卖的话有没有人想买,到现在得有50个人左右要买了。我默默的算了一下,如果破解成功了,我至少能赚一万块钱。。。导致我现在拼命研究破解,分不清是为了兴趣还是为了钱了。。这个假期除了吃饭睡觉就在研究这事,心情比较压抑,刚才还感觉眼睛很累不舒服,是时候慢下来了。破解不会放弃还会继续,但是调整心态慢慢来。Android和linux的学习也要继续。
 

【终结--其他人的成功方法】
 贴吧上有人分享了成功方法,看了他提供的方法。
 和我的思路是一样的,和我不同的一处是心跳包发送的实现。他自己写了个client。虽然我也实现了发送心跳包,但自己写一个出来显然更直接,灵活性更强。这一点我差在不会linux网络编程上。
我最后没有完成破解,就差在拨号这一步。我已经知道,为了实现这个拨号,需要修改相关的源代码,但是不知道具体应该去哪里修改,怎么修改。他的方法,修改了ppp.sh这个脚本,只需一句话username=`echo -e "$username"`。
echo的-e参数使得文本支持转义。真是得来全不费工夫。又该赞叹Linux的强大巧妙了。 
我没有想到这个方法的原因,还是对于Linux知识有限吧, 对于路由器ppp拨号的流程不了解,导致找不到下手的地方;对于echo这个命令和Linux的标准输入输出不了解,导致想不到这一句巧妙的代码。

posted @ 2014-12-07 14:49  杨乐达  阅读(9639)  评论(3编辑  收藏  举报