摘要
通过分析 windoze 下 Web 认证过程提出在 Linux 中用*脚本*实现通过 Web 认证方式上网的方法
问题由来
近来随着宽带入户越来越多的 ISP 采用 Web 认证这种接入认证技术Web 认证从用户的角度看是指用户在浏览器中通过 Web 页面输入用户名和密码的认证过程多数 ISP 号称无需客户端软件实际情况却是Windoze 下用户可以顺利通过 Web 认证上网但 Linux 用户却没有这么幸运
分析原因
什么原因呢?解决问题还需从分析认证页面入手下面的分析主要针对我这里的情况在 Mozilla 中打开认证页面后没有显示任何内容仔细分析认证页面发现认证页面采用 JavaScripts 编写并且是针对 IE 编制的IE 并未完全按照标准使用 JavaScriptsIE 对 JavaScripts 做了一些扩充主要有以下几项
* cab files for download of binaries
* documentall
* elementinnerHTML
详情请参阅
IE 对 JavaScripts 的这些扩充Mozilla 是不支持的实际上 Mozilla 对标准 JavaScripts 的支持比 IE 好所以这些有 IE 特点的认证页面 Mozilla 等浏览器自然无法通过了
从用户浏览器的角度看Web 认证除了通过 Web 页面输入用户名和密码外还需要通过 http 协议传送客户由 DHCP 获得的 IP有些 ISP 在用户登录到认证页面时由浏览器自动下载 cab 文件然后执行该文件获得用户的 IP再传给 Web Server还有些 ISP 在用户通过认证后会在客户端弹出一个计时窗定时向 ISP 发送 keepalive 包当然Web 认证是一个比较新的方式还没有形成标准所以各提供商的方法也不尽相同所谓各村有各村的高招你那里的方法就很有可能与我的不同但道理应该是一样的根据以上的分析可以看出 Linux 用户自然不可能用非 IE 兼容的浏览器直接通过登录 Web 认证界面上网啦
解决方法
好了问题就在这些 Web 页面使用 IE 方言的 JavaScripts 上有几种解决方法
使用 Linux 下 IE 兼容的浏览器有吗?谁知道请告诉我
使用 wine + IE 的方法有成功的吗?大家共同分享
如果将这些鸟语改为普通话我们就可以用 Mozilla 等非 IE 浏览器通过 Web 认证方式上网了
要求 ISP 提供支持 WC 标准的认证页面
分析 web 认证的原理编写认证程序
最理想的方法四可是我等不急也不一定能等到也许你比我幸运我采取第三种方法对于方法三你一定会问认证页面在 Web Server 上我无权修改行不通确实如此这里有个变通的办法下载认证页面按照 JavaScripts 标准修改并保存在本地每次上网前用本地经过修改的 Web 认证页面而非 Web Server 的认证页面就可以了具体修改方法参照 中的对照表找出认证页面使用 IE 方言的 JavaScritps根据对照表提供的修改建议对你的认证页面作出相应修改对于使用cab 的认证页面情况就比较复杂需要分析这个cab 在你的 JavaScripts 中的用法判断它的功能我这里是用它获得本地 IP所以我在本地执行脚本获得 IP 来模拟这个功能似乎cab 多与 IP 有关
一个例子
* 以我这里为例我的使用环境
ISP铁通 ADSL
认证方式Web 认证
ISP 的接入服务器华为 Quidway MAE/F (具体型号不能完全确定)
LinuxGENTOO rc
Browser Mozilla a/Phoenix
* 在 Linux 下用 mozilla (一定要用非 IE 浏览器获得认证页面这话有点多余但有的用户是在 Window$ 下调试的)访问 ISP 的 WEB 认证页面时浏览器中没有显示任何内容根本无法输入帐号和密码更谈不上通过认证这难不倒咱 linuxer 查看认证页面(/indexjsp)源码发现这两段 javascript
id=PortalClient
codebase=#version=
var clientIp = PortalClientlocalIP;
var languagetype = ;
if ((clientIp==)||(clientIp==null)) {
windowparentlocation;
} else {
windowparentlocation+clientIp+&newbl=+languagetype;
}
可以看出它用 PortalClient 获得本地的 IP如果成功转到 ?ip=你当前的IP 而 Mozilla 不支持它获取 IP (PortalClient是针对IE的唉这个程序编得太短视)看来问题出在这里既然如此我们可以手工加上自己的 IP(这个 IP 是与 ADSL 相联的网卡从 ISP 的 DHCP 服务器获得的地址)在 Mozilla 地址栏中输入
?ip=
^^^^^^^^^^^^^^^^^^^^^^
你的ISP认证服务器 你当前的IP
嗒嗒登录页面出来啦!
赶快输入帐号密码按登录按钮(期待中)
viva!!!
ISP 的首页终于被揪出来啦在终端中 ping ping 通没问题
* 至此在 Linux 下 web 认证方式已经完成方法很简单每次上网时在 mozilla 的地址栏中输入
?ip=你当前的IP
登录页面出来后和 IE 中的操作过程完全一样
* 当然你可以把这些步骤写成一个脚本以后简单执行脚本就可以了
#!/bin/bash
dhcpcd eth
phoenix ?ip=`ifconfig eth|grep inet|sed s/^ *//|sed s/ /:/g|cut f d:` &
说明
eth 是与 ADSL 联的网卡名根据你的实际情况填写
是我这 ISP 的认证地址
后面一段是获得 eth 的 ip 地址
注意!一定要用非 IE 浏览器获得调试认证页面因为 IE 可以执行认证页面的 JavaScripts有些认证过程实际上是执行多个页面完成的IE 最后停留的页面不一定是起始的认证页面你有可能漏掉前面的重要信息我这里就是这种情况
另外一种方法
如果你对方法 不满意可以用方法 继续分析 web 认证的原理编写自己的认证程序其实搞清原理后实现的方法更简单更灵活而且在 ISP 要求客户端定时发送 keepalive 包的情况下也只能采取这种方法我是这样做的
用网络分析软件(如ethereal)抓取正常认证过程的通讯包
在 windoze 下用 ethereal 抓包注意抓包时除了 IE 不要启动其它产生网络通讯的程序以免产生干扰数据保存这些通讯包
分析所抓包的内容
只要看一眼 web 认证过程产生的通讯包你就明白我为什么说这种方法更简单了简单讲web 认证方式实际是客户端用 http 协议向 ISP 发送用户名密码和 IP 等内容的过程客户端读取认证页面将填写好认证页面表格发送到 ISP 的认证服务器过程就这么简单
编写生成这些包的程序
用任意一个支持 http 协议的语言或工具编写向认证服务器 POST 认证页面中 form 的程序即可甚至读取认证页面都不需要我用 curl 和 python 各做了一个如果你略微了解 http 协议只要找到认证页面中向服务器 POST 用户名密码等数据的 form然后转换为你采用语言的语法格式就可以了根本不需要分析认证页面中繁杂的 Javascripts对计时窗发出的 keepalive 包也采用同样的方法
例子
* 认证页面中的 form
* 用 curl 写的一个脚本
#!/bin/bash
/etc/initd/myiptables start
dhcpcd eth
MYIP=`ifconfig eth|grep inet|sed s/^ *//|sed s/ /:/g|cut f d:`
echo $MYIP
UN=
SERVER=
curl trace tracetxt A Mozilla d username=$UN&password=&localip=$MYIP&connectname=&connecttype=
说明curl 是一个用 url 语法传输文件的命令行程序支持 httpftp 等协议类似 wget
上例中curl 的命令行参数 A 指明客户端的类型这是服务器为了安全需要指明Mozilla 或 IE 都可以我更愿意用 Mozilla d 是必需的表示用 POST 方法d 后的内容就是用户名密码 IP 地址等信息根据你的认证页面中 form 的 input 项目填写内容与其保持一致参数间用 & 分开后面是认证页面的地址执行这个脚本后返回 OK表示认证成功否则仔细检查 d 后的参数