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

0x00 前言


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

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

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

0x01 简介


本文将要介绍以下内容:

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

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


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

Alt text

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

Alt text

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

%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段无法显示,如下图

Alt text

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

Alt text

注:

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

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


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

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

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

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

Alt text

参考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)只有与加密数据的用户具有相同登录凭据的用户才能解密数据

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

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

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

注:

调用win32crypt.CryptUnprotectData需要安装pywin32

下载地址:

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

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

Alt text

注:

如果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密码

操作界面如下图

Alt text

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

当然可以

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

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

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

  • \AppData\Local\Google\Chrome\User Data\Default\Login Data

  • \AppData\Roaming\Microsoft\Protect{sid}}\下保存key文件

注:

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

eg.

\AppData\Local\Google\Chrome\User Data\Default\Login Data

\AppData\Roaming\Microsoft\Protect\S-1-5-21-3453529135-4164765056-1075703908-1001\329c4147-0011-4ad6-829d-e32dcbd1bbd7

如下图

Alt text

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

Alt text

成功解密,如下图

Alt text

补充:

chromepass也可在命令行下使用

0x05 开源工具


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

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

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

  1. powershell实现的工具:

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

  1. python实现代码,可供参考的开源代码:
from os import getenv
import sqlite3
import win32crypt
import binascii
conn = sqlite3.connect(getenv("APPDATA") + "\..\Local\Google\Chrome\User Data\Default\Login Data")
cursor = conn.cursor()
cursor.execute('SELECT action_url, username_value, password_value FROM logins')
for result in cursor.fetchall():
    password = win32crypt.CryptUnprotectData(result[2], None, None, None, 0)[1]
    if password:
        print 'Site: ' + result[0]
        print 'Username: ' + result[1]
        print 'Password: ' + password
    else:
        print "no password found"

0x06 小结


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

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


LEAVE A REPLY

Written on January 25, 2018