作者:UpSGE
写在前面
本文以 CMCC-EDU 为例,实现自动认证。其他使用 web 认证的网络可以参考。
不想看原理解析,直接跳转到抄作业
抓包
连接网络,进入认证页面 http://192.168.253.6/
打开dev-tools,监听网络连接,输入账号密码认证
查看第一条连接,得到以下信息
复制为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