谷歌浏览器存储密码的方式

使用谷歌浏览器时,如果我们输入某个网站账号密码,他会自动问我们是否保存密码,以便下次登录时候自动填写账号和密码

 在设置可以找到登录账户和密码

 也可以直接看密码,不过需要凭证

这其实是windows的DPAPI机制

DPAPI

Data Protection Application Programming Interface(数据保护API)

DPAPI是Windows系统级对数据进行加解密的一种接口无需自实现解密代码微软已经提供了经过验证的高质量解密算法提供了用户态的接口密钥推导存储数据加解密实现透明并提供较高的安全保证

DPAPI提供了两个用户接口`CryptProtectData`加密数据`CryptUnprotectData`解密数据加密后的数据由应用程序负责安全存储应用无需解析加密后的数据格式。但是加密后的数据存储需要一定的机制因为该数可以被其他任何进程用来解密当然`CryptProtectData`也提供了用户输入额外`数据`来参与对用户数据进行加密参数但依然无法放于暴力破解

微软提供了两个接口用来加密和解密,`CryptProtectMemory`和`CryptUnprotectMemory`

实际上,在老版本(80之前)的谷歌浏览器,仅仅是使用了CryptProtectMemory来对密码进行加密

80版本之前的Chrome

实验环境

win7

Chrome版本 79.0.3945.117

实验过程

chrome的密码经过加密后存储

%LocalAppData%GoogleChromeUser DataDefaultLogin Data

如果用二进制文本编辑查看的话会发现他其实是一个sqlite数据库文件

可以使用工具SQLiteStudio打开

双击logins

 选择data

可以看到用户名网址,却没有密码

但是密码的二进制实际是有值的

编写脚本解密

python的解密是最简洁的,这里送上一个三好学生代码

但我还是想用c++写一个

编写之前,需要配置sqlite3环境,并且下载<sqlite3.h>和<sqlite3.c>文件

如果当前用户正在使用谷歌,是无法打开数据库的,于是我们可以复制一份出来操作

 再通过sql语句查找logins

 在回调函数中解密

看下效果,完美解出密码

谷歌浏览器上面看到的也是一样的,无需再验证用户密码

80版本之后的Chrome

那么80.x之后的Chrome如何解密呢

实验环境

win10

Chrome版本 91.0.4472.101(最新版)

实验分析

 先看一下跟以前版本的Chrome存储方式上有什么区别

 判断是否是新版本的Chrome加密其实就是看它加密后值的前面没有v10或者v11

 看官方文档,分析新版加密算法

key初始化

https://source.chromium.org/chromium/chromium/src/+/master:components/os_crypt/os_crypt_win.cc;l=192;drc=f59fc2f1cf0efae49ea96f9070bead4991f53fea

 注释:尝试local state提取密钥

并且可以看到kDPAPIKeyPrefix实际上就是个字符串”DPAPI”

然后就是进行DPAPI的解密,最后就是如果key不在local state中或者DPAPI解密失败,就重新生成一个key

这里我们我可以大致分析出key初始化时的动作:

  1. local state文件提取key

  2. base64解密key

  3. 去除key开头的“DPAPI”

  4. DPAPI解密,得到最终的key

跟进GetString函数的参数kOsCryptEncryptedKeyPrefName

 知道key存放local state文件os_crypt.encrypted_key字段中,即

local state文件就在本地默认目录:

Local State是一个JSON格式文件

明文加密方式

源码注释

 密钥加密后数据前缀是“v10”

 密钥和NONCE/IV的长度分别为:32字节和12字节

这里解释一下NONCE/IV是什么:

如果我们不希望相同的明文通过密钥加密出来的密文是相同的(这样很容易让攻击者知道这两条密文的明文是相同的) 解决办法是使用IV(初始向量)或nonce(只使用一次数值)。因为对于每条加密消息,我们都可以使用不同byte字符串。它们是非确定理论的起源,而这种理论要求制造出令人难以分辨的副本。这些消息通常不是什么秘密,但为了解密需要,我们会在分发时对它们进行加密。IV与nonce之间区别是有争议的,但也不是没有关联的。不同的加密方案所保护的侧重点也不同:有些方案需要的只是密文不重复,这种情况我们通常叫作nonce;还有一些方案需要密文是随机的,甚至完全不可预测的,这种情况我们通常叫作IV。这里其实就是希望即便明文相同,经过加密后的密文也不相同

再往下翻,其实可以看到解密函数

encrypted_value前缀v10后为12字节的NONCE(IV),然后再是真正的密文。Chrome使用的是AES-256-GCM的AEAD对称加密

那么思路就清晰了,这里自己画了一个图来总结算

实现自动化抓密码

解密使用一个非常强大的库,cryptopp

获取原始的key

如果当前chrome版本并不是80+,可以通过一个简单判断:就是看加密密码前有没有”v10“或者”v11“

然后就是解密密文

获取iv和密文

再用cyptopp强大的库函数进行解密

这里逻辑的话参照上面分析步骤,这里就不再赘述

最后看看自己谷歌版本和解效果

后记

实战中如果拿到一台主机,并且安装chrome,我们就可以抓取密码以便快速精确地横向。

原文地址:https://blog.csdn.net/2301_80520893/article/details/134777335

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_41558.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注