渗透技巧——导出Chrome浏览器中保存的密码
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()实现
参考加密代码:
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实现的工具:
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浏览器中保存的密码的更多相关文章
- 导出Chrome浏览器中保存的密码
title: 导出Chrome浏览器中保存的密码 date: 2018-02-11 17:54:51 tags: --- 导出Chrome浏览器中保存的密码 先知看到的,挺有意思,记录一下 不同浏览器 ...
- 在Chrome浏览器中保存的密码有多安全?
本文由 伯乐在线 - 黄利民 翻译.未经许可,禁止转载!英文出处:howtogeek.欢迎加入翻译组. [2013-08-09 更新]:最近又开始讨论“Chrome浏览器明文保存密码这个话题了,国外一 ...
- 如何查看chrome浏览器已保存的密码
该方法是针对在chrome中已经存储了登陆密码的情况. chrome版本是 66.0.3359.139(正式版本) (64 位),不知道哪天会改了这个bug. 一般来说,我们登陆chrome浏览器已经 ...
- 简单绕过Chrome密码查看逻辑,查看浏览器已保存的密码
简单绕过Chrome密码查看逻辑,查看浏览器已保存的密码 利用场景: 同事或朋友外出有事,电脑未锁屏离开座位.可以利用这一间隙,查看Ta在Chrome浏览器上保存的账号密码 查看逻辑: 当我们要查 ...
- 忘记常访问网站密码怎么办?教你如何查看浏览器已保存的密码,如何简单查看Chome浏览器保存的密码?
利用场景: 同事或朋友外出有事,电脑未锁屏离开座位.可以利用这一间隙,查看Ta在Chrome浏览器上保存的账号密码 查看逻辑: 当我们要查看Chrome浏览器上保存的密码时,点击显示,会弹出一个对话框 ...
- 将Chrome浏览器中的扩展程序导出为crx插件文件
将Chrome浏览器中安装的插件程序导出为crx插件文件 以360急速浏览器为例进行导出crx插件程序 1.在Chrom商店中找到需要的插件,安装到浏览器的扩展程序里面()IDM Integratio ...
- Google Chrome浏览器中如何使用命令
Google Chrome浏览器中如何使用命令 | 浏览:2974 | 更新:2014-02-23 23:12 | 标签:chrome 1 2 3 分步阅读 Google Chrome浏览器有很多的特 ...
- [转]chrome浏览器中 F12 功能的简单介绍
本文转自:https://www.cnblogs.com/zhuzhubaoya/p/9758648.html chrome浏览器中 F12 功能的简单介绍 由于F12是前端开发人员的利器,所以我自己 ...
- 【F12】chrome浏览器中 F12 功能的简单介绍
chrome浏览器中 F12 功能的简单介绍 由于F12是前端开发人员的利器,所以我自己也在不断摸索中,查看一些博客和资料后,自己总结了一下来帮助自己理解和记忆,也希望能帮到有需要的小伙伴,嘿嘿! 首 ...
随机推荐
- org.apache.commons.httpclient工具类(封装的HttpUtil)
import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java ...
- 201871010136-赵艳强《面向对象程序设计(java)》第十二周学习总结
201871010136-赵艳强<面向对象程序设计(java)>第十二周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh ...
- mybatis-config.xml 知识点
typeAliases 标签:配置别名,主要用于 XML 文件中的 resultType 参数. mappers 标签:配置所有的 mapper. MyBatis 和 Spring Boot 配合使用 ...
- halcon笔记1
* 获得二值图 Image_binread_image(Image, 'C:/Alex/halcon/test.bmp') // 读图 threshold (Image, Regions, , ) / ...
- Chrome 禁止 http 自动转化为https
Chrome 浏览器 地址栏中输入 chrome://net-internals/#hsts 在 Delete domain security policies 中输入项目的域名,并 Delete 删 ...
- [LeetCode] 34. Find First and Last Position of Element in Sorted Array 在有序数组中查找元素的第一个和最后一个位置
Given an array of integers nums sorted in ascending order, find the starting and ending position of ...
- DevC++中的[Error](不定期更新)
ld returned 1 exit status 程序是没有问题的,可能的问题最有可能是以下2个 1.是你的程序已经在运行,关闭原来的程序就可以正常了 2.你机器上有杀毒(安全)软件阻止了你程序的生 ...
- Github库名命名规范
必要性说明 由于迁移到Github上的项目越来越多,对项目的管理越来越困难.由于各项目命名具有随意性,用之代表git仓库名后就很难快速回忆起这个项目的相关细节,通常需要不断打开某个库才能有所了解.因此 ...
- C# HTTP系列1 HttpWebRequest类
系列目录 [已更新最新开发文章,点击查看详细] .NET Framework 中 System.Net 命名空间下提供了 HttpWebRequest 和 HttpWebResponse 2个 ...
- 初始socket模块和巧解粘包问题
1.什么是socket? 两个进程如果需要进行通讯最基本的一个前提能够唯一的标示一个进程,在本地进程通讯中我们可以使用PID来唯一标示一个进程,但PID只在本地唯一,网络中的两个进程PID冲突几率很大 ...