作者:UpSGE

写在前面

本文以 CMCC-EDU 为例,实现自动认证。其他使用 web 认证的网络可以参考。

不想看原理解析,直接跳转到抄作业

抓包

连接网络,进入认证页面 http://192.168.253.6/

打开dev-tools,监听网络连接,输入账号密码认证

查看第一条连接,得到以下信息

alt text

复制为curl,得到(已隐去隐私信息)

curl ^"http://192.168.253.6:801/eportal/?c=Portal^&a=login^&callback=dr1003^&login_method=1^&user_account=^%^2C0^%^2CXXXX^%^40cmcc^&user_password=XXXX^&wlan_user_ip=XXXX^&wlan_user_ipv6=^&wlan_user_mac=XXXX^&wlan_ac_ip=192.168.253.5^&wlan_ac_name=^&jsVersion=3.3.2^&v=7455^" ^
  -H ^"Accept: */*^" ^
  -H ^"Accept-Language: zh-CN,zh;q=0.9,ja;q=0.8^" ^
  -H ^"Connection: keep-alive^" ^
  -H ^"Cookie: PHPSESSID=XXXX^" ^
  -H ^"Referer: http://192.168.253.6/^" ^
  -H ^"User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0^" ^
  --insecure

分析

提取可能的关键参数

host
user_account
user_password
wlan_ac_ip
wlan_user_ip
wlan_user_mac
Cookie

经测试,关键参数及格式如下

host=域名(可通过自动重定向获得)
user_account=,0,学号@cmcc
user_password=密码
wlan_ac_ip=AC的ip地址(根据规律为host-1)
wlan_user_ip=本机ip地址

最简的curl命令如下

curl "http://${host}:801/eportal/?c=Portal&a=login&callback=dr1003&login_method=1&wlan_ac_ip=${host-1}&user_account=,0,${学号}@cmcc&user_password=${密码}&wlan_user_ip=${ip地址}"

并且最终获得授权的设备 ip 为 curl 命令中 wlan_user_ip 参数的 ip,与发包 ip无关

应用(抄作业)

至此,便可以配合 ping 命令检测网络,ip 命令获取 ip,来实现自动认证

完整代码

#!/bin/sh
# 检测网络
check() {
    if ping -c 1 -W 5 8.8.8.8 > /dev/null 2>&1;
    then
        return 0
    else
        return 1
    fi
}
# 认证
auth() {
    # 获取ip
    ip=$(ip addr show CMCC | grep "inet " | awk '{print $2}' | cut -d/ -f1)
    # 根据重定向获取host
    host=$(curl -Ls -o /dev/null -w "%{url_effective}\n" www.baidu.com | awk -F/ '{print $3}')
    # host-1
    ac=$(echo ${host} | awk -F. -vOFS=. '{$NF--; print}')
    # 学号
    user=""
    # 密码
    pwd=""
    # 记录日志
    echo $ip >> auth-cmcc.log
    # 认证
    curl "http://${host}:801/eportal/?c=Portal&a=login&callback=dr1003&login_method=1&wlan_ac_ip=${ac}&user_account=,0,${user}@cmcc&user_password=${pwd}&wlan_user_ip=${ip}" >> auth-cmcc.log
    }
#判断是否能联网,若不能则进行认证
if ! check; then
    auth
fi

利用cron实现自动执行

#7:00到22:59每分钟执行一次
* 7-22 * * * /path/to/auth-cmcc.sh