滲透技巧——導出Chrome瀏覽器中保存的密碼
0x00 前言
在後滲透階段,獲得許可權後需要搜集目標系統的信息。信息越全面,越有助於進一步的滲透。對於Windows系統,用戶瀏覽器往往包含有價值的信息。
在之前的文章《本地密碼查看工具LaZagne中的自定義腳本開發》曾介紹過利用LaZagne導出多個瀏覽器密碼的方法。
本文將要針對Chrome瀏覽器,介紹具體的導出原理和利用方法,解決一個實際問題: 如何導出另一系統下Chrome瀏覽器中保存的密碼?
0x01 簡介
本文將要介紹以下內容:
·Chrome瀏覽器保存密碼的方式
·如何導出Chrome瀏覽器中保存的密碼
·常用方法的限制
·如何導出另一系統下Chrome瀏覽器中保存的密碼
0x02 Chrome瀏覽器保存密碼的方式
正常用戶在訪問網站時,可選擇使用Chrome瀏覽器保存登錄的用戶密碼,用於下次登錄的時候Chrome自動填寫登錄密碼,如下圖
在Chrome中可以查看保存的登錄密碼(需要提供用戶口令),如下圖
Chrome中保存的密碼先被二次加密,然後被保存在SQLite資料庫文件中,位置如下:
%LocalAppData%GoogleChromeUser DataDefaultLogin Data
實際測試:
測試系統: Win7x86
Chrome版本: 63.0.3239.132
定位SQLite資料庫文件,位於C:UsersaAppDataLocalGoogleChromeUser DataDefaultLogin 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") + "..LocalGoogleChromeUser DataDefaultLogin 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()實現
參考加密代碼:
https://github.com/scheib/chromium/blob/eb7e2441dd8878f733e43799ea77c2bab66816d3/chrome/browser/password_manager/password_store_win_unittest.cc#L107
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") + "..LocalGoogleChromeUser DataDefaultLogin 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%MicrosoftProtect下對應sid文件夾下的文件
2.資料庫文件Login Data
3.用戶明文的密碼,用於解密加密密鑰
由於chromepass程序的設計問題,以上文件需要組成特定格式,子目錄格式如下:
1.AppDataLocalGoogleChromeUser DataDefaultLogin Data
2.AppDataRoamingMicrosoftProtect}下保存key文件
註:
必須同原系統的對應
eg.
AppDataLocalGoogleChromeUser DataDefaultLogin Data
AppDataRoamingMicrosoftProtectS-1-5-21-3453529135-4164765056-1075703908-1001329c4147-0011-4ad6-829d-e32dcbd1bbd7
如下圖
使用chromepass選擇該目錄,填入用戶明文密碼,如下圖
成功解密,如下圖
0x05 開源工具
解密當前系統下Chrome瀏覽器中保存的密碼,可供參考的工具:
1.命令行工具Chrome Password Dump,下載地址:
http://securityxploded.com/chrome-password-dump.php
2.powershell實現的工具:
https://raw.githubusercontent.com/EmpireProject/Empire/master/data/module_source/collection/Get-ChromeDump.ps1
3.python實現代碼,可供參考的開源代碼:
from os import getenv
import sqlite3
import win32crypt
import binascii
conn = sqlite3.connect(getenv("APPDATA") + "..LocalGoogleChromeUser DataDefaultLogin 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,能否導出呢?


TAG:嘶吼RoarTalk |