文章首发先知社区:https://xz.aliyun.com/t/9752
工具已上传到github:https://github.com/SD-XD/Catch-Browser
谷歌浏览器存储密码的方式
在使用谷歌浏览器时,如果我们输入某个网站的账号密码,他会自动问我们是否要保存密码,以便下次登录的时候自动填写账号和密码
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
在设置中可以找到登录账户和密码
也可以直接看密码,不过需要凭证
这其实是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%\Google\Chrome\User Data\Default\Login Data
如果用二进制文本编辑器查看的化会发现他其实是一个sqlite数据库文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VzBU6xnN-1646719749639)(/img/CatchChrome/4.png)]
可以使用工具SQLiteStudio打开他
双击logins
选择data
可以看到有用户名和网址,却没有密码
但是密码的二进制实际是有值的
编写脚本解密
python的解密是最简洁的,这里送上一个三好学生的代码
from os import getenv
import sqlite3
import win32crypt
import binascii
conn =