苏大校园网直接连接

苏大校园网の小妙招

一、前言

众所周知,苏大的SUDA_WIFI需要进行认证。虽然可以开启校园漫游,但是似乎在大部分时间中,当我们断开wifi然后再重新连接的时候,都需要重新认证。

虽然我没有仔细求证过其中的判断标准,不过现在的设备连接wifi一般都会有一个随机MAC地址的选项。

MAC地址,全称为“媒体访问控制地址”(Media Access Control Address),是一个用于确保网络设备唯一性的地址。它是一个通常由六组两位十六进制数字组成的地址,例如:08:00:27:4A:2D:1F。

每个网络接口控制器(NIC)都有一个唯一的MAC地址,这个地址在生产时被烧录到硬件中,通常是不可更改的。无论是有线还是无线的网络设备,如以太网卡、Wi-Fi设备等,都有一个MAC地址。

MAC地址在数据链路层(OSI模型的第二层)被用于标识网络上的设备。当数据包在局域网(LAN)内传输时,它是基于MAC地址进行路由的,而不是IP地址。

MAC地址一般标志着网络中的唯一硬件,wifi认证过程中很有可能就是通过相同的MAC地址来判断登陆的设备是否是同一个,既然使用了“随机MAC地址”,自然也就无法做到每次登陆免认证。

下来我将介绍一个小技巧来实现对于校园网的自动认证。

二、探索过程

为了探究登录过程,我将整个登陆的过程抓包。

首先我们知晓苏大校园网登录的网址是http://10.9.1.3/

我们打开网址,选好自己的运营商,并输入用户名和密码,按下F12打开开发人员工具

注意开启 保留日志

image-20230917182438543

接着输入自己的用户名密码,然后登录。

截取这个数据包:

image-20230917182829018

这样我们就得到了这样的一个登录url:

http://10.9.1.3:801/eportal/?c=Portal&a=login&callback=dr1003&login_method=1&user_account=%2C0%2C USERID %40zgyd&user_password= PASSWORD &wlan_user_ip= IP &wlan_user_ipv6=&wlan_user_mac=000000000000&wlan_ac_ip=&wlan_ac_name=&jsVersion=3.3.3&v=6025

这个url中存在以下参数

  • a:代表登录方法,login即为登录,logout即为注销
  • login_method:应该是一种登录方法,1可能代表着网页登陆
  • callback:笔者也不知道,似乎再其他的POST请求中也存在dr1002dr1003等,不过登录的时候是dr1003
  • user_account:顾名思义,登录者的账号,经过url解密应该是类似,0,12345678@zgyd。经过笔者验证,校园网应该没有@之后的内容,即,0,12345678;中国移动为@zgyd;中国联通为@cucc;中国电信为@ctc
  • user_password:即为你登录的密码
  • wlan_user_ip:你连接上wifi时给你DHCP分配的IP地址
  • wlan_user_ipv6:分配的IPv6地址,苏大似乎没有,可以空着
  • wlan_user_mac:连接设备的mac地址,默认为000000000000
  • wlan_ac_ip:ac节点的IP,可以空着
  • wlan_ac_name:ac节点的名称,可以空着
  • jsVersion:浏览器js版本,默认3.3.3
  • v:这个参数笔者也不清楚,可能与时间戳有关,不过POST请求时可以不输入这个参数

三、实现自动连接

我们可以得到最终登录时的url:

http://10.9.1.3:801/eportal/?c=Portal&a=login&callback=dr1003&login_method=1&user_account=%2C0%2C USERID %40zgyd&user_password= PASSWORD &wlan_user_ip= IP &wlan_user_ipv6=&wlan_user_mac=000000000000&wlan_ac_ip=&wlan_ac_name=&jsVersion=3.3.3

例如:

用户名:12345678

密码:123456

运营商:中国移动

IP地址:10.120.100.100

可以直接在浏览器里输入url:

http://10.9.1.3:801/eportal/?c=Portal&a=login&callback=dr1003&login_method=1&user_account=%2C0%2C12345678%40zgyd&user_password=123456&wlan_user_ip=10.120.100.100&wlan_user_ipv6=&wlan_user_mac=000000000000&wlan_ac_ip=&wlan_ac_name=&jsVersion=3.3.3

即可实现登录

笔者也写一个Python程序来实现自动登录:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import socket
import urllib
import urllib.request
import json

def extract_ip(): # 获取本机ip地址
hostname = socket.gethostname()
addrs = socket.getaddrinfo(hostname, None)
ip_address = []
for (family, socktype, proto, canonname, sockaddr) in addrs:
ip_address.append(sockaddr)
return ip_address


user_name = "1234567890" # 自己的账号
user_password = "123456" # 自己的密码
ISP = "@zgyd" # 中国移动
# ISP="" #校园网
# ISP = "@cucc" # 中国联通
# ISP="@ctc" #中国电信

ip_address = []
for ip in extract_ip():
if ip[0][0:3] == "10.":
ip_address.append(ip[0])

str1 = "http://10.9.1.3:801/eportal/?c=Portal&a=login&callback=dr1003&login_method=1&user_account=%2C0%2C"
str1_b = "http://10.9.1.4:801/eportal/?c=Portal&a=login&callback=dr1003&login_method=1&user_account=%2C0%2C"
str2 = "&user_password="
str3 = "&wlan_user_ip="
str4 = "&wlan_user_ipv6=&wlan_user_mac=000000000000&wlan_ac_ip=&wlan_ac_name=&jsVersion=3.3.3"
print(ip_address)
for ip in ip_address:
get_request = str1 + user_name + ISP + str2 + \
user_password + str3 + ip + str4
get_request_backup = str1_b + user_name + ISP + str2 + \
user_password + str3 + ip + str4
print('Testing ', ip)
print(get_request)
try:
response = urllib.request.urlopen(get_request)
except urllib.error.URLError as e:
try:
response = urllib.request.urlopen(get_request_backup)
except urllib.error.URLError as e:
print("网络连接失败!")
str_resp = response.read().decode('utf-8')
str_json = str_resp[7:len(str_resp)-1]
data = json.loads(str_json) # 返回值解析为json数据
if (data['result'] == "1" and data['msg'] == "\u8ba4\u8bc1\u6210\u529f"):
print("认证成功!")
elif (data['ret_code'] == 1 and data['msg'] == "QXV0aGVudGljYXRpb24gZmFpbA=="):
print("运营商错误!")
elif (data['ret_code'] == 1 and data['msg'] == "bGRhcCBhdXRoIGVycm9y"):
print("密码错误!")
elif (data['ret_code'] == 2):
print("已经登录!")
elif (data['ret_code'] == 1 and data['msg'] == "dXNlcmlkIGVycm9yMQ=="):
print("用户名错误!")
#print(data)


四、总结

笔者写到这里才发现,原来好像替苏大写了个本地登录的客户端(?)不过这个小程序有个好处,在一些无法进行图形登录的系统,例如OpenWRT,不带GUI界面的Linux上,也能实现无网页登录。当然对于同学们来说好像这个登录也没有那么方便((),毕竟IOS和安卓运行Python程序还有点麻烦(笑),但这也算是来到苏大整的第一个活罢。