路由器认证校园网的一个思路

Author Avatar
Damon Lee 8月 09, 2018
  • 在其它设备中阅读本文章

前言

现在办公的地方在大学里,办理宽带的难度基本上跟登天的难度是一样儿一样儿的。

关于在路由器上认证校园网一直是一些高校的坑,毕竟一人一账号,电脑登了,手机不能上,手机登上了,电脑不能上,路由器又不能安装校园网客户端或者进行Web认证,有些路由器可以通过安装插件来实现锐捷认证,可惜这个学校不是锐捷😢。

但是这并不能阻止我要使用路由器进行校园网认证的脚步,手里有个X讯的K2,曾经刷的Padavan系统用来中继,现在家里已经全部换成千兆,淘汰的这个正好可以拿到公司进行愉快的玩(装)耍(X)。有的同学可能说了,你用笔记本分享个热点出来不就好了,或者买个360WiFi或者小米随身WiFi,奈何MacBook不支持一边连接WiFi一边分享热点的功能,有人又说了,你不会买个RJ45转接口啊,我也想买啊,还不是因为穷😂

当然以上都是冠冕堂皇的话,最重要的我需要$$乳才能扶墙啊,虽然App Store花12块就能买个小火箭或者安卓上随便找个客户端也行,但是全程打开确实太费电了,反正路由器要24小时打开,在路由器上挂上$$乳,打开GFW模式,电脑盒子手机就不用再配置代理了,这不是最美的事了吗。

准备工作

一台可以刷OpenWRT的路由器,X讯的K2最合适不过了,刷上Breed后,找个OpenWRT就能开始愉快的玩耍了,因为之前写过shell的脚本用来在MBP上执行实现一键认证,当时就考虑到了路由器上基本都是只集成了ash,所以特意考虑了下语法,这样就能方便今天的迁移,夸一下自己,谁让我这么未雨绸缪。关于刷Breed我就不多说了,因为网上教程太多太简单,刷好之后刷固件就变成了傻瓜操作,根本不用操心变砖的事。

Show Time

首先就是使用抓包工具,Web认证的话Chrome足矣,如果是客户端,可以尝试Charles和Fiddler。

  • 打开Chrome,进入认证的网页,输入你的认证账号和密码,但是不要点认证或者登陆按钮,这时打开开发者工具视图,选择Network节点,勾上Preserve log


  • 然后点击认证或者登陆,出现下图。


  • 右键选中第一项最可疑的链接,然后Copy,再Copy as cURL,最后粘贴到记事本。


  • 得到下面的内容,就可以搜寻你认为可疑的内容了,然后你要做的就是动态改变需要的参数就可以。

    1
    curl 'http://x.x.x.x/Login?para=abcdefghijklmnopqrstuvwxyz==&_=1533804052510' -H 'Pragma: no-cache' -H 'Accept-Encoding: gzip, deflate' -H 'Accept-Language: zh-CN,zh;q=0.9,und;q=0.8,en;q=0.7,zh-TW;q=0.6' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36' -H 'Accept: */*' -H 'Referer: http://10.0.0.253/Index.jsp?hwid=00:00:00:00:00:00&devip=10.0.0.252&devport=0&vlan=0' -H 'Cookie: JSESSIONID=57516FB172738FCEA999C2526AED0F5D' -H 'Connection: keep-alive' -H 'Cache-Control: no-cache' --compressed

    比如para后面的文本(我已经替换成了abcd…xyz),很明显这个就是你账号密码生成的参数,紧接着的自然就是毫秒时间戳了(眼尖的你一定看出来了),再有一个就是Cookie中的JSESSIONID了,para可以记录下,时间戳可以自己生成,但是JSESSIONID只能通过在线获取了,怎么获取到JSESSIONID呢?当然是curl大法。

  • 首先通过ssh以root身份连接到OpenWRT中,然后安装curl,毕竟K2的闪存很小,所以很多东西需要自己安装,之所以选择OpenWRT就是因为自带了opkg管理器,可以免去小白重新编译固件去集成curl的步骤,登录后分别执行下面的命令:

    1
    opkg update
    1
    opkg install curl
  • 下面就是我整理的获取Cookie中某个key中的value的方法,很明显,这个就是通过curl模拟打开认证的网页,然后获取Set-Cookie的值再打印出来

    1
    2
    3
    #! /bin/sh
    session=$(curl -sI http://x.x.x.x/Index.jsp\?hwid=00:00:00:00:00:00\&devip=10.0.0.252\&devport=0\&vlan=0 | tr -d '\r' | sed -En 's/^Set-Cookie: (.*)/\1/p')
    echo $session
  • 你得到的值可能是下面这样的

    1
    JSESSIONID=E9CDB31EB128580EAB7FCF0C6A3D2AA4; Path=/

    但是你只需要分号以前的内容,这时候只有通过shell去取子串就可以了,然后就有了下面的内容:

    1
    2
    3
    4
    5
    #! /bin/sh
    session=$(curl -sI http://x.x.x.x/Index.jsp\?hwid=00:00:00:00:00:00\&devip=10.0.0.252\&devport=0\&vlan=0 | tr -d '\r' | sed -En 's/^Set-Cookie: (.*)/\1/p')
    echo $session
    string=$(echo ${session%; Path=/*})
    echo $string
  • 接下来是最简单的时间戳获取了,我已经准备好了,内容如下:

    1
    2
    3
    4
    5
    #! /bin/sh
    timeStamp=`date +%s`
    echo $timeStamp
    currentTimeStamp=$((timeStamp*1000))
    echo $currentTimeStamp

    上面的脚本就可以打印当前时间戳了。

  • 最后需要的就是拼接参数了,也就是上面获取的JSESSIONID,然后就有了下面的内容:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #! /bin/sh
    session=$(curl -sI http://10.0.0.253/Index.jsp\?hwid=00:00:00:00:00:00\&devip=10.0.0.252\&devport=0\&vlan=0 | tr -d '\r' | sed -En 's/^Set-Cookie: (.*)/\1/p')
    echo $session
    string=$(echo ${session%; Path=/*})
    echo $string
    param="Cookie: ${string}"
    echo $param
    timeStamp=`date +%s`
    echo $timeStamp
    currentTimeStamp=$((timeStamp*1000))
    echo $currentTimeStamp
    cmd="curl -i 'http://x.x.x.x/Login?para=abcdefghijklmnopqrstuvwxyz==&_=${currentTimeStamp}' -H 'Pragma: no-cache' -H 'Accept-Encoding: gzip, deflate' -H 'Accept-Language: zh-CN,zh;q=0.9,und;q=0.8,en;q=0.7,zh-TW;q=0.6' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36' -H 'Accept: */*' -H 'Referer: http://x.x.x.x/Index.jsp?hwid=00:00:00:00:00:00&devip=10.0.0.252&devport=0&vlan=0' -H 'Connection: keep-alive' -H 'Cache-Control: no-cache' -H '${param}' "
    echo $cmd
    eval "$cmd"

    到这一步,基本上就完成了,你要做的就是把我打的x.x.x.x换成你们学校的ip或者url,当然不同的系统肯定不一样,但是都是大同小异的。把上面的文件保存为portal.sh,在赋予执行权限(不理解为什么执行chmod a+x竟然不管用)。

    1
    chmod 777 portal.sh
  • 下面开始见证奇迹,执行脚本,看能否通过

    1
    sh portal.sh

    我这边打印的结果是:

    1
    <response><success>true</success></response>

    然后我打开百度,此时已经可以打开网页了,不会再弹出认证的网页了,手机和电脑可以愉快的同时在线了,虽然共享带宽,但是足矣了。如果你以为这样的完事了,那你真是Too Young了,我自然是不会每次都手动去执行这个shell,定时任务必须是立马想到的,于是我打开OpenWRT的管理界面,进入定时任务,设置了每天上午8:20和下午13:20自动执行,最最重要的是你还要写个脚本每十分钟去定时curl一下百度,因为校园网是检测固定时间没有网络流量就会断网。

总结

上面的脚本只是一个参考版本,建议大家去改成更完善的shell脚本,其他的校园网都是同理的,如果你实现了这个,其他的基本就没有什么问题了。

搭建$$乳也是非常简单的,有可能违规,就不给大家介绍了,只有网上搜一个适用于OpenWRT的ipk文件,scp到路由器里安装重启就可以在web页面进行设置了。