谷歌浏览器存储密码的方式
在使用谷歌浏览器时,如果我们输入某个网站的账号密码,他会自动问我们是否要保存密码,以便下次登录的时候自动填写账号和密码
DPAPI
Data Protection Application Programming Interface(数据保护API)
DPAPI是Windows系统级对数据进行加解密的一种接口无需自实现加解密代码微软已经提供了经过验证的高质量加解密算法提供了用户态的接口对密钥的推导存储数据加解密实现透明并提供较高的安全保证
DPAPI提供了两个用户态接口`CryptProtectData`加密数据`CryptUnprotectData`解密数据加密后的数据由应用程序负责安全存储应用无需解析加密后的数据格式。但是加密后的数据存储需要一定的机制因为该数据可以被其他任何进程用来解密当然`CryptProtectData`也提供了用户输入额外`数据`来参与对用户数据进行加密的参数但依然无法放于暴力破解。
微软提供了两个接口用来加密和解密,`CryptProtectMemory`和`CryptUnprotectMemory`
实际上,在老版本(80之前)的谷歌浏览器,仅仅是使用了CryptProtectMemory来对密码进行加密
80版本之前的Chrome
实验环境
win7
实验过程
%LocalAppData%GoogleChromeUser DataDefaultLogin Data
如果用二进制文本编辑器查看的话会发现他其实是一个sqlite数据库文件
但是密码的二进制实际是有值的
编写脚本解密
编写之前,需要配置sqlite3环境,并且下载<sqlite3.h>和<sqlite3.c>文件
如果当前用户正在使用谷歌,是无法打开数据库的,于是我们可以复制一份出来操作
看下效果,完美解出密码
80版本之后的Chrome
实验环境
实验分析
判断是否是新版本的Chrome加密其实就是看它加密后值的前面有没有v10或者v11
key的初始化
https://source.chromium.org/chromium/chromium/src/+/master:components/os_crypt/os_crypt_win.cc;l=192;drc=f59fc2f1cf0efae49ea96f9070bead4991f53fea
并且可以看到kDPAPIKeyPrefix实际上就是一个字符串”DPAPI”
然后就是进行DPAPI的解密,最后就是如果key不在local state中或者DPAPI解密失败,就重新生成一个key
跟进GetString函数的参数kOsCryptEncryptedKeyPrefName
知道key存放在local state文件os_crypt.encrypted_key字段中,即
明文加密方式
如果我们不希望相同的明文通过密钥加密出来的密文是相同的(这样很容易让攻击者知道这两条密文的明文是相同的) 解决办法是使用IV(初始向量)或nonce(只使用一次的数值)。因为对于每条加密消息,我们都可以使用不同的byte字符串。它们是非确定理论的起源,而这种理论要求制造出令人难以分辨的副本。这些消息通常不是什么秘密,但为了解密需要,我们会在分发时对它们进行加密。IV与nonce之间的区别是有争议的,但也不是没有关联的。不同的加密方案所保护的侧重点也不同:有些方案需要的只是密文不重复,这种情况我们通常叫作nonce;还有一些方案需要密文是随机的,甚至完全不可预测的,这种情况我们通常叫作IV。这里其实就是希望即便明文相同,经过加密后的密文也不相同。
再往下翻,其实可以看到解密函数
encrypted_value的前缀v10后为12字节的NONCE(IV),然后再是真正的密文。Chrome使用的是AES-256-GCM的AEAD对称加密
如果当前chrome版本并不是80+,可以通过一个简单的判断:就是看加密密码前有没有”v10“或者”v11“
后记
实战中如果拿到一台主机,并且安装有chrome,我们就可以抓取密码以便快速精确地横向。
原文地址:https://blog.csdn.net/2301_80520893/article/details/134777335
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_41558.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!