0x00 前言php
在後滲透階段,得到權限後須要蒐集目標系統的信息。信息越全面,越有助於進一步的滲透。對於Windows系統,用戶瀏覽器每每包含有價值的信息。html
在以前的文章《本地密碼查看工具LaZagne中的自定義腳本開發》曾介紹過利用LaZagne導出多個瀏覽器密碼的方法。python
本文將要針對Chrome瀏覽器,介紹具體的導出原理和利用方法,解決一個實際問題: 如何導出另外一系統下Chrome瀏覽器中保存的密碼?git
0x01 簡介github
本文將要介紹如下內容:sql
·Chrome瀏覽器保存密碼的方式chrome
·如何導出Chrome瀏覽器中保存的密碼shell
·經常使用方法的限制數據庫
·如何導出另外一系統下Chrome瀏覽器中保存的密碼c#
0x02 Chrome瀏覽器保存密碼的方式
正經常使用戶在訪問網站時,可選擇使用Chrome瀏覽器保存登陸的用戶密碼,用於下次登陸的時候Chrome自動填寫登陸密碼,以下圖
在Chrome中能夠查看保存的登陸密碼(須要提供用戶口令),以下圖
Chrome中保存的密碼先被二次加密,而後被保存在SQLite數據庫文件中,位置以下:
%LocalAppData%\Google\Chrome\User Data\Default\Login Data
實際測試:
測試系統: Win7x86
Chrome版本: 63.0.3239.132
定位SQLite數據庫文件,位於C:\Users\a\AppData\Local\Google\Chrome\User Data\Default\Login Data
使用工具讀取數據庫文件,測試工具: SQLiteStudio
下載地址:
https://sqlitestudio.pl/index.rvt
注:
SQLiteStudio開源,特色是支持查看十六進制數據(SQLiteSpy不支持查看十六進制數據)
成功讀取數據庫文件保存的信息,但password段沒法顯示,以下圖
選擇Form view,查看十六進制格式,得到二次加密後的用戶密碼,以下圖
注:
若是Chrome正在運行,沒法使用SQLiteStudio打開數據庫文件Login Data,可將該文件複製後再打開
0x03 導出Chrome瀏覽器中保存的密碼
首先,編寫程序實現讀取SQLite數據庫文件,這裏選擇使用python實現
開源代碼不少,因此這裏只給出一個示例
from os import getenv import sqlite3 import binascii conn = sqlite3.connect(getenv("APPDATA") + "\..\Local\Google\Chrome\User Data\Default\Login Data") cursor = conn.cursor() cursor.execute('SELECT action_url, username_value, password_value FROM logins') for result in cursor.fetchall(): print (binascii.b2a_hex(result[2]))
得到二次加密的用戶密碼,以下圖
參考Chromium開源代碼,找到Chrome作二次加密的方法: 經過Windows API CryptProtectData()實現
參考加密代碼:
CryptProtectData()的說明可參考:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa380261(v=vs.85).aspx
得到關鍵信息:
(1)對應解密函數爲CryptUnprotectData
參考地址:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa380882(v=vs.85).aspx
(2)只有與加密數據的用戶具備相同登陸憑據的用戶才能解密數據
也就是說,只能在當前用戶的憑據下解密數據
解密的開源代碼也有不少,這裏給出一個示例:
from os import getenv import sqlite3 import win32crypt import binascii conn = sqlite3.connect(getenv("APPDATA") + "\..\Local\Google\Chrome\User Data\Default\Login Data") cursor = conn.cursor() cursor.execute('SELECT action_url, username_value, password_value FROM logins') for result in cursor.fetchall(): password = win32crypt.CryptUnprotectData(result[2], None, None, None, 0)[1] print password
注:
調用win32crypt.CryptUnprotectData須要安裝pywin32
下載地址:
http://sourceforge.net/projects/pywin32/files/pywin32/Build%20219/pywin32-219.win32-py2.7.exe
執行後,還原用戶密碼,以下圖
注:
若是Chrome正在運行,沒法查詢數據庫文件Login Data,顯示sqlite3.OperationalError: database is locked
綜上,在實際導出的過程當中,若是Chrome正在運行,須要先複製數據庫文件,再嘗試解密
0x04 如何導出另外一系統下Chrome瀏覽器中保存的密碼
參照CryptProtectData()的說明,地址以下:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa380261(v=vs.85).aspx
「Usually, the only user who can decrypt the data is a user with the
same logon credentials as the user who encrypted the data.In addition,
the encryption and decryption must be done on the same computer. 「
是否能夠判定,沒法在另外一系統下導出Chrome瀏覽器中保存的密碼呢?
答案是否認的
Chrome密碼還原工具chromepass提供了一個特別的功能: Reading ChromePass passwords from external drive
chromepass下載地址:
http://www.nirsoft.net/utils/chromepass.html
說明以下:
「you can also read the passwords stored by Chrome Web browser from an
external profile in your current operating system or from another
external drive」
也就是說,使用chromepass可以導出當前系統下另外一用戶的Chrome密碼
操做界面以下圖
既然如此,若是得到了另外一系統下的相關配置文件,可否導出Chrome瀏覽器中保存的密碼呢?
固然能夠
解密須要得到三部份內容:
1.加密密鑰,位於%appdata%\Microsoft\Protect下對應sid文件夾下的文件 2.數據庫文件Login Data 3.用戶明文的密碼,用於解密加密密鑰
因爲chromepass程序的設計問題,以上文件須要組成特定格式,子目錄格式以下:
1.\AppData\Local\Google\Chrome\User Data\Default\Login Data 2.\AppData\Roaming\Microsoft\Protect{sid}}\下保存key文件
注:
{sid}必須同原系統的對應
eg.
\AppData\Local\Google\Chrome\User Data\Default\Login Data \AppData\Roaming\Microsoft\Protect\S-1-5-21-3453529135-4164765056-1075703908-1001\329c4147-0011-4ad6-829d-e32dcbd1bbd7
以下圖
使用chromepass選擇該目錄,填入用戶明文密碼,以下圖
成功解密,以下圖
0x05 開源工具
解密當前系統下Chrome瀏覽器中保存的密碼,可供參考的工具:
1.命令行工具Chrome Password Dump,下載地址:
http://securityxploded.com/chrome-password-dump.php
2.powershell實現的工具:
3.python實現代碼,可供參考的開源代碼:
from os import getenv import sqlite3 import win32crypt import binascii conn = sqlite3.connect(getenv("APPDATA") + "\..\Local\Google\Chrome\User Data\Default\Login Data") cursor = conn.cursor() cursor.execute('SELECT action_url, username_value, password_value FROM logins') for result in cursor.fetchall(): password = win32crypt.CryptUnprotectData(result[2], None, None, None, 0)[1] if password: print 'Site: ' + result[0] print 'Username: ' + result[1] print 'Password: ' + password else: print "no password found"
0x06 小結
本文介紹了導出Chrome瀏覽器密碼的原理和利用方法,成功解決一個實際問題: 經過加密密鑰文件和用戶明文密碼,可以導出另外一系統下Chrome瀏覽器中保存的密碼
若是隻得到了用戶密碼hash,可否導出呢?