快好知 kuaihz订阅观点

 

浏览器是如何存储密码的?

一、引言

我曾经介绍过名为dumpmon的推特机器人,它监控着众多“贴码网站”的账户转储、配置文件和其他信息。自那以后,我一直留意着监测到的信息。接下来会有关于dumpmon的一系列文章,而本文则关注浏览器是如何存储密码的。

这里提到dumpmon,是因为我偶然发现一些贴码,比如这篇,应该是感染在计算机上的恶意软件的日志。我便想:我总是认为最好不要让浏览器直接存储密码,但是原因呢?恶意软件从感染的计算机中获得密码会有多轻松呢?因为从一处获得所有想要的资料有点困难,所以我决定在此文贴出结果以及一些从各个浏览器密码管理器中提取密码的简单代码。

本文所述是在windows 8系统上分析下述浏览器

二、Chrome浏览器

获得密码难易程度:简单

我们从Chrome浏览器开始。令人失望的是,chrome浏览器是最容易被提取密码的。加密后的密钥存储于%APPDATA%..LocalGoogleChromeUser DataDefaultLogin Data”下的一个SQLite数据库中。但是是如何获转存并加密的呢?我从《谷歌Chrome浏览器是如何存储密码的》这篇文章中获得了Chrome存储密码的诸多信息,而这篇文章是4年前写得。虽然从那篇文章以后Chrome做了些改变,但是我将按照同样的方式,利用Chromium源码的一些片段向你展示密码是如何转储的。

存储加密密码

当用户访问网站时,Chrome会首先判断此次登陆是否是一次成功的登录,判断代码片段:

如果成功登录,并且使用的是一套新的证书,这个证书是浏览器之前没有生成过的,Chrome就会生成一个提示条,询问用户是否需要记住密码

在此为节省篇幅,我省略了创建提示条的代码。当点击“保存密码”时,就会调用Chrome密码管理器的“保存”函数来响应操作:

简单吧。如果是一次新的会话登录,就以如下代码执行保存:

再次为控制篇幅,裁剪了一些内容(例如一个对证书是否属于google的网站的操作审查等等)。在这函数被调用之后,执行AddLoginImpl()函数的任务被调用。这是用来使界面快速响应的:

该函数会调用登陆数据库对象的AddLogin()函数,以检查其操作是否成功。下面就是AddLogin()(我保证,我们马上就要看到密码是如何存储的了):

这里有些有趣的东西。我们利用用户密码生成一个字符串密钥。这段代码已经减掉了,但是”sql:Statement”行下面,执行了一个SQL查询语句,实现了在登录数据文件中存储加密数据。该EncryptedString函数仅仅是在一个加密对象上简单调用了EncryptString16函数(就是下面这个):

最终,我们看到密码是调用Windows API函数CryptProtectData来加密的。这意味着,只有用加密时使用的登陆证书,密码才能被恢复。而这根本不是问题,恶意软件通常就是在用户登陆环境下执行的。

密码破译

在讨论如何破译上面存储的密码之前,让我们首先使用Sqlite浏览器来查看一下登陆文件中的数据:

我们的目的是从这个数据库中抽取出action_url,username_value和password_value(是二进制数据,所以SQLite浏览器不能显示)。而破解密码,只需要调用Windows API中的CryptUnprotectData函数。幸运地是,Python为调用Windows API准备了一个完美的叫做pywin32的库。

先看一下我们使用的PoC:

运行上述代码,可以看到已经成功了!

虽然找到密码是如何存储的有点费事(也可以使用其他的动态方法,但是分析代码会更透彻),但是解密密码则几乎没费什么力气。唯一被保护起来的就是密码的部分,还仅仅保护当前用户。

 

2/4

 

三、IE浏览器 

获得密码难易程度:简单/一般/困难(依版本而定)

本质上来讲,直到IE10之前,IE浏览器密码管理与Chrome使用的是相同的技术,但有一些有趣的改变。为了全面的展示,我们先简单讨论一下IE7——IE9的密码存储,然后再讨论在IE10中的变革。

IE7-9浏览器

在IE的早期版本中,根据密码类型的不同,会被存储于两个不同的地方:

注册表(基于表单的验证)——这类密码是提交给诸如Facebook、Gmail之类站点的。

证书文件——HTTP验证密码方式,类似于网上登陆证书。

根据本篇文章需要,接下来讨论基于表单验证的证书,这也是大多数攻击者可能选择的攻击目标。这些证书存储于如下注册表键位置:

HKEY_CURRENT_USERSoftwareMicrosoftInternet ExplorerIntelliFormsStorage2

用regedit(注册表编辑器)可以看到值,类似于下面这样:

正如Chrome中的示例,这些证书使用Windows API中的CryptProtectData函数加密后储存。不同之处是该函数添加了额外的熵(译者注:熵,熵就是混乱的程度,用来描述某个事件不断趋向混乱的过程)。这里的熵,就是这注册表键值,它是网站URL的SHA1的校验和,以供证书使用。

这非常有用,因为当用户访问网站时,IE能够迅速根据URL的哈希值判断是否已经有此证书,之后再用此哈希值完成证书解密。如果攻击者不知道此处使用了URL,解密证书就会变得很困难。

通常,攻击者能够通过历遍用户因特网访问历史,hash每个URL以及检查每个存储证书的方式,来降低此种保护方式的效果。

本文中没有贴出完整代码,你可以在这里处获得完整示例。现在,我们开始讨论IE10。

 

本站资源来自互联网,仅供学习,如有侵权,请通知删除,敬请谅解!
搜索建议:浏览器是如何存储密码的?  浏览器  浏览器词条  存储  存储词条  密码  密码词条  如何  如何词条  
产品

 马化腾内部分享:产品经理必修课

这是马化腾2014年在内部分享会上的一段讲话,有员工整理后在极小的圈子里放了出来。以下为原文:腾讯善于做产品,世人皆知。但其实我们更多时候应该少提“产品”和“功...(展开)