寒假放假前,收到了学校的邮件,说我们有需要的话可以去申请开通北师大的VPN以便在假期访问校内的资源。于是就顺手申请了一下,后来果然通过了申请,得到了账号。然而就从得到账号那一天起,这个系统一次又一次地给我带来了惊喜甚至是惊吓。随后的发生的一系列事件,让我彻底震惊了!
第一震:兼容性从打开登录的网页说起,可是发现这个系统居然只支持Windows系统,而且还要用32位的IE浏览器。这不是坑爹吗?
第二震:基于ActiveX无奈在Mac上开起了Windows XP的虚拟机,下载那个传说中的登录客户端。我很困惑为啥网页有登录界面了还要装客户端,结果装上一看是基于ActiveX的,ActiveX技术在1996年由微软提出,并应用到了其IE3浏览器中。至今已经有15年的历史。ActiveX技术在其安全性,交互性和可移植性等许多方面早已不适应当今的互联网发展,就连微软也已经放弃了该技术,在微软的官网上貌似已经找不到ActiveX的影子了。但令人不解的是,中国的IT企业却咬住这块狗屎不放,各种ActiveX控件打着“安全”的旗号在各大网站上大行其道。其中最为常见和常用的要数臭名昭著的“网银安全控件”。说到“安全控件”,我可以连续吐槽几个小时,好在本文主题并不是吐槽ActiveX和安全控件,暂且搁置不说。
第三震:TAP驱动再说这个VPN,安装快结束的时候提示我要安装TAP驱动,而且还没通过传说中的“微软徽标认证”,问我要不要继续…说道TAP驱动,我顿时有种似曾相识的感觉~话说这不是大名鼎鼎的开源VPN系统OpenVPN的驱动程序吗?难道北师大这个牛逼哄哄的SSL VPN系统是基于OpenVPN做的?如果是OpenVPN,那就意味着它可以被移植到64位Windows/Linux/MacOS甚至是iPhone上。这岂不是很爽~
第四震:OpenVPN的影子猜想归猜想,还是需要来验证一下的。打开VPN的登录页面,敲上用户名和密码。直接在网页上显示出了一个“很炫”的登录界面,不久后就登录成功了。去ip查询的网站验证了一下,果然变成的北师大的IP。整个过程在网页上完成,貌似没有发现OpenVPN的影子… 等等,不是有ActiveX吗?打开任务管理器,看了下进程。果然有个ipass_client.exe进程,看来ActiveX触发的后台程序就是它了。到安装目录里转悠一下,发现Program Files里相关的目录居然有两个,一个是一坨控件啥的,应该是ActiveX前端模块所在的目录。另一个一个是ipass_client.exe所在的目录,进去一看发现了个ca.crt,这难道就是传说中的证书吗?!有了证书还不行,得有配置文件。纵览目录,没有发现.ovpn或者.conf之类的明显的配置文件,来回看几次,只有一个小于1KB的文件,名为client.ipass,用记事本打开,一个标准的OpenVPN配置文件呈现在了我的面前……
结束了吧
!这个系统就是一个ActiveX带着一个OpenVPN的客户端吧继续测试,发现ipass_client.exe就是一个改名了的openvpn.exe,其版本为2.1 rc13。兴奋的我马上将配置文件和证书拷贝到Mac系统,用Tunnelblick载入并登录,然而,naive的我哪里知道,令人震惊的事情才刚刚开始!
第五震:验证失败神马?这是我最想不到的错误。OpenVPN客户端居然收到了AUTH_FAILED消息!我输入的就是我在网页上登录的用户名和密码啊!难道前端和后端的用户名或者密码是不一样的?没这个必要吧!不过收到AUTH_FAILED消息也从侧面证实了服务器上安装的正是OpenVPN系统,而且应该是未经修改的。既然服务器上是OpenVPN,那估计trick就在客户端了吧~再次回到XP虚拟机,在命令行里用它自带的ipass_client.exe登录,输入用户名密码后还是提示AUTH_FAILED。下面我们需要具体验证一下这个ipass_client.exe是原版的还是经过修改的。
第六震:未经修改经过实验发现,ipass_client.exe果然是全裸上阵!我用从ipv6vpn.cn的客户端中提取的openvpn.exe替换了ipass_client.exe,这个程序的版本是2.1.1,感觉差别不会很大。果然,替换后在网页上登录成功了!可见这个ipass_client.exe真的就是一个原汁原味的全裸openvpn.exe。剩下的任务貌似很简单了,只要把它真正登录OpenVPN的用户名和密码搞出来,就一定可以移植到别的系统上了。
第七震:诡异的进程间通信获得登录OpenVPN的用户名和密码费了一番周折,最后还是无所不能的易大神牛出手相助才最终解决。ipass_client.exe是由IE中的ActiveX控件启动的,但是看配置文件里是auth-user-pass,这种配置应该是需要在OpenVPN里手动输入用户名和密码的,可是实际上只要在网页里输入就可以。为了获得真正的登录用户名和密码,最直接粗暴的办法就是重新编译OpenVPN的客户端,加上几句话让它把输入的用户名和密码保存到文件里。这种方法应该是最后的选择,我和易牛都觉得应该有更简单的方法。于是,我进行了这些尝试:
- 日志,改配置文件里的设置,将日志的等级开高,以期在日志中看到使用的用户名和密码。但最后发现日志中不会包含这些信息,即使是开到变态详细的verb 9也无济于事。此法行不通。
- 查看OpenVPN客户端启动的命令行。发现启动的命令行就是ipass_client.exe clinet.ipass,也就是参数只有配置文件一个,并未包含用户名和密码。此法亦不可行。
- 自己写个程序,将标准输入流中的所有信息输出到文件,以期在其中发现密码。试过了,没有得到任何信息。至今不知道为什么,难道它的密码不是通过标准输入流传输的吗…
后来易牛出马,听说我的尝试后觉得很诡异,表示这些方法肯定可以得到用户名和密码。后来易牛亲自试了一遍,果然没有结果。后来易牛又提出了动态调试等几个不靠谱的方案,最终也都放弃了。
第八震:诡异Javascript脚本现身易牛又找到一个新的方向,开始研究登录成功后网页的源代码,其中发现了一些JavaScript,其中包含一些提交数据验证数据还有调用ActiveX的代码。其中有一段代码是这样的:
1
2
3
| var user="48283442";
//...(省略)
GFAiPass.Start(user);
|
这段代码的诡异之处在于,其调用ActiveX的代码只有user一个参数。难道登录不需要密码吗?看来不是,这个JS的含义貌似比较清晰,貌似user则这个变量的值是从服务器获取来的,而验证用户名密码的操作在VPN系统中通常由Radius服务器完成,这里貌似不是这么做的,而是把用户名密码提交到了一个URL,就像普通的网页上的登录一样。由于只有一个参数,我们也无法做更多猜想,获取OpenVPN的登录用户名和密码仍然是工作的重点。然而这一步,却为后来的研究奠定了最最重要的基础。
第九震:用户名密码终现原形时间到了凌晨两点,用手机跟易牛又交流了一下,后来睡着了…第二天一早,发现手机上有易牛兴奋的咆哮,先是在QQ里,然后是飞信。易牛的飞信头像是一个握着拳头内牛满面的小人,发的消息是“搞定了”,结合起来看别有一番风味~
QQ里易牛的留言告诉我,OpenVPN登录的用户名就是那个由JS从服务器获取到并传给ActiveX的那个参数,而密码居然是固定不变的1234。后来就出门了,没有验证。易牛也再没联系我。中午,在回家的车上,发现易牛终于上线了。赶紧追问密码是怎么获取到的,易牛的答案让我佩服的五体投地…他居然把配置文件的服务器地址改成了他自己的OpenVPN服务器,那登录信息岂不是送上门来!易牛在他自己的radius服务日志里如探囊取物般的读到了用户名和密码,并对密码竟然是1234深感震惊!
这个思路真的挺牛的,客户端研究半天,没结果。服务器在学校,不会被你轻易入侵。这家伙竟然直接把数据提交到自己的服务器,实在是将计就计的妙招~易牛昨天把他的脚本发给了我,其中包含了他的user的值,也就是用户名,而密码又是不能修改的1234。因此易牛让我不要把他的用户名透露出去。
第十震(最强震):坑爹机制浮出水面话说事情到这里也应该结束了吧。用户名可以从登录后的网页中获得,密码也知道了。可是,让我们分析一下这个机制。我假设其验证机制是这样的:每个用户有自己的网页登录用户名和密码,敲到网页上后,如果验证通过,就能从服务器获取到自己的真正登录OpenVPN的用户名,而这个用户名的密码统一为1234。如果网页登录验证没有通过,则会因不知道自己的用户名而无法登录。
看看吧~怎么会有这样神棍的验证机制呢?OpenVPN可以通过Radius来认证登录啊,为啥要在网页上重新请求一个用户名呢?这种机制不但降低了安全性,还增加了工作量。这么做毫无意义啊!哪有人把密码弄得很简单,反而将用户名保密起来,而且还要通过JS+ActiveX这么复杂的机制保密起来呢?逻辑思维告诉我,这种机制是不太可能存在的。让我们做个更加大胆的猜想吧!!!我猜,那个所谓的易牛的用户名,根本就是通用的!软件作者懒得或者说根本不会配置Radius服务器,也不知道Radius如何在Web上鉴定。于是干脆设置了一把“公用钥匙”,然后用简单的网页登录的机制来验证用户,成功则授予其这把钥匙。这样虽然让整个系统毫无安全性可言,但却省去了配置Radius服务器等工作,而用简单的Web验证代替。
事实证明了我的猜想。我在网页上登录成功后,迫不及待的查看了JS中的用户名,果然是雷打不动的48283442,果断在Mac下的Tunnelblink里敲入这个用户名和密码1234,登录成功。
我发了一条短信给易牛:“易牛,你可以完全不懂担心你那个用户名泄露了。” 易牛很快也领悟出了其中的含义。
第十一震:不出所料!免费上网目的最终达成据说这个VPN系统有IP地址限制,只能在校外登录,而在校内不能使用。这种限制是很合理的,如果校内也能用岂不是跟我们的项目服务器一样,成了免费上网的跳板了吗?不过我在家里没法测试其IP地址限制的功能,打算等过几天回学校再说。不过我也提出了一个猜想,那就是IP地址限制是通过前端模块实现的,而后端的OpenVPN系统中并未做限制。
果然,当我向易牛打听此事时,得到了肯定的答复。易牛昨天晚上就极尽free之精神,在校内,用这个垂手可得的免费VPN挂了一晚上的下载……
第十二震:厚颜无耻!围观系统提供商搜索了一下这个系统的提供商,果然找到了这家北京的小公司。其中GFA iPass系统解决方案的成功案例中赫然写着北京师范大学SSL VPN项目。再看对产品和公司的介绍,更是极尽鼓吹之能事,浮夸的一塌糊涂! 什么“权威的第三方电子认证服务机构”,什么“强大的技术研发实力”,什么“充足的优秀人才储备”,什么“手握利器,保证企业核心竞争力”……我们两个学生,几个小时的时间,整个系统的机制已经暴露无遗,其致命的缺陷已经被我们独立地发现,研究并利用。我看这家公司的技术团队实在是该自郐以下!!
我已无力吐槽!! 我只能说,北师大SSL VPN系统——你彻头彻尾地震惊了我!! 北京国富安电子商务安全认证有限公司——你赢了!!!!
后记:本文最初成文于2012年2月16日,由于安全性问题没有公开发表。目前,这套坑爹的VPN系统在北京师范大学已经全面停用,转而启用了国际大厂商Juniper的VPN系统。在这种情况下,我终于可以将此文公之于众,与诸位关注信息安全的同仁们交流。——与2014年4月2日
原文:http://kuangqi.me/tricks/bnu-vpn-shock-me/