本文内容仅供学习交流使用,请勿用作任何违法行为。

大一刚来学校的时候,就对这个破学校的校园网十分不满,速度又慢价格又高,而且甚至只能同时登录一台设备,想电脑和手机同时联网都只能用电脑开热点,要是再加个平板或者其它设备就更不用说了,使用体验极差,所以从一开始我就对这套系统耿耿于怀。

而学校用的这套校园网系统,居然是自己写的,不知道为什么学校不直接买个锐捷之类的现成的系统,成熟又稳定,非得自己造一个漏洞百出的轮子,这就让很多不怀好意的人(我不是我没有)有了可乘之机。

流量混淆

大一的时候,我为了能让手边的多个设备同时联网,花 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。

network-2020-07-05-15-49-18

但是这依然是有问题的,首先就是延迟,最开始我是用国外的服务器,延迟几百是常事,但是国内的大带宽服务器实在是太贵了,买不起,于是我又盯上了国内的 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 是这么一个结构

network-2020-07-05-16-14-38

订单号是直接拼接在 URL 后面的,我就顺手改了一下 URL 后面的数字...没有任何异常,它给我返回了一个我不认识的人的购买订单...

我点开请求,确认它是有验证身份的

network-2020-07-05-16-17-45

但是,最大的问题,它并没有区分用户,只要是一个正常 bearer token,都可以访问任何人的订单信息,而这不是最可怕的,重点是它这个订单详情的请求中,会返回该订单用户的学号、姓名、身份证号、手机号...敏感信息全泄漏完了可还行,甚至还有密码,虽然是 md5 加密的,但是跟没有一样,也就是所有在这套系统里有订单的用户,信息全部泄漏。

network-2020-07-05-16-33-29

JWT 认证漏洞

分析认证页面上的几个请求,发现这套系统采用的是 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 进行解码,结果如下

network-2020-07-05-16-54-21

可以看到 Payload 中,user_name 就是我们的学号,并没有其它用于区分用户的属性,所以,如果我们能伪造这个 token,理论上就可以无需密码登录任何人的账号。但是由于签名的存在,我们直接修改肯定是不行的,除非系统不验证 token 的有效性。

JWT 支持将算法设定为 None。如果 alg 字段设为 None,那么签名会被置空,这样任何 token 都是有效的。于是尝试修改算法为 None,删除 Signature 段,这样 JWT 就只剩两段,发送请求试试,结果报错了,看来这系统还没有草率到连签名都不验证。

network-2020-07-05-17-05-08

那换个思路,如果我能知道他们签名所用的 key,那不就能直接伪造 token 了吗?

如果他们用是弱口令,那么是可以用穷举法跑出来的,使用工具直接尝试暴力破解 JWT cracker

README 里给了一个样例,MacBook 跑出结果大概用了两秒钟,我测试了一下确实可以。

network-2020-07-05-17-10-09

复制校园网的 token,开跑!

于是...我的 MacBook Pro, CPU 满载跑了三个小时,终于跑出来了,结果确实是校园网使用了一个弱密码来加密,这也才能让我暴力破解出密码来。

拿到密钥,修改一下 Payload 中的数据,编码成 JWT,发送请求,果然成功了,无论任何人的账号,无需密码,直接生成 token 就可以登录。这里我就尝试登录了他们的测试账号:

network-2020-07-05-17-22-52

不但校园网能被别人使用,连个人信息都被泄漏,真的无力吐槽这套系统。到时候我会把这些问题上报给学校老师,希望学校能早日修复这些问题吧。

Last modification:July 5th, 2020 at 10:53 pm
If you think my article is useful to you, please feel free to appreciate