0x00 前言

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

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

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

0x01 简介

本文将要介绍以下内容:

·Chrome浏览器保存密码的方式

·如何导出Chrome浏览器中保存的密码

·常用方法的限制

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

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

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

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

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

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

注:

如果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]))

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

参考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

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

注:

如果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.

\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

如下图

使用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实现代码,可供参考的开源代码:

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浏览器中保存的密码

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

渗透技巧——导出Chrome浏览器中保存的密码的更多相关文章

  1. 导出Chrome浏览器中保存的密码

    title: 导出Chrome浏览器中保存的密码 date: 2018-02-11 17:54:51 tags: --- 导出Chrome浏览器中保存的密码 先知看到的,挺有意思,记录一下 不同浏览器 ...

  2. 在Chrome浏览器中保存的密码有多安全?

    本文由 伯乐在线 - 黄利民 翻译.未经许可,禁止转载!英文出处:howtogeek.欢迎加入翻译组. [2013-08-09 更新]:最近又开始讨论“Chrome浏览器明文保存密码这个话题了,国外一 ...

  3. 如何查看chrome浏览器已保存的密码

    该方法是针对在chrome中已经存储了登陆密码的情况. chrome版本是 66.0.3359.139(正式版本) (64 位),不知道哪天会改了这个bug. 一般来说,我们登陆chrome浏览器已经 ...

  4. 简单绕过Chrome密码查看逻辑,查看浏览器已保存的密码

    简单绕过Chrome密码查看逻辑,查看浏览器已保存的密码   利用场景: 同事或朋友外出有事,电脑未锁屏离开座位.可以利用这一间隙,查看Ta在Chrome浏览器上保存的账号密码 查看逻辑: 当我们要查 ...

  5. 忘记常访问网站密码怎么办?教你如何查看浏览器已保存的密码,如何简单查看Chome浏览器保存的密码?

    利用场景: 同事或朋友外出有事,电脑未锁屏离开座位.可以利用这一间隙,查看Ta在Chrome浏览器上保存的账号密码 查看逻辑: 当我们要查看Chrome浏览器上保存的密码时,点击显示,会弹出一个对话框 ...

  6. 将Chrome浏览器中的扩展程序导出为crx插件文件

    将Chrome浏览器中安装的插件程序导出为crx插件文件 以360急速浏览器为例进行导出crx插件程序 1.在Chrom商店中找到需要的插件,安装到浏览器的扩展程序里面()IDM Integratio ...

  7. Google Chrome浏览器中如何使用命令

    Google Chrome浏览器中如何使用命令 | 浏览:2974 | 更新:2014-02-23 23:12 | 标签:chrome 1 2 3 分步阅读 Google Chrome浏览器有很多的特 ...

  8. [转]chrome浏览器中 F12 功能的简单介绍

    本文转自:https://www.cnblogs.com/zhuzhubaoya/p/9758648.html chrome浏览器中 F12 功能的简单介绍 由于F12是前端开发人员的利器,所以我自己 ...

  9. 【F12】chrome浏览器中 F12 功能的简单介绍

    chrome浏览器中 F12 功能的简单介绍 由于F12是前端开发人员的利器,所以我自己也在不断摸索中,查看一些博客和资料后,自己总结了一下来帮助自己理解和记忆,也希望能帮到有需要的小伙伴,嘿嘿! 首 ...

随机推荐

  1. String强制转换为Date,freemarker标签里date数据的显示问题

    String强制转换为Date,freemarker标签里date数据的显示问题 http://blog.sina.com.cn/s/blog_617f5d090101ut63.html (2014- ...

  2. LG2893/POJ3666 「USACO2008FEB」Making the Grade 线性DP+决策集优化

    问题描述 LG2893 POJ3666 题解 对于\(A\)中的每一个元素,都将存在于\(B\)中. 对\(A\)离散化. 设\(opt_{i,j}\)代表\([1,i]\),结尾为\(j\)的最小代 ...

  3. stm32环境搭建

    软件下载:https://pan.baidu.com/s/1rat9Vnm 第一部分:软件安装 1.点击安装mdk514.exe,一路next就可以了 2.使用管理员身份打开软件,点击File,进到l ...

  4. MySQL实战45讲学习笔记:第十三讲

    一.引子 经常会有同学来问我,我的数据库占用空间太大,我把一个最大的表删掉了一半的数据,怎么表文件的大小还是没变? 那么今天,我就和你聊聊数据库表的空间回收,看看如何解决这个问题. 这里,我们还是针对 ...

  5. java web开发入门五(ssh整合)基于intellig idea

    SSH整合 1.引入jar包 Struts 核心jar Hibernate 核心jar Spring Core  核心功能 Web  对web模块支持 Aop   aop支持 Orm   对hiber ...

  6. Golang 基础语法介绍及对比(二)

    传值与传参 Golong func main() { a := fmt.Println("a = ", a) // 应该输出 "a= 3" a1 := add1 ...

  7. golang中判断两个slice是否相等

    在golang中我们可以轻松地通过==来判断两个数组(array)是否相等,但遗憾的是slice并没有相关的运算符,当需要判断两个slice是否相等时我们只能另寻捷径了. slice相等的定义 我们选 ...

  8. IntelliJ IDEA最新版2019年注册码,可激活至2099年 激活 破解

    IntelliJ IDEA最新版2019年注册码,可激活至2099年 激活 破解 特别说明:图中的IDEA是2017版本,不过方法对2019版本的IDEA同样适用! 最近笔者测试了好多破解Idea的方 ...

  9. Task和async/await详解

    一.什么是异步 同步和异步主要用于修饰方法.当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法:当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务 ...

  10. Adams宏导出

    var set var=ip integer_value=1 var set var=macro_name str="" for variable_name=the_macro o ...