大一刚来学校的时候,就对这个破学校的校园网十分不满,速度又慢价格又高,而且甚至只能同时登录一台设备,想电脑和手机同时联网都只能用电脑开热点,要是再加个平板或者其它设备就更不用说了,使用体验极差,所以从一开始我就对这套系统耿耿于怀。
而学校用的这套校园网系统,居然是自己写的,不知道为什么学校不直接买个锐捷之类的现成的系统,成熟又稳定,非得自己造一个漏洞百出的轮子,这就让很多不怀好意的人(我不是我没有)有了可乘之机。
流量混淆
大一的时候,我为了能让手边的多个设备同时联网,花 50 块钱在闲鱼收了一台 Newifi mini 路由器,用 AP-Client + AP 模式中继校园网,这样只要在路由器上完成校园网认证,其它设备只要连接路由器就可以正常上网了。但是一个最大的问题,所有设备的总网速都被校园网的账号所限制,最高也只有 15M,如果多个设备同时使用必然卡到爆炸,所以有没有办法能突破它的认证呢?
如果使用苹果家的设备连接我们的校园网,就能发现一个很神奇的事情,即使不登录认证校园网,设备依然能收到消息的推送通知,但是点开却加载不出来,而 App Store 这些苹果自家的 App 都能够正常使用,而且甚至没有速度限制,能跑到 100M 的水平,这就很神奇了朋友们。
这套校园网因为是 web 认证,网页端会有一个购买套餐续费的功能,但是你不续费就没有网,没有网就不能续费,这不就死循环了...所以尝试后发现,即使不认证,也是能够正常使用支付宝的(微信表示受到歧视),也就是说 alipay.com
这个域名是在白名单中的,即使不认证也能够连接,使用浏览器测试也能正常打开,而上面苹果自家 App 能正常使用,也是他们放开了 apple.com
相关域名,虽然不知道为什么要放开苹果的域名,但是这就能够让我们搞点事情了,如果把我们的流量全部伪装成访问 apple.com
的流量,是不是就能够饶过系统的限制。
用过 SSR 的朋友们都知道它可以混淆我们的网络流量,所以我用一台之前国外的服务器来测试,混淆插件选择 http_simple
,参数 alipay.com
,简单粗暴,但是居然真的连上了,不限速的 100M 校园网 get。
但是好景不长,第二学期来这个方法就失效了,大概是学校发现了有异常流量,我就没有继续研究下去,直到前段时间,我又想起来这件事,就决定再试试。
校园网不认证依然能够正常访问 alipay.com
,但是为什么混淆不行呢,是不是少了什么东西,翻了一下文档,发现 http_simple
可以自定义几乎完整的 HTTP Header
,那就带上 Header 再试一下。
alipay.com#User-Agent: Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Mobile Safari/537.36\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9\nConnection: keep-alive\nUpgrade-Insecure-Requests: 1
这次参数长了不少,连接试一下,嗯,连上了,100M 校园网再次 get。
但是这依然是有问题的,首先就是延迟,最开始我是用国外的服务器,延迟几百是常事,但是国内的大带宽服务器实在是太贵了,买不起,于是我又盯上了国内的 NAT VPS,这些 VPS 没有公网 IP,靠一台转发机转发内网端口,一般服务商会提供 10 个左右的 10000 以上端口。而且有个好处就是大带宽的同时特别便宜。
换成国内服务器,延迟降到了 60 左右,算是勉强能接受,但是又有了新的问题,UDP 连接似乎炸了,也就意味着游戏这些肯定是连不上了,虽然不知道具体原因,但是我也懒得继续研究下去了。
UDP53 端口
网上还盛传了一种绕过校园网认证的方式,就是通过 UDP53 端口,因为一般来说无线网关会放行 UDP67/68,也就是 DHCP 端口来获取 IP,和 UDP53(DNS 端口)来获取 DNS。但是因为这种方法需要特定端口,我那台 NAT VPS 就没用了,我又没有大带宽的国内 VPS,所以只是尝试一下是否可行。
所以我就找了一台只有 1M 带宽的阿里云 ECS,搭建 SoftEther VPN,然后开启它的 OpenVPN 克隆 Server 功能,在手机上用 OpenVPN 连接,结果自然是能连上的,不过因为带宽太小了所以也没什么用...
订单详情漏洞
大三上学期的时候在学校校园网中心办了一年的校园网,结果下学期因为疫情影响在家呆了半年,校园网中心丝毫不提退钱的事情就算了,来到学校发现我的账号连不上网要重新买???这我就不爽了,非得从它的系统里挑点毛病出来不成。
在校园网的认证页面翻了一会,让我发现了一丝端倪,在查看续费订单详情的页面,它的 URL 是这么一个结构
订单号是直接拼接在 URL 后面的,我就顺手改了一下 URL 后面的数字...没有任何异常,它给我返回了一个我不认识的人的购买订单...
我点开请求,确认它是有验证身份的
但是,最大的问题,它并没有区分用户,只要是一个正常 bearer token,都可以访问任何人的订单信息,而这不是最可怕的,重点是它这个订单详情的请求中,会返回该订单用户的学号、姓名、身份证号、手机号...敏感信息全泄漏完了可还行,甚至还有密码,虽然是 md5 加密的,但是跟没有一样,也就是所有在这套系统里有订单的用户,信息全部泄漏。
JWT 认证漏洞
2020.11.24 更新:今天发现学校校园网更新了,终于把 JWT 换掉了,看起来应该是 AES,所以下面的内容看一乐就好了。
分析认证页面上的几个请求,发现这套系统采用的是 JWT 来认证。
JWT 分为三段,中间用 .
来分隔,类似于这样 aaaa.bbbb.cccc
。
第一部分 Header,一般长这样
{
"alg": "HS256",
"typ": "JWT"
}
其中 alg
表示签名采用的算法,typ
表示 token 的类型,固定为 JWT
,把 JSON 进行 base64 编码后就是第一部分。
第二部分 Payload,用来存放需要传输的数据,也是 base64 编码的 JSON 的形式。
第三部分 Signature,是为了防止前两部分被篡改的签名,通过指定的密钥 (secret)和 Header 中的算法,对 Header 和 Paypoad 按照下面对方法进行加密。
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
your-256-bit-secret
) secret base64 encoded
在认证页面登录之后,会返回这么一个 token,之后的所有操作,都只验证这一个 token。复制 token 粘贴到 JSON Web Tokens 进行解码,结果如下
可以看到 Payload 中,user_name
就是我们的学号,并没有其它用于区分用户的属性,所以,如果我们能伪造这个 token,理论上就可以无需密码登录任何人的账号。但是由于签名的存在,我们直接修改肯定是不行的,除非系统不验证 token 的有效性。
JWT 支持将算法设定为 None
。如果 alg
字段设为 None
,那么签名会被置空,这样任何 token 都是有效的。于是尝试修改算法为 None
,删除 Signature 段,这样 JWT 就只剩两段,发送请求试试,结果报错了,看来这系统还没有草率到连签名都不验证。
那换个思路,如果我能知道他们签名所用的 key,那不就能直接伪造 token 了吗?
如果他们用是弱口令,那么是可以用穷举法跑出来的,使用工具直接尝试暴力破解 JWT cracker。
README 里给了一个样例,MacBook 跑出结果大概用了两秒钟,我测试了一下确实可以。
复制校园网的 token,开跑!
于是...我的 MacBook Pro, CPU 满载跑了三个小时,终于跑出来了,结果确实是校园网使用了一个弱密码来加密,这也才能让我暴力破解出密码来。
拿到密钥,修改一下 Payload 中的数据,编码成 JWT,发送请求,果然成功了,无论任何人的账号,无需密码,直接生成 token 就可以登录。这里我就尝试登录了他们的测试账号:
不但校园网能被别人使用,连个人信息都被泄漏,真的无力吐槽这套系统。到时候我会把这些问题上报给学校老师,希望学校能早日修复这些问题吧。
2 comments
居然用弱口令哈哈哈,看到后面笑死了
大佬,第一种方法愿闻其详.