无线热点登陆认证原理探究

在使用需要认证的公共热点时,通常我们都需要在一个 web 页面完成认证后才可以访问外网。这个从技术实现上来说也许不难获得思路,通过劫持请求重定向到认证页面应该就可以实现。但是在使用 CMCC 一类的运营商热点时,连接到热点后没有进行任何操作就可以在设备上调用浏览器弹出认证页面,或者在 iOS 设备上打开一个专门的特殊窗口来要求认证,这一点是怎么实现的还没有想通。而且既然可以在 iOS 设备中调出专门的窗口来认证,应该使用了某些被广泛支持的协议标准来做这件事。那么现在心里的两个疑问就是:
1.一个通常的认证流程是什么样的,从设备接入到认证前后发生了哪些动作?
2.如何实现设备接入后弹出自定义的窗口,可不可以作为攻击者利用这一点搞一些事情?

这篇日志我就想记录我寻找这两个问题答案的过程。

首先来解决第一个问题。

第一步需要了解这套强制认证的技术叫什么,经过初步的搜索得到的答案是这种认证方式叫做 Portal 认证。根据 Wikipedia 上对 Captive Portal 技术的简单介绍,这套流程的基本思路和本文开头的猜测基本相同。具体的实施方式有不止一种,例如:

  • Redirection by HTTP(HTTP 重定向)
  • ICMP Redirect (ICMP 重定向)
  • Redirection by DNS (DNS 重定向)

在设备第一次接入到无线网络的时候,会通过 DHCP 服务获取到一个 IP 地址,可能是公有地址也可能是私有地址。不论分配到的 IP 地址属于公有或者私有,此时客户端都只具备访问指定站点的权限,需要在 Portal 页面上完成认证(确认接受使用条款,验证账号密码等),在 Portal 页面完成认证后,这个系统通常会立即执行一系列的动作包括,重新分配地址(在原本是私有地址时可选),更新这台设备对应的权限控制列表(ACL)中的信息解除访问限制,并开始计时/计费等动作。

当用户需要停止使用这类网络时,通常在 Portal 页面上会提供主动断开的按钮,或者服务器会在一段时间没有检测到该客户端网络流量时将你的设备做下线处理,以保证计费准确并及时释放占用的 IP 地址。

以上就是一台新设备接入到需要 Portal 认证的网络环境中在获得访问互联网权限之前的大致步骤。那在一台设备完成介入后,以后再访问这类网络是否可以不必进行重复的认证就直接接入网络呢?答案当然是肯定的,否则在网络条件不好时无穷无尽的输入账号密码登陆不用强调也知道是一件折磨死人的事情,而这个问题的解决使用了叫做无感知认证的解决方案。关于无感知认证在参考资料中给出了常见的认证方式下实现无感知认证的方案。无感知认证的思想总结起来就是在完成了首次认证后再次接入时会利用已保存的信息进行后台验证,不需要用户主动输入口令进行登陆。不过这并不是我想了解的重点,于是不再继续深入了解。

当时产生这个疑问的时候,是用 iPhone 连接到热点后,系统会弹出一个类似浏览器的窗口,那么这个窗口是怎么弹出来的,触发的条件又是什么呢。根据前面收集到的信息,我使用 Captive Portal iOS 作为关键字在谷歌进行搜索,找到了一些相关的信息,大致介绍了这里面相关的细节。iOS设备所弹出的认证窗口是由 Apple Captive Network Assistant(CNA) 来完成的。大体的流程是当你首先链接到 Wi-Fi 网络后,iOS 设备会从它所属的众多域名下的特定域名选择一个或多个进行访问,例如

  • www.appleiphonecell.com
  • captive.apple.com
  • captive.apple.com
  • www.apple.com
  • www.itools.info
  • www.ibook.info
  • www.airport.us
  • www.thinkdifferent.us

当域名能够被解析且对特定的网页访问得到正确的响应(通常是 Success )时,CNA 会判定设备成功的链接到了互联网,比如这个页面,。如果域名被解析但访问特定页面返回的内容不是预期的结果,那么 CNA 会认为设备所处网络存在Captive Portal,因此会调用一个专门的类似浏览器的页面来发起网络请求并触发 Portal 页面,来引导用户进行登录或者认证。

根据参考资料3中的链接,在 iOS 6 及更早的版本中,一个典型的 CNA 测试请求如下:

GET /library/test/success.html

HTTP/1.0

Host: www.apple.com

User-Agent:CaptiveNetworkSupport/1.0 wispr

Connection: close

 

可以看到,在请求特定的页面时,CNA 也使用了一个自定的 User-Agent,这有助于我们识别iOS设备的 Captive Portal 探测请求并选择性的绕过,来实现自定的认证方式。也就是开头提到的第二个问题。

在提供的参考资料3中的几个链接,可以很好的帮助理解 Captive Portal 的相关概念和在 iOS 下 CNA 的大概工作机制,鉴于版本更迭中具体的实现策略可能不时更改,而且我手头暂时也没有进一步研究利用的精力,所以第二个问题就不再做深入的研究了,待日后再次遇到相关的问题后再更新本文。

参考资料

1.Portal Authentication Technology White Paper.PDF 

2.无感知认证方案技术介绍

3.Helpful Links

http://stackoverflow.com/questions/19055502/facebook-com-and-the-ios7-captive-portal-detection

http://stackoverflow.com/questions/18891706/ios7-and-captive-portals-changes-to-apple-request-url

https://supportforums.cisco.com/document/11934456/captive-portal-ios7-public

http://stackoverflow.com/questions/3615147/how-to-create-wifi-popup-login-page

http://blog.tanaza.com/blog/bid/318805/iOS-7-and-captive-portal-a-guide-to-captive-portal-requirements

欢迎留言讨论