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