看我如何從瀏覽器中獲取信用卡密碼
一.寫在前面的話
在如今信用卡時(shí)代,信用卡盜刷案例層出不窮,作案方式也是五花八門。如中間人(MITM),惡意軟件和rootkit攻擊。一旦攻擊者獲得數(shù)據(jù)訪問權(quán)限,他們會(huì)將竊取到的信用卡信息轉(zhuǎn)移到他們的服務(wù)器,然后將其用于匿名支付或出售以賺取利潤。
最近我們研究了幾款最受歡迎的四種瀏覽器—Internet Explorer(IE),Microsoft Edge,Google Chrome和Mozilla Firefox是如何存儲(chǔ)信用卡數(shù)據(jù)以及其他的安全風(fēng)險(xiǎn)。
二.記住密碼
如今許多瀏覽器為了方便用戶使用提供了記住密碼等功能。但同時(shí)也暴露了一些安全問題。就以“記住密碼”功能為例。首先我們了解下它的工作原理:瀏覽器存儲(chǔ)HTML表單數(shù)據(jù),并在請求信息時(shí)自動(dòng)填寫表單。這樣可以避免用戶重新輸入信息,節(jié)省填寫表單的時(shí)間。在研究中我們發(fā)現(xiàn)IE,Edge,Chrome和Firefox都存在記住密碼的功能。不幸的是,他們存儲(chǔ)敏感信息的方式都存在安全隱患。
在圖1中,您可以看到記住密碼功能的一個(gè)示例。
圖1
三.如何儲(chǔ)存自動(dòng)填寫的數(shù)據(jù)
自動(dòng)填寫數(shù)據(jù)基于操作系統(tǒng)(OS)的不同存儲(chǔ)在不同位置。我們看看常見的幾種瀏覽器是怎么儲(chǔ)存數(shù)據(jù)的。
IE和Edge將數(shù)據(jù)存儲(chǔ)至以下注冊表項(xiàng)
- HKEY_CURRENT_USER Software Microsoft Internet Explorer IntelliForms FormData
- HKEY_CURRENT_USER Software Classes LocalSettings Software Microsoft Windows CurrentVersion
- AppContainer Storage microsoft.microsoftedge_8wekyb3d8bbwe MicrosoftEdge IntelliForms FormData
- HKEY_CURRENT_USER Software Microsoft Internet Explorer IntelliForms Storage1
- HKEY_CURRENT_USER Software Microsoft Internet Explorer IntelliForms Storage2
Chrome將數(shù)據(jù)存儲(chǔ)在SQLite數(shù)據(jù)庫文件中
- %LocalAppData% Google Chrome User Data Default Web Data
Firefox將數(shù)據(jù)存儲(chǔ)在SQLite數(shù)據(jù)庫文件中
- %AppData% Mozilla Firefox Profiles {uniqString}。默認(rèn) formhistory.sqlite
需要注意的是IE,Edge,Chrome和Firefox都利用Windows DPAPI(數(shù)據(jù)保護(hù)接口)來加密自動(dòng)填寫數(shù)據(jù),并在下次使用之前將其解密。
四.DPAPI
DPAPI(數(shù)據(jù)保護(hù)接口)是一對調(diào)用函數(shù),為用戶和系統(tǒng)進(jìn)程提供操作系統(tǒng)級別的數(shù)據(jù)保護(hù)服務(wù)??墒俏覀冎罃?shù)據(jù)保護(hù)是操作系統(tǒng)的一部分,所以每個(gè)應(yīng)用程序都可以保護(hù)數(shù)據(jù),而不需要任何特定的加密代碼,也就是說不需要DPAPI進(jìn)行的函數(shù)調(diào)用。
那么問題來了:瀏覽器使用DPAPI函數(shù),同時(shí)加密所需的數(shù)據(jù),而且不需要用戶干預(yù)。任何腳本或代碼都可以在不需要特殊許可或提升權(quán)限的情況下就可以調(diào)用解密DPAPI函數(shù)來解密數(shù)據(jù),比如信用卡信息。
五.加密數(shù)據(jù)提取
為了從IE,Edge,Chrome和Firefox中提取信用卡數(shù)據(jù),我們需要了解兩件事情:
1.SQLite數(shù)據(jù)庫結(jié)構(gòu)
2.如何使用DPAPI解密信用卡信息
SQLite是如今很受歡迎的嵌入式數(shù)據(jù)庫軟件。它廣泛部署數(shù)據(jù)庫引擎,也用于瀏覽器,操作系統(tǒng),嵌入式系統(tǒng)(例如,移動(dòng)電話)和其它軟件。
DPAPI CryptUnprotectData函數(shù)
圖2
重要參數(shù):
pDataIn [輸入]
指向保存加密數(shù)據(jù)的DATA_BLOB結(jié)構(gòu)的指針。
ppszDataDescr [輸出,可選]
指向加密數(shù)據(jù)字符串可讀的指針。
pOptionalEntropy [輸入,可選]
指向數(shù)據(jù)加密時(shí)使用的密碼或其他附加熵的DATA_BLOB結(jié)構(gòu)的指針 。
pPromptStruct [輸入,可選]
指向CRYPTPROTECT_PROMPTSTRUCT結(jié)構(gòu)的指針,該結(jié)構(gòu)提供有關(guān)顯示提示的位置和時(shí)間以及這些提示的內(nèi)容應(yīng)該是什么內(nèi)容的信息。該參數(shù)可以設(shè)置為NULL。
pDataOut [輸出]
指向接收解密數(shù)據(jù)的DATA_BLOB結(jié)構(gòu)的指針。
六.Chrome案例研究
1.Chrome SQLite存儲(chǔ)文件
圖3通過使用“DB Browser for SQLite”工具顯示Chrome的自動(dòng)填寫數(shù)據(jù)(在Web數(shù)據(jù)SQLite文件下)。
請注意,Chrome會(huì)將信用卡詳細(xì)信息保存在一個(gè)名為“credit_cards”的單獨(dú)表格中
圖3
正如你所看到的,所有的細(xì)節(jié)都是明文的,除了card_number字段,它為一個(gè)加密的BlobData字段。
在圖4中,您可以看到其他保存的表格,其中的數(shù)據(jù)也未加密。
圖4
2.Chrome DPAPI調(diào)用
Chrome瀏覽器允許用戶通過設(shè)置來查看存儲(chǔ)的信用卡信息,你在地址欄輸入chrome:// settings / AutoFill就可以看見了。
圖5
正如你看到的,我們有一張編號“4916 4182 7187 7549”的信用卡。當(dāng)要求查看信用卡信息時(shí),或者瀏覽器嘗試自動(dòng)填寫表單字段時(shí),會(huì)調(diào)用用于解密數(shù)據(jù)的DPAPI功能。
在圖6中,您可以看到Chrome API對DPAPI函數(shù)-CryptUnProtectData()的調(diào)用。參數(shù)pDataOut-> pbdata指向返回的解密數(shù)據(jù)(參見函數(shù)聲明和pDataOut參數(shù))。
*您可以在pDataOut-> pbdata的地址空間中看到卡號“4916 4182 7187 7549” 。
圖6
圖6- API監(jiān)視器,Chrome瀏覽器調(diào)用DPAPI CryptUnprotectData()函數(shù)
無獨(dú)有偶,IE和Edge瀏覽器在自動(dòng)填寫用戶表單字段時(shí)使用相同的過程。
唯一的區(qū)別是IE和Edge將他們的自動(dòng)填寫數(shù)據(jù)作為加密的BlobData存儲(chǔ)在注冊表中。
至于Firefox,您也可以使用“DB Browser for SQLite”工具查看未加密的數(shù)據(jù)。
七.深入探索代碼
在了解這些情況之后,我們可以從以下兩點(diǎn)來編寫我們POC:
1.將處理SQLite數(shù)據(jù)庫(適用于Chrome和Firefox)和DPAPI的軟件包導(dǎo)入到我們的項(xiàng)目中。
2.使用DPAPI函數(shù)來解密瀏覽器的自動(dòng)填寫的BlobData。
Chrome代碼(C#)
第1行 – 定義Chrome自動(dòng)填寫數(shù)據(jù)庫文件的路徑(應(yīng)該關(guān)閉Chrome才能訪問該文件)。
第2行 – 定義存儲(chǔ)信用卡詳細(xì)信息的表的名稱。
- string SQLiteFilePath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)+ "\Google\Chrome\User Data\Default\Web Data";
- string tableName = "credit_cards";
- . . .
第1-5行定義到db的連接,以及查詢所需的表(credit_cards)。
第7-8行將所需數(shù)據(jù)返回到DB DataTable對象(此對象表示一個(gè)內(nèi)存數(shù)據(jù)表)。
- string ConnectionString = "data source=" + SQLiteFilePath + ";New=True;UseUTF16Encoding=True";
- string sql = string.Format("SELECT * FROM {0} ", tableName);
- SQLiteConnection connect = new SQLiteConnection(ConnectionString)
- SQLiteCommand command = new SQLiteCommand(sql, connect);
- SQLiteDataAdapter adapter = new SQLiteDataAdapter(command);
- DataTable DB = new DataTable();
- adapter.Fill(DB);
- ................
第1行從DB對象中提取加密的BlobData字段(信用卡號)。
第2行發(fā)送加密的BlobData進(jìn)行解密。
- byte[] byteArray = (byte[])DB.Rows[i][4];
- byte[] decrypted = DPAPI.Decrypt(byteArray, entropy, out description);
- . . .
- }
IE & Edge code (C++)- –
第1行定義了一個(gè)DATA_BLOB對象,該對象將保存加密數(shù)據(jù)(自動(dòng)填寫注冊表值)。
第2行定義了一個(gè)DATA_BLOB對象,該對象將保存解密的數(shù)據(jù)(自動(dòng)填寫注冊表值)。
第4-8行定義了注冊碼。(這些注冊表鍵都保存著reg值,它們保存著自動(dòng)填寫B(tài)lob數(shù)據(jù))。
- DATA_BLOB DataIn;
- DATA_BLOB DataVerify;
- std::vector<LPCWSTR> RegKeys;
- RegKeys.push_back(L"Software\Microsoft\Internet Explorer\IntelliForms\FormData");
- RegKeys.push_back(L"Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\AppContainer\Storage\microsoft.microsoftedge_8wekyb3d8bbwe\MicrosoftEdge\IntelliForms\FormData");
- RegKeys.push_back(L"Software\Microsoft\Internet Explorer\IntelliForms\Storage1");
- RegKeys.push_back(L"Software\Microsoft\Internet Explorer\IntelliForms\Storage2");
- . . .
剩下要做的就是運(yùn)行每個(gè)注冊表項(xiàng),并為每個(gè)注冊表項(xiàng)提取其注冊表值(自動(dòng)填寫B(tài)lobData)。
- for (int i = 0; i < 4; i++)
- {
- RegOpenKeyEx(HKEY_CURRENT_USER, RegKeys[i], 0, KEY_QUERY_VALUE, &hKey)
- for (int j = 0; j < keyValues.size(); j++)
- {
- RegQueryValueEx(hKey, keyValues[j].c_str(), 0, 0, (LPBYTE)dwReturn, &dwBufSize);
- . . .
為了將數(shù)據(jù)發(fā)送到解密函數(shù)(decryptContentDPAPI是CryptUnProtectData()函數(shù)的包裝函數(shù)),我們需要將返回的自動(dòng)填寫B(tài)lobData(通過RegQueryValueEx調(diào)用獲?。┺D(zhuǎn)換為DATA_BLOB對象。解密后的數(shù)據(jù)將被返回到DataVerify對象中。
- DataIn.cbData = dwBufSize;
- DataIn.pbData = dwReturn;
- decryptContentDPAPI(&DataIn,&DataVerify);
- . . .
八.寫在最后的話
綜上所述,問題的根源在于使用了DPAPI,正因?yàn)檫@樣惡意軟件和木馬就可以在不需要用戶干預(yù)的情況下自動(dòng)解密數(shù)據(jù)。提取到用戶數(shù)據(jù),例如信用卡和密碼數(shù)據(jù)。
一些建議:
第一,禁用瀏覽器的自動(dòng)填寫選項(xiàng)。
第二,盡量不要在瀏覽器中填寫關(guān)于信用卡的數(shù)據(jù),更不要在不安全的網(wǎng)絡(luò)環(huán)境進(jìn)行交易。
參考文獻(xiàn)
- https://msdn.microsoft.com/en-us/library/ms995355.aspx
- https://www.sqlite.org/
- https://www.kraftkennedy.com/roaming-internet-explorer-chrome-user-saved-passwords-ue-v/
- https://msdn.microsoft.com/en-us/library/windows/desktop/aa380882(v=vs.85).aspx
- https://msdn.microsoft.com/en-us/library/windows/desktop/aa380261(v=vs.85).aspx