關(guān)于微信數(shù)據(jù)庫的解密以及取證
前言
之前研究過一段時間的wx聊天記錄解密,以及小程序解密,但是在晚上陸續(xù)搜了幾篇文章后發(fā)現(xiàn)解密教程要么下載Visual Studio,不然就是對web安全人員不友好的od調(diào)試,而且根據(jù)系統(tǒng)的不同,解密方法也不同,于是作者用為數(shù)不多的編程知識寫出了這篇教程- -在這里記錄一下解密的原理以及一些方法分享給大家。
1.原理
SQLite 是一個輕量級的、開源的關(guān)系型數(shù)據(jù)庫,是目前移動平臺(如 iOS、Android)數(shù)據(jù)庫的最佳選擇。然而免費(fèi)版的 SQLite 是不支持加密的(官網(wǎng)下的默認(rèn)就是免費(fèi)版的) ,這就導(dǎo)致了存儲在 SQLite 中的數(shù)據(jù)很容易被人查看到,不法分子可能會利用數(shù)據(jù)庫表結(jié)構(gòu)及內(nèi)容字段分析我們的應(yīng)用,進(jìn)而發(fā)起攻擊。出于安全的考慮,我們當(dāng)然要對數(shù)據(jù)庫文件進(jìn)行加密。
微信數(shù)據(jù)庫的類型是sqlite,不管是ios還是mac還是win或者安卓,區(qū)別在于每個數(shù)據(jù)庫都加密了但是加密的密鑰不同,這里win和mac主要采用從遠(yuǎn)程服務(wù)器獲取一些信息加上本地的某些信息通過一系列算法生成的密鑰通過AES加密的,AES的密鑰是32位,而且所有數(shù)據(jù)庫文件共用一個密鑰,我們需要找到那個AES密鑰才能進(jìn)行解密,然后才能對數(shù)據(jù)庫文件進(jìn)行操作。但是安卓和ios不同,通過翻閱一些文章發(fā)現(xiàn),手機(jī)端的數(shù)據(jù)庫生成的密鑰是通過本地已有數(shù)據(jù)進(jìn)行生成的密鑰,僅有7位,我們可以通過暴力破解的方式獲取密鑰。
解密PC數(shù)據(jù)庫 一般都是通過od附加微信進(jìn)行動態(tài)調(diào)試 https://bbs.pediy.com/thread-251303.htm還有一種辦法就是通過尋找微信模塊的地址然后加上偏移量就能獲取密鑰以及一些用戶信息,但是這也有個問題就是當(dāng)每次微信版本更新時偏移量也會隨之改變,我看到解決方法是作者需要每個版本獲取偏移量,然后更新工具這樣也很麻煩。
于是根據(jù)別人的文章分析了一下,如果說每次偏移量都會變但是相關(guān)信息的數(shù)據(jù)結(jié)構(gòu)的相對便宜量不會變,這種方式可以全版本通用,通俗一點(diǎn)來講就是,每次私鑰和wxid的字符串地址雖然會變但是相對位置不變,我可以通過wxid的字符串加減多少一定能找到私鑰的地址。
2.分析
這里我首先通過往常一樣的動調(diào)發(fā)現(xiàn),在密鑰出現(xiàn)的上下地址中存在另一種公鑰和私鑰的字符串-----BEGIN PUBLIC KEY-----\n...這不就是一個很好的特征嗎于是我們首先通過python中的pymem模塊來操作內(nèi)存,至于為什么要用這個模塊的,因?yàn)樗麑Τ鯇W(xué)者比較友好里面封裝了很多函數(shù),很方便調(diào)用適合我這種對win系統(tǒng)不了解的人,按照這個思路我們先找到-----BEGIN PUBLIC KEY-----字符串的地址,再去反向搜索這個地址的地址,根據(jù)測試這個地址一般是大于WeChatWin.dll 但也不是絕對有些情況會導(dǎo)致搜不到這個字符串地址。
但是這里出現(xiàn)了一個問題,我在學(xué)習(xí)pymem的過程中通過翻閱文檔發(fā)現(xiàn)有一個全局搜索函數(shù)pattern_scan_all,但是通過實(shí)際下載pymem模塊時候卻沒有了這個函數(shù),于是我這里只好自己把這個函數(shù)再重新寫一遍。```def pattern_scan_all(handle, pattern, *, return_multiple=False):
brew install sqlcipher
這里我們寫好了相關(guān)解密腳本結(jié)果mac數(shù)據(jù)庫和win數(shù)據(jù)庫采用的加密方式不同,于是我又去了解了一下。
傳入密鑰
通過Rand_bytes算法生成16個字節(jié)的salt,并存儲在數(shù)據(jù)庫第一頁的頭部(SQLite3的db文件,頭部前16個字節(jié)固定為SQLite 3 format,所以可以利用文件頭來存儲一些數(shù)據(jù))。
通過PKCS5_PBKDF2_HMAC_SHA1算法將密鑰和salt一起加密并多次迭代,生成AES加密所用的key;此處是對key的加密,即使原始的密碼泄露,也無法解密數(shù)據(jù)。
通過AES對稱加密算法對每一頁的文件內(nèi)容(有效的內(nèi)容,不包含文件頭和reserved字段)進(jìn)行加密。
加密時,文件執(zhí)行過AES加密后,對文件內(nèi)容,通過Hmac算法,獲取文件校驗(yàn)碼,填充在page尾部(SQLite3提供了reserved字段,自動在page尾部預(yù)留一段空間)。
解密時,先調(diào)用Hmac算法獲取文件標(biāo)識碼,與page尾部的數(shù)據(jù)進(jìn)行對比,如果數(shù)據(jù)一致,則證明文件沒有被篡改過,不然證明文件已經(jīng)被篡改,則拋出異常。
PS:以上為默認(rèn)的算法,sqlCipher沒有固定算法,用戶可以自己設(shè)置。
經(jīng)測試windows系統(tǒng)的wx數(shù)據(jù)庫就是用上述加密方式,首先會通過讀取文件頭生成16個字節(jié)的salt,再使用PBKDF2_HMAC_SHA1算法設(shè)置迭代次數(shù)為64000次生成的密鑰這樣的話解密就很簡單了
這里也遇到了坑 key可以有兩種表現(xiàn)方式,一種是單純字符串口令,另一種就是原始密鑰,我們從內(nèi)存中獲取的是原始密鑰所以要輸入的是PRAGMA key = "x'密鑰'"我們回到mac密鑰的獲取,因?yàn)閙ac的權(quán)限管理做的很死,我們首先需要關(guān)閉SIP(系統(tǒng)完整性保護(hù))
系統(tǒng)完整性保護(hù)(SIP)是 OS X El Capitan 及更高版本所采用的一項(xiàng)安全技術(shù),旨在幫助防止?jié)撛趷阂廛浖薷?Mac 上受保護(hù)的文件和文件夾,但這也造成了安裝某些特殊版本軟件的或者做特殊修改的時候權(quán)限不足。在這里就體現(xiàn)在使用 LLDB 調(diào)試時候,所有的調(diào)試語句都會被系統(tǒng)拒絕,因此在正式進(jìn)行調(diào)試之前,一個重要的準(zhǔn)備工作就是檢查系統(tǒng)完整性保護(hù)(SIP)的開啟狀態(tài),如果開啟的話,要把它關(guān)閉。
檢查 SIP 的開啟狀態(tài)
在終端里輸入 csrutil status 回車,如果看到:
這說明的 SIP 已經(jīng)開啟,如果要繼續(xù)調(diào)試的話,需要關(guān)閉。如果是 System Integrity Protection status: disabled. 則說明 SIP 已經(jīng)處于關(guān)閉狀態(tài),可以直接進(jìn)行調(diào)試。
- 重啟,并在開機(jī)的時候長按 Command 和 R
- 進(jìn)入系統(tǒng)恢復(fù)狀態(tài)
- 點(diǎn)擊屏幕頂部工具欄上的 實(shí)用工具,選擇終端
- 在終端中輸入 csrutil disable 回車,會出現(xiàn)下述字符串,再次重啟生效
然后我們就可以開始調(diào)試微信了
1. 打開電腦端微信(不要登陸)
2. 在Terminal輸入命令lldb -p $(pgrep WeChat)
3. 輸入br set -n sqlite3_key,回車
4. 輸入c,回車
5. 手機(jī)掃碼登陸電腦端微信
6. 這時候電腦端微信是會卡在登陸界面的,不需要擔(dān)心,回到Terminal
7. 輸入memory read --size 1 --format x --count 32 $rsi,回車就可以獲取到了密鑰
這里我們可以直接PRAGMA cipher_compatibility = 3就可以設(shè)置好解密參數(shù)了 ,這是一個標(biāo)準(zhǔn)
解密效果如下
3.一些其它功能
微信在2022.06月之后更改了傳輸文件存儲位置,和每個人聊天所傳輸?shù)奈募环旁诓煌奈募A下,大大提升了我們尋找歷史文件的難度,于是我寫了個整合文件名輸出的功能
還有就是壓縮功能可以分別壓縮數(shù)據(jù)庫,圖片,歷史傳輸文件
4.碎碎念
原先想繼續(xù)完善安卓和ios的解密腳本來著,但是作者馬上要開始準(zhǔn)備秋招了沒時間寫,等過段時間再更新下,寫這篇文章的目的是想讓大家接觸下電子取證這個方向的知識,不僅僅是微信還有一些社交軟件都可以嘗試去分析下,例如soul,陌陌,qq等。不限于app甚至是阿里云鏡像取證,這個方向也有很多知識值得學(xué)習(xí)。