GNU/Linux 下使用天翼校园宽带(汇总)

1,080 views
Skip to first unread message

wzyboy

unread,
Oct 7, 2013, 12:37:05 PM10/7/13
to ustc...@googlegroups.com
此封邮件是之前在 USTC LUG 邮件列表里出现过的四个主题的汇总:

《求助:USTC 某同学做的电信天翼宽带 PPPoE CHAP 认证补丁》
《天翼客户端上网wifi分享》
《校园天翼如何共享wifi》
《(from shlug) 关于 Linux 上使用天翼宽带》

整个邮件比较冗长,但是我已经尽量写得条理清晰了……

背景

天翼校园宽带是中国电信在江苏省等省份大学校园中推出的宽带上网产品,主要在宿舍中提供 FTTH 接入,认证方式为 PPPoE。部分地区另提供无线以太网接入(网页认证),在此只讨论有线接入(PPPoE)。

最早在天翼校园宽带是可以使用标准 PPPoE 方式拨号上网的,从2011年开始,各城市的中国电信分公司开始推行新的套餐以及新的政策,苏州电信和南京电信最早(2011年)推行「天翼校园客户端」,这是中国电信推出的专有拨号软件,与曾经臭名昭著的「星空极速」是一类货色。常州、镇江、宿迁等城市的中国电信分公司随后(2012年春)也开始推行「天翼校园客户端」。

被绑定了「天翼校园客户端」的账号,必须使用客户端登录,无法使用一般的 PPPoE 客户端登录。该客户端一开始仅能运行于 Windows XP, Vista, 7。后来陆续推出了 Windows 8 版本、OS X 版本。至今该客户端仍不能运行于 Windows 8.1 和 GNU/Linux 操作系统。

该客户端(以 Windows 版本为例)主要功能如下:

1. 通过 netfilter.sys 驱动对常规 PPPoE CHAP 的数据包进行修改,使用其专有的算法,完成认证过程。
2. 通过破坏 Windows 无线以太网驱动监视进程列表搜寻常见网络分享软件(如检测到运行了分享软件,则退出客户端)等方式,阻止用户分享网络给其他设备。
3. 显示广告。

对策

由于 Windows 8 / 8.1 用户、OS X 用户、GNU/Linux 用户的上网需求,以及通过路由器分享网络的需求存在,不少人开始研究如何不用「天翼校园客户端」使用天翼校园宽带。

曾经出现过的一些方案或思路如下,它们各有缺点,有的太麻烦,有的已失效,有的局限性太大:

1. 安装一台 Windows 虚拟机,安装「天翼校园客户端」,然后再通过网桥和 NAT,宿主机通过虚拟机上网。——由于新版「天翼校园客户端」会破坏 NAT,该方法已失效。
2. 安装一块额外的物理网卡,配以交换机,组建小型局域网分享网络。——有人尝试过,但是没成功,会被检测出。
3. 使用一些比较冷门的 WiFi 分享软件,避过「天翼校园客户端」的检测。——的确有人报告成功,但随时可能失效。
4. 使用 ccProxy 等软件,通过 Socks 代理的方式分享网络。——这样分享的网络 OSI 层级太高,并不是所有的设备、软件都能使用。

以上的方法都有一个共有的缺点:依旧要使用到 Windows 客户端,如果 GNU/Linux 用户买不起额外的 Windows 笔记本电脑,或是没有愿意合作的 Windows 用户舍友的话,依然没法上网。。。


直到有一位用户名为 yousong 的同学(USTC LUG 成员)成功地破解了天翼校园客户端的 PPPoE CHAP 算法,制作出了修改版的 pppd。他将修改版的 pppd 移植进了 OpenWrt,刷进路由器放在淘宝上卖,随后被苏州、郑州等多地淘宝卖家复制了 OpenWrt 固件,刷进了别的路由器,批量生产和出售。。。从此,淘宝上出现了很多卖 OpenWrt 路由器的商家。。。但他们全都是复制(抄袭?)了 yousong 研究成果,自己并没有掌握天翼 PPPoE CHAP 的算法。

于是,2013年9月,「天翼校园客户端」更新之后,所有装了改版 pppd 的OpenWrt 路由器全部不能用了……(论掌握核心技术的重要性)

分析

通过对改版 pppd 和 netfilter.sys 的一些分析,我得出并验证了如下结论:

1. 「天翼校园客户端」的 CHAP 认证(以下简称「天翼 CHAP」)在计算 Response 的 Value 的时候,对用户名有修改,旧版是在用户名前面加 ^~1 这三个字符,新版是加 ^~2 这三个字符。但是普通 PPPoE 客户端直接修改用户名也是无法通过天翼 CHAP 认证的,还需要有其他的认证信息(这一部分据说是使用了锐捷的算法)。这一点与当年的「互联星空」不同,「互联星空」只要改改用户名就能用普通 PPPoE 拨号了。。。
2. 「天翼校园客户端」虽然改了 Response 的 Value 部分,但是 Name 部分却是不修改的,依然是手机号。事实上,服务端对 Name 部分的处理是只取最后 11 位(手机号的长度),而无视其前缀。
3. 天翼 CHAP 的服务端会根据是否有 ^~1 或 ^~2 来检测客户端版本。用原版 pppd 去登录的时候,提示 invalid client。在算法更新之后,在用户名前面加上 ^~1 去登录,得到 client version error 错误,在用户名前面加上 ^~2 去登录,才是 Passwd_Err 错误。

关于 netfilter.sys 对用户名的修改,我收集了「天翼校园客户端」的三个版本,在虚拟机中安装并复制了其中的 netfilter.sys 文件,简单地 grep 了一下,结果如下:

$ grep -RPao '\^~.' dialmanager-201*
dialmanager-20120203/winxp/netfilter.sys:^~1
dialmanager-20120203/win7x64/netfilter.sys:^~1
dialmanager-20120203/vista/netfilter.sys:^~1
dialmanager-20120203/vistax64/netfilter.sys:^~1
dialmanager-20120203/win7/netfilter.sys:^~1
dialmanager-20120402/winxp/netfilter.sys:^~1
dialmanager-20120402/win8x64/netfilter.sys:^~1
dialmanager-20120402/win7x64/netfilter.sys:^~1
dialmanager-20120402/win8/netfilter.sys:^~1
dialmanager-20120402/vista/netfilter.sys:^~1
dialmanager-20120402/vistax64/netfilter.sys:^~1
dialmanager-20120402/win7/netfilter.sys:^~1
dialmanager-20130904/winxp/netfilter.sys:^~2
dialmanager-20130904/win8x64/netfilter.sys:^~2
dialmanager-20130904/win7x64/netfilter.sys:^~2
dialmanager-20130904/win8/netfilter.sys:^~2
dialmanager-20130904/vista/netfilter.sys:^~2
dialmanager-20130904/vistax64/netfilter.sys:^~2
dialmanager-20130904/win7/netfilter.sys:^~2

可以清晰地看出,20120203 和 20120402 的两个版本能搜索到 ^~1 这个字符串,而 20130904 的版本中,^~1 变成了 ^~2。

那么,用 Hex 编辑器将 yousong 版 pppd 中的 ^~1 (5E 7E 31) 换成 ^~2 (5E 7E 32) 是否就可以通过新版天翼 CHAP 认证了呢?答案是不一定。经各地网友测试,直接将 ^~1 换成 ^~2 的话,在苏州电信和南京电信是可以继续用的,但是在常州电信和宿迁电信却是 Passwd_Err。一种可能的推断是新版天翼 CHAP 认证每个城市的算法不同,而苏州和南京恰好可以继续用一代算法。

于是,在有大神破解之前,二代天翼 CHAP 算法依然保持「无一般解」的状态

漏洞

首先再次声明,我研究不用客户端使用天翼校园宽带的目的纯粹是为了能在 GNU/Linux 下上网。在折腾各种技术解决方案之前,也试过行政手段,但是从市级电信到省级电信再到工信部,一级级地投诉了,前后折腾了几个月,最后工信部下了调解书,但是地方电信依然不肯解绑客户端,所以才会坚定不移地去折腾不用客户端上网的方法。

在2013年9月电信更新「天翼校园客户端」之前,我本来已经通过 yousong 版 pppd 能正常上网了,但是电信更新算法之后,yousong 版 pppd 就变成 client version error 了,而新版算法各城市有区别,所以苏州和南京的用户只要把 ^~1 改成 ^~2 就能继续使用了,而我在常州上学,修改了之后得到的只有 Passwd_Err 错误。

就在我为这一事情发愁的时候,放国庆了……在家里还是能上网的。在国庆的七天假里,我无意中得知了天翼校园宽带的一个「漏洞」:有些地区的天翼校园宽带只需修改一下用户名就能用 PAP 进行登录!

PPPoE 的认证方式远不止 CHAP 这一种。PAP 是早期使用的一种明文认证方式,这种方式在现在一般是作为「最后一条路」去尝试的,即认证方不支持(或拒绝)其他所有更安全的认证方式之后,才会去使用不安全的 PAP 认证。

这一漏洞并不是全江苏省适用的,而是仅在部分地区有效。目前测得南京、苏州、常州可使用该漏洞,而镇江、宿迁则是禁止 PAP 认证的。

该漏洞的使用方法也很简单,使用标准 PPPoE 拨号的时候,配置客户端拒绝掉 PAP 以外的认证方式,比如 CHAP, MS-CHAP, EAP 之类的,只保留 PAP 方式,然后在用户名(手机号)前面加上前缀(曾经是 ^~1,现在应该加 ^~2),然后就可以拨号成功了。对于 GNU/Linux 用户来说,也就是在 /etc/ppp/options (全局,所有 PPP 连接)或是 /etc/ppp/peers/some-peer-name (单个 PPP 连接)文件中添加四行选项:

refuse-chap
refuse-mschap
refuse-mschap-v2
refuse-eap

这四个选项禁止 pppd 使用这些认证方式,于是就只能用 PAP 进行认证了。如果你愿意,还可以加上 debugshow-password 两行,观察精彩的明文认证过程……(笑)

再次注意:并不是所有地区的天翼校园宽带认证服务器都支持 PAP 认证!目前已知镇江和宿迁是关闭了 PAP 认证的。

利用这个 PAP 的「漏洞」,可以使 GNU/Linux 电脑免客户端使用天翼校园宽带,而我上学的城市正好有这个漏洞……于是我终于可以泪流满面地在 GNU/Linux 里 PPPoE 拨号上网了……



题外话:这个漏洞并不能用于普通的(原厂固件的)家用路由器,因为一般的家用路由器的 PPPoE 拨号选项不可自定义,默认都用 CHAP 去认证,是会失败的。当然,刷了 OpenWrt / DD-WRT 之类开放的嵌入式 GNU/Linux 发行版就另当别论了……上面的选项一样适用……所以想要分享网络给其他设备的同学,可以动手去折腾路由器了。如果本身就是用的 GNU/Linux 电脑的话,装个 hostapd 也能直接分享网络,前提是网卡要支持 Master 模式。

-- 
wzyboy
Link:
https://wzyboy.im/
Twitter: @wzyboy

Bojie Li

unread,
Oct 7, 2013, 1:14:25 PM10/7/13
to USTC_LUG

Cool!

IMHO,Windows 虚拟机的方案长远看来是比较靠谱的。写一个 Windows 应用程序,实现 IP over USB,从 USB 收到的包送到 raw socket(不存在则新建),从 raw socket 收到的包送给 USB。Linux 那头实现一个虚拟网络设备,与 OpenVPN 不同的是封装后的出站包不是送到网络而是送到 USB(入站包同理)。两个虚拟机各分配一个 USB 接口,两个 USB 口之间物理连接起来。(当然,用虚拟机的共享文件机制代替 USB 也是个好主意)

这个方案仅仅用到了 raw socket,没有添加网络设备,天翼客户端不太可能把 raw socket 禁掉吧。如果怕客户端根据进程名称 “重点防御”,可以修改进程名为随机字符串。

--
-- 来自USTC LUG
请使用gmail订阅,不要灌水。
更多信息more info:http://groups.google.com/group/ustc_lug?hl=en?hl=en
 
---
You received this message because you are subscribed to the Google Groups "USTC_LUG" group.
To unsubscribe from this group and stop receiving emails from it, send an email to ustc_lug+u...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

Bojie Li

unread,
Oct 7, 2013, 2:31:33 PM10/7/13
to USTC_LUG

仔细想了想,用USB还是有点麻烦的。用共享文件系统的办法倒比较简单,在 Linux host 和 Windows VM 之间的共享文件区(挂载 tmpfs)建4个文件,2个一组作为一个方向通信的缓冲区,类似 framebuffer 的双缓冲方式,写满了A就写B,那边读空了A就读B。这样不需要写设备相关代码也不用物理连线,就能得到两条单向管道,性能也不会受到 USB 之类协议的限制。

wzyboy

unread,
Oct 8, 2013, 1:06:37 AM10/8/13
to ustc...@googlegroups.com
的确,256 MiB RAM 就可以流畅运行 Windows XP™ 了。对现代配置的计算机来说,分配 256 MiB RAM 给虚拟机用来上个网也不是特别大的开销。

不过我倒是有个朋友,也是用的 GNU/Linux,不过她的笔记本电脑是上网本,RAM 只有 1GiB 不说了,关键 CPU 还是 Atom 平台的,我查了下,那个型号的 CPU 恰好是不支持虚拟化技术的,所以 VirtualBox 跑起来是纯软件模拟,那个慢啊。。。

-- 
wzyboy
Link:
https://wzyboy.im/
Twitter: @wzyboy


2013/10/8 Bojie Li <boj...@gmail.com>

王子涵

unread,
Oct 16, 2013, 7:43:22 AM10/16/13
to ustc...@googlegroups.com
这个客户端上网只能一个人用吗?宿舍能否共享网络?

wzyboy

unread,
Oct 16, 2013, 8:32:06 AM10/16/13
to ustc...@googlegroups.com
这个客户端的目的就是为了阻止用户分享网络。

-- 
wzyboy
Link:
https://wzyboy.im/
Twitter: @wzyboy


2013/10/16 王子涵 <ustcw...@gmail.com>

Bojie Li

unread,
Oct 16, 2013, 3:57:32 PM10/16/13
to USTC_LUG

试了试,发现这种基于 raw socket 的“用户态 NAT”是不行的,因为 raw socket 不绑定 TCP 端口,收到对方发来的 TCP SYN+ACK 后,操作系统会马上回复 RST,导致对方中断连接。当然,可以把所有 RST 包 drop 掉,但我的目标是让 “VPN server” 不需要管理员权限。

因此还要做得更细,对 TCP 和 UDP 分别生成不同的 socket,用标准的 connect,这就有点像反向代理服务器。

2013-10-8 上午1:14于 "Bojie Li" <boj...@gmail.com>写道:
Reply all
Reply to author
Forward
0 new messages