题目信息

题目名:我没有py-新(我没有py)

题目描述:

旧题描述:

他说他没有py,他可是不是没有py的。啪的一下,就解出了1cePeak的压轴题,很快啊。

链接:https://pan.baidu.com/s/1ds8L-NIJWWkXO88FRiqvdg 提取码:ft1e

附件下载:我没有py.zip(966.5M)

新题描述:

昨天下午,出题人本人公开发表了过激的言论,在此向大家致歉。当然,我所说的更多是因为对这种现象的气愤,最近CTF圈的乱象愈演愈烈,有的队伍频频闹出笑话,相信大家也都有目共睹。我相信每一个热爱CTF的人都不希望CTF圈再这样腐烂下去。我出这道题的初衷,也是想嘲讽这种现象。在此,希望借以此题,能与大家共勉,一起维护CTF圈的纯净!最后,祝大家玩得开心!

由于一天时间没有人用正解做出此题,所以附上提示:微信版本是:3.0.0.57

链接:https://pan.baidu.com/s/1qh-Vi5Xo8sUrHjBnI6AKcQ 提取码:itww

附件下载:py3.zip(1.15G)

题目来源:NepCTF

新旧题都差不多,不过新题确实要难一点,还是按部就班的都来走一遍

做题流程

打开附件,是一个镜像跟一个尚不清楚有什么用的文件a

内存取证题,最开始当然是先要分析给的文件了

> volatility -f WIN-MREMF575OV9-20210321-015808.raw imageinfo
Volatility Foundation Volatility Framework 2.6
INFO    : volatility.debug    : Determining profile based on KDBG search...
          Suggested Profile(s) : Win7SP1x64, Win7SP0x64, Win2008R2SP0x64, Win2008R2SP1x64_23418, Win2008R2SP1x64, Win7SP1x64_23418
                     AS Layer1 : WindowsAMD64PagedMemory (Kernel AS)
                     AS Layer2 : FileAddressSpace (WIN-MREMF575OV9-20210321-015808.raw)
                      PAE type : No PAE
                           DTB : 0x187000L
                          KDBG : 0xf800040410a0L
          Number of Processors : 1
     Image Type (Service Pack) : 1
                KPCR for CPU 0 : 0xfffff80004042d00L
             KUSER_SHARED_DATA : 0xfffff78000000000L
           Image date and time : 2021-03-21 01:58:09 UTC+0000
     Image local date and time : 2021-03-21 09:58:09 +0800

看起来volatility建议我们把这个镜像看做是Win7SP1x64的镜像,接下来看看镜像中正在运行的进程

> volatility -f WIN-MREMF575OV9-20210321-015808.raw --profile=Win7SP1x64 pstree
Volatility Foundation Volatility Framework 2.6
Name                                                  Pid   PPid   Thds   Hnds Time
-------------------------------------------------- ------ ------ ------ ------ ----
 0xfffffa800367b910:csrss.exe                         412    396     10    472 2021-03-17 06:50:12 UTC+0000
. 0xfffffa8003af3820:conhost.exe                     3280    412      2     58 2021-03-21 01:58:08 UTC+0000
 0xfffffa8003a10060:winlogon.exe                      504    396      5    115 2021-03-17 06:50:12 UTC+0000
 0xfffffa80018bab30:System                              4      0     88    569 2021-03-17 06:50:10 UTC+0000
. 0xfffffa8002c899f0:smss.exe                         264      4      2     29 2021-03-17 06:50:10 UTC+0000
 0xfffffa80018cd630:wininit.exe                       404    340      3     76 2021-03-17 06:50:12 UTC+0000
. 0xfffffa8003a01910:services.exe                     476    404     13    224 2021-03-17 06:50:12 UTC+0000
.. 0xfffffa8003e8c060:vmtoolsd.exe                   1496    476     11    273 2021-03-17 06:50:14 UTC+0000
.. 0xfffffa8003fb78f0:msdtc.exe                       664    476     12    147 2021-03-17 06:50:19 UTC+0000
.. 0xfffffa8003b5d740:svchost.exe                     772    476     21    511 2021-03-17 06:50:13 UTC+0000
... 0xfffffa8003bf7060:audiodg.exe                   4068    772      6    134 2021-03-21 01:51:26 UTC+0000
.. 0xfffffa8003cae320:spoolsv.exe                    1060    476     12    262 2021-03-17 06:50:13 UTC+0000
.. 0xfffffa8003bc3b30:svchost.exe                     936    476     34   1013 2021-03-17 06:50:13 UTC+0000
.. 0xfffffa8003cf8200:svchost.exe                    1116    476     19    326 2021-03-17 06:50:13 UTC+0000
.. 0xfffffa8003c1bb30:svchost.exe                     304    476     15    496 2021-03-17 06:50:13 UTC+0000
.. 0xfffffa800196f250:sppsvc.exe                     2696    476      4    152 2021-03-17 06:52:16 UTC+0000
.. 0xfffffa8003b25060:vm3dservice.ex                  696    476      3     44 2021-03-17 06:50:13 UTC+0000
.. 0xfffffa8003d8ab30:taskhost.exe                   1216    476      9    218 2021-03-17 06:50:14 UTC+0000
.. 0xfffffa8003e656b0:svchost.exe                    2400    476     13    214 2021-03-17 06:51:15 UTC+0000
.. 0xfffffa8001cafb30:PresentationFo                 3012    476      6    158 2021-03-17 07:10:18 UTC+0000
.. 0xfffffa8003c18b30:svchost.exe                     204    476     13    404 2021-03-17 06:50:13 UTC+0000
.. 0xfffffa8003b3a740:svchost.exe                     720    476      8    296 2021-03-17 06:50:13 UTC+0000
.. 0xfffffa8003aaeb30:svchost.exe                     632    476     11    369 2021-03-17 06:50:13 UTC+0000
... 0xfffffa8003b8e270:WmiPrvSE.exe                  1212    632      9    207 2021-03-17 06:50:16 UTC+0000
.. 0xfffffa8003de9b30:VGAuthService.                 1368    476      3     82 2021-03-17 06:50:14 UTC+0000
.. 0xfffffa8003f778e0:SearchIndexer.                 2212    476     13    691 2021-03-17 06:50:20 UTC+0000
... 0xfffffa8001aee060:SearchProtocol                1072   2212      8    276 2021-03-21 01:58:05 UTC+0000
... 0xfffffa8001d4db30:SearchFilterHo                3964   2212      5     81 2021-03-21 01:58:05 UTC+0000
.. 0xfffffa8001978b30:svchost.exe                    2768    476     13    322 2021-03-17 06:52:16 UTC+0000
.. 0xfffffa8003bbf890:svchost.exe                     880    476     13    316 2021-03-17 06:50:13 UTC+0000
... 0xfffffa8003e0b3c0:dwm.exe                       1400    880      3     75 2021-03-17 06:50:14 UTC+0000
.. 0xfffffa8004041b30:svchost.exe                    1908    476      6     91 2021-03-17 06:50:16 UTC+0000
. 0xfffffa8003a095a0:lsass.exe                        484    404      7    639 2021-03-17 06:50:12 UTC+0000
. 0xfffffa8003a0d5f0:lsm.exe                          492    404     10    157 2021-03-17 06:50:12 UTC+0000
 0xfffffa8003783060:csrss.exe                         352    340      9    451 2021-03-17 06:50:12 UTC+0000
 0xfffffa8003e292d0:explorer.exe                     1428   1336     37   1134 2021-03-17 06:50:14 UTC+0000
. 0xfffffa8001d17060:VeraCrypt.exe                   3872   1428      4    211 2021-03-21 01:39:49 UTC+0000
. 0xfffffa8003ee2b30:vmtoolsd.exe                    1584   1428      9    251 2021-03-17 06:50:15 UTC+0000
. 0xfffffa8001ec7b30:notepad.exe                      428   1428      1     62 2021-03-21 01:45:47 UTC+0000
. 0xfffffa800206a290:DumpIt.exe                      1204   1428      2     45 2021-03-21 01:58:08 UTC+0000
. 0xfffffa8001b669e0:iexplore.exe                    3016   1428     14    568 2021-03-17 07:02:18 UTC+0000
.. 0xfffffa8001bdab30:iexplore.exe                   2228   3016     17    699 2021-03-17 07:02:18 UTC+0000
.. 0xfffffa8001ec2060:iexplore.exe                    100   3016     15    396 2021-03-17 07:07:08 UTC+0000
.. 0xfffffa8001c0d450:iexplore.exe                   3028   3016     15    415 2021-03-17 07:03:31 UTC+0000
. 0xfffffa8003e69b30:vm3dservice.ex                  1576   1428      2     53 2021-03-17 06:50:15 UTC+0000
. 0xfffffa8001f44340:WeChat.exe                      3140   1428     45    836 2021-03-21 01:39:12 UTC+0000
.. 0xfffffa8001ed4060:WeChatApp.exe                  2964   3140     49    563 2021-03-21 01:40:42 UTC+0000
.. 0xfffffa8001d58b30:wechatweb.exe                  2108   3140      6    162 2021-03-21 01:39:12 UTC+0000
 0xfffffa8001bde440:WeChat.exe                        296    596      0 ------ 2021-03-17 07:07:40 UTC+0000

显然,我们得重点关注一下这几个看起来很不错的进程

0xfffffa8001b669e0:iexplore.exe   #ie浏览器
0xfffffa800206a290:DumpIt.exe      #用于生成镜像文件
0xfffffa8001f44340:WeChat.exe      #微信
0xfffffa8001d17060:VeraCrypt.exe  #用于磁盘加密 
0xfffffa8001ec7b30:notepad.exe    #记事本文件

让我们来看看notepad里有什么

一般来说,对于处在进程中的notepad,最直接的方式就是dump出进程然后看看里面有没有什么可疑的字符串

> volatility -f WIN-MREMF575OV9-20210321-015808.raw --profile=Win7SP1x64 memdump -p 428 -D .
Volatility Foundation Volatility Framework 2.6
************************************************************************
Writing notepad.exe [   428] to 428.dmp

但是事实上,从300M乱码里找个字符串是不容易的,即使使用string再寻找也是一样,这里其实还有更优雅的方式:editbox插件得到编辑控件的信息

> volatility -f WIN-MREMF575OV9-20210321-015808.raw --profile=Win7SP1x64 editbox
Volatility Foundation Volatility Framework 2.6
******************************
Wnd Context       : 1\WinSta0\Default
Process ID        : 3016
ImageFileName     : iexplore.exe
IsWow64           : Yes
atom_class        : 6.0.7601.17514!Edit
value-of WndExtra : 0x520e90
nChars            : 0
selStart          : 0
selEnd            : 0
isPwdControl      : False
undoPos           : 0
undoLen           : 0
address-of undoBuf: 0x0
undoBuf           :
-------------------------

******************************
Wnd Context       : 1\WinSta0\Default
Process ID        : 3016
ImageFileName     : iexplore.exe
IsWow64           : Yes
atom_class        : 6.0.7601.17514!Edit
value-of WndExtra : 0x51e490
nChars            : 37
selStart          : 0
selEnd            : 0
isPwdControl      : False
undoPos           : 0
undoLen           : 0
address-of undoBuf: 0x0
undoBuf           :
-------------------------
http://www.downcc.com/soft/15022.html
******************************
Wnd Context       : 1\WinSta0\Default
Process ID        : 1428
ImageFileName     : explorer.exe
IsWow64           : No
atom_class        : 6.0.7601.17514!Edit
value-of WndExtra : 0x47f2060
nChars            : 0
selStart          : 0
selEnd            : 0
isPwdControl      : False
undoPos           : -1
undoLen           : 0
address-of undoBuf: 0x0
undoBuf           :
-------------------------

******************************
Wnd Context       : 1\WinSta0\Default
Process ID        : 3872
ImageFileName     : VeraCrypt.exe
IsWow64           : No
atom_class        : 6.0.7601.17514!Edit
value-of WndExtra : 0x3a04a0
nChars            : 0
selStart          : 0
selEnd            : 0
isPwdControl      : False
undoPos           : -1
undoLen           : 0
address-of undoBuf: 0x0
undoBuf           :
-------------------------

******************************
Wnd Context       : 1\WinSta0\Default
Process ID        : 428
ImageFileName     : notepad.exe
IsWow64           : No
atom_class        : 6.0.7601.17514!Edit
value-of WndExtra : 0x390730
nChars            : 12
selStart          : 12
selEnd            : 12
isPwdControl      : False
undoPos           : 0
undoLen           : 0
address-of undoBuf: 0x0
undoBuf           :
-------------------------
I_didn't_py2

好的,最后一个模块中返回了记事本里编辑了的信息"I_didn't_py2",显然这是一个有用的消息,顺带的,还把ie里输入过的网址也告诉了我们:http://www.downcc.com/soft/15022.html

一个下载链接,暂时放着

当然,本着严谨的态度,让我们再看看有没有什么其他的可疑txt文件,filescan一下

> volatility -f WIN-MREMF575OV9-20210321-015808.raw --profile=Win7SP1x64 filescan|grep txt
Volatility Foundation Volatility Framework 2.6
0x000000001c749770     16      0 -W-rwd \Device\HarddiskVolume1\Users\rr\AppData\Local\Microsoft\Windows\Temporary Internet Files\Low\Content.IE5\UMUCVO9W\sugrec[2].txt
0x000000007d408a70      1      1 -W-rw- \Device\HarddiskVolume1\Users\rr\AppData\Local\Temp\FXSAPIDebugLogFile.txt
0x000000007db8c830     16      0 -W-rwd \Device\HarddiskVolume1\Users\rr\AppData\Local\Microsoft\Windows\Temporary Internet Files\Low\Content.IE5\S255F1ZR\personalcontent[1].txt
0x000000007dbf5770     16      0 -W---- \Device\HarddiskVolume1\Users\rr\AppData\Roaming\Microsoft\Windows\Cookies\Low\rr@www.baidu[2].txt
0x000000007ddbf750     20      2 -W-rw- \Device\HarddiskVolume1\ProgramData\VMware\VMware VGAuth\logfile.txt.0
0x000000007dfdf390     16      0 R--rwd \Device\HarddiskVolume1\ProgramData\VMware\VMware Tools\manifest.txt
0x000000007e2545d0     19      1 -W-rwd \Device\HarddiskVolume1\Users\rr\AppData\Local\Microsoft\Windows\Temporary Internet Files\Low\Content.IE5\Q54GC7J1\s[1].txt
0x000000007e2c54d0     16      0 -W-rwd \Device\HarddiskVolume1\Users\rr\AppData\Local\Microsoft\Windows\Temporary Internet Files\Low\Content.IE5\S255F1ZR\pageserver[1].txt
0x000000007f8ce1e0      2      0 -W-r-- \Device\HarddiskVolume2\WeChat\SDL License.txt
0x000000007fa50340     16      0 R--rwd \Device\HarddiskVolume1\Windows\System32\restore\MachineGuid.txt
0x000000007fa60f20     16      0 -W-rwd \Device\HarddiskVolume1\Users\rr\AppData\Local\Microsoft\Windows\Temporary Internet Files\Low\Content.IE5\Q54GC7J1\pageserver[1].txt
0x000000007fa72d50     16      0 -W-rwd \Device\HarddiskVolume1\Users\rr\AppData\Local\Microsoft\Windows\Temporary Internet Files\Low\Content.IE5\S255F1ZR\sugrec[1].txt
0x000000007fa737e0     16      0 -W-rwd \Device\HarddiskVolume1\Users\rr\AppData\Local\Microsoft\Windows\Temporary Internet Files\Low\Content.IE5\Q54GC7J1\pageserver[2].txt
0x000000007fa7bdd0     16      0 -W-rwd \Device\HarddiskVolume1\Users\rr\AppData\Local\Microsoft\Windows\Temporary Internet Files\Low\Content.IE5\JCOZZ0N0\personalcontent[2].txt
0x000000007fa7bf20     16      0 -W-rwd \Device\HarddiskVolume1\Users\rr\AppData\Local\Microsoft\Windows\Temporary Internet Files\Low\Content.IE5\Q54GC7J1\personalcontent[1].txt
0x000000007fa7d210     16      0 -W-rwd \Device\HarddiskVolume1\Users\rr\AppData\Local\Microsoft\Windows\Temporary Internet Files\Low\Content.IE5\JCOZZ0N0\personalcontent[1].txt
0x000000007facf7f0     16      0 -W---- \Device\HarddiskVolume1\Users\rr\AppData\Roaming\Microsoft\Windows\Cookies\rr@baidu[2].txt
0x000000007fb06070     16      0 -W-rwd \Device\HarddiskVolume1\Users\rr\AppData\Local\Microsoft\Windows\Temporary Internet Files\Low\Content.IE5\UMUCVO9W\sugrec[1].txt
0x000000007fbb0370     33      1 -W-rwd \Device\HarddiskVolume1\Users\rr\AppData\Local\Microsoft\Windows\Temporary Internet Files\Low\Content.IE5\S255F1ZR\s[1].txt
0x000000007fc9f070     16      0 -W-rwd \Device\HarddiskVolume1\Users\rr\AppData\Local\Microsoft\Windows\Temporary Internet Files\Low\Content.IE5\JCOZZ0N0\pageserver[1].txt
0x000000007fd054c0     16      0 -W---- \Device\HarddiskVolume1\Users\rr\AppData\Roaming\Microsoft\Windows\Cookies\Low\rr@baidu[2].txt

似乎没有找到,不过如果用取证大师查看的话...

cNs5IU.png

可以发现存在一个0字节的密码.txt,根据前面的editbox给出的信息,镜像中是先创建一个密码.txt后再在其中编辑密码,但是没有保存,所以I_didn't_py2应该是一个密码,联想到我们之前发现的VeraCrypt.exe进程,有理由怀疑这个密码就是VeraCrypt的密码

让我们来看看ie里有什么

其实这一步用上边提到的editbox就可以了,不过这里也提一下iehistory

iehistory插件可恢复IE历史记录index.dat缓存文件的片段。它可以找到访问的链接(通过FTP或HTTP),重定向的链接(--REDR)和已删除的条目(--LEAK)。它适用于加载和使用wininet.dll库的任何进程,而不仅仅是Internet Explorer。通常包括Windows资源管理器,甚至包括恶意软件样本。

> volatility -f WIN-MREMF575OV9-20210321-015808.raw --profile=Win7SP1x64 iehistory
Volatility Foundation Volatility Framework 2.6

没有找到,说明这个镜像中其实并没有访问上边的那个网址,可能那个网址并没有什么用,只是在浏览器里输入了一下而已

让我们来看看VeraCrypt有什么

前面提到,VeraCrypt是一个磁盘加密工具,而除了这个镜像,之前附件中还存在一个附件a,这里就不多说,直接上取证大师

cN6IgJ.png

发现附件a极有可能是TRUECrypt加密,而TrueCrypt又是VeraCrypt的前身,再结合镜像中的VeraCrypt.exe和密码,尝试解密

cNcGPU.png

cNcBa6.png

完美,拿到了微信文件,结合题目"我没有py",推测是用微信向他人py交易,我们要拿到他们的聊天记录,里面极有可能有flag,不过这里我当时也试了试直接在镜像中搜索消息记录数据,没有找到,显然出题人是想让我们从VeraCrypt这里拿到消息记录数据库,接下来的任务就是微信取证了

让我们来看看WeChat里有什么

照例先取证大师扫一下

cNRlVI.png

很遗憾取证大师也救不回来这玩意,不过还好,我们已经通过VeraCrypt拿到了它,我们现在要做的是破解消息记录数据库的密码,这个功能取证大师里其实是有的

cNRczF.png

不过这个似乎已经过时了,因为微信解密密钥是存在微信进程中的,他的偏移地址是随版本变化的,取证大师后续没有更新这个功能,所以它只能破解2.9的,所以这里得手动破解

我们先去看看微信的版本

先对自己的WeChat取证,可以发现,微信版本信息也存储在WeChat目录下的improve.xml里,我们去镜像中把他dump出来

> volatility -f WIN-MREMF575OV9-20210321-015808.raw --profile=Win7SP1x64 filescan|grep improve.xml
Volatility Foundation Volatility Framework 2.6
0x000000007fb63810      2      0 -W-r-- \Device\HarddiskVolume2\WeChat\improve.xml
> volatility -f WIN-MREMF575OV9-20210321-015808.raw --profile=Win7SP1x64 dumpfiles -Q 0x000000007fb63810 -D .
Volatility Foundation Volatility Framework 2.6
DataSectionObject 0x7fb63810   None   \Device\HarddiskVolume2\WeChat\improve.xml

cNhVP0.png

版本是3.0.0.57,接下来就是去找一个3.0.0.57版本的微信在本机上逆向找到密钥的偏移地址

本来我还想试试从镜像文件中获得安装包

> volatility -f WIN-MREMF575OV9-20210321-015808.raw --profile=Win7SP1x64 filescan|grep WeChatSetup
Volatility Foundation Volatility Framework 2.6
0x000000007e3d1df0     15      0 R--r-d \Device\HarddiskVolume1\Users\rr\Desktop\WeChatSetup.exe
0x000000007fa08f20     15      0 R--r-d \Device\HarddiskVolume1\Users\rr\AppData\Local\Temp\nsb73F9.tmp\WeChatSetup\WeChatWin.dll

结果

cNhHzT.png

这大小一看就不对,还是得自己去网上找

===以下部分涉及部分逆向===

下载3.0.0.57版本的微信后,打开微信,od挂载

cNILy8.png

由于密钥都储存在WeChatWin下,切换过去(View-->executable modules-->WeChatWin.dll)

再通过搜索ascii找到DBFactory,这玩意是一个通用数据库接口,check密钥的部分很可能就在他附近

cNHmkQ.png

这里的test edx,edx就是判断密钥的代码,在这里设置断点后,运行微信,登录,edx里存的就是我们的密钥的地址了

cNb1Cd.png

跟随一下,就能找到32字节大小的密钥,先记录一下密钥

不过显然,这样拿到密钥的方法,并不适合我们去内存镜像里获得,所以根据我们已经获得的密钥,这有一个更好的方法,先正常启动微信,再打开ce,按字节数组的方式搜索一下我们的密钥,可以发现在两个地址下,存储着我们的密钥

cUdpLT.png

不妨再试试搜索这个密钥所在的地址,看看有没有哪个地方存着这个地址的数值

cUdQTe.png

我们得到了1856e6c这个偏移量,显然,我们的密钥地址存在于wechatwin模块,offset=0x1856e6c,这就是3.0版本的偏移量,接下来我们可以通过这个方式来获取内存中的密钥,首先,我们先去看看WeChatWin的基址

> volatility -f WIN-MREMF575OV9-20210321-015808.raw --profile=Win7SP1x64 ldrmodules WeChat|grep WeChatWin
Volatility Foundation Volatility Framework 2.6
    3140 WeChat.exe           0x0000000068410000 False  False  False \WeChat\WeChatWin.dll

WeChatWin的地址是0x0000000068410000,我们只需要再加0x1856e6c就能找到密钥的地址了,先进入vol自带的shell界面

> volatility -f WIN-MREMF575OV9-20210321-015808.raw --profile=Win7SP1x64 volshell

进入WeChat部分

>>> cc(pid=3140)
Current context: WeChat.exe @ 0xfffffa8001f44340, pid=3140, ppid=1428 DTB=0x4beee000

获得密钥所在地址

>>> dd(0x0000000068410000+0x1856e6c,4)
69c66e6c  081af048

拿到地址071af048,获得密钥

>>> db(0x081af048)
0x081af048  f9 ea 4e bf 79 62 42 21 b1 6a 2b 6e a6 6c da b4   ..N.ybB!.j+n.l..
0x081af058  88 63 e6 4a 2d e4 49 9d 8c 66 8a 60 58 65 b3 c0   .c.J-.I..f.`Xe..
0x081af068  09 c9 e4 00 00 00 00 88 00 00 00 00 0c f1 00 73   ...............s
0x081af078  68 f1 1a 08 b0 b8 1a 08 00 00 00 00 00 00 00 00   h...............
0x081af088  00 00 00 00 00 00 00 00 16 c9 e4 00 00 00 00 88   ................
0x081af098  00 00 00 00 24 b2 01 6f d8 b8 1a 08 b0 ee 40 0a   ....$..o......@.
0x081af0a8  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
0x081af0b8  13 c9 e4 00 00 00 00 88 e8 1c 64 00 18 82 f9 00   ..........d.....

前32字节就是我们需要的密钥了,接下来就是解密微信消息数据库

让我们来看看数据库里有什么

由于数据库是使用SQLite加密,拿到密钥后,我们可以使用openssl破解附件a中的数据库,这里得再看看a里的微信文件结构

A:.
└─WeChat Files
    ├─All Users
    │  └─config
    ├─Applet
    │  └─publicLib
    │      └─317
    └─wxid_ruk5hmbs3mmo22#我们要寻找的目标用户
        ├─Backup
        ├─BackupFiles
        ├─config
        ├─FileStorage
        │  ├─Cache
        │  │  └─2021-03
        │  ├─CustomEmotion
        │  ├─Fav
        │  │  ├─Data
        │  │  ├─Temp
        │  │  └─Thumb
        │  ├─File
        │  ├─General
        │  │  ├─Data
        │  │  │  └─EmotionIcon
        │  │  └─HDHeadImage
        │  ├─Image
        │  │  ├─2021-03
        │  │  └─Thumb
        │  ├─Temp
        │  ├─TempFromPhone
        │  └─Video
        ├─Msg#消息!!!
        │  └─Multi
        └─ResUpdate

结合微信的文件结构和取证大师拿到的微信通讯消息的位置,我们基本可以确定Msg/Multi/下的MSG0.db文件是消息记录数据库,由于微信的数据库采用SQLite加密,根据我们已经获得的密钥,可以尝试使用openssl解密

using namespace std;
#include <Windows.h>
#include <iostream>
#include <openssl/rand.h>
#include <openssl/evp.h>
#include <openssl/aes.h>
#include <openssl/hmac.h>

#undef _UNICODE
#define SQLITE_FILE_HEADER "SQLite format 3" 
#define IV_SIZE 16
#define HMAC_SHA1_SIZE 20
#define KEY_SIZE 32

#define SL3SIGNLEN 20

#ifndef ANDROID_WECHAT
#define DEFAULT_PAGESIZE 4096       //4048数据 + 16IV + 20 HMAC + 12
#define DEFAULT_ITER 64000
#else
#define NO_USE_HMAC_SHA1
#define DEFAULT_PAGESIZE 1024
#define DEFAULT_ITER 4000
#endif
//pc端密码是经过OllyDbg得到的32位pass。
unsigned char pass[] = { 0xf9,0xea,0x4e,0xbf,0x79,0x62,0x42,0x21,0xb1,0x6a,0x2b,0x6e,0xa6,0x6c,0xda,0xb4,0x88,0x63,0xe6,0x4a,0x2d,0xe4,0x49,0x9d,0x8c,0x66,0x8a,0x60,0x58,0x65,0xb3,0xc0};
char dbfilename[50];
int Decryptdb();
int CheckKey();
int CheckAESKey();
int main(int argc, char* argv[])
{
    if (argc >= 2)    //第二个参数argv[1]是文件名
        strcpy_s(dbfilename, argv[1]);  //复制  
           //没有提供文件名,则提示用户输入
    else {
        cout << "请输入文件名:" << endl;
        cin >> dbfilename;
    }
    Decryptdb();
    return 0;
}

int Decryptdb()
{
    FILE* fpdb;
    fopen_s(&fpdb, dbfilename, "rb+");
    if (!fpdb)
    {
        printf("打开文件错!");
        getchar();
        return 0;
    }
    fseek(fpdb, 0, SEEK_END);
    long nFileSize = ftell(fpdb);
    fseek(fpdb, 0, SEEK_SET);
    unsigned char* pDbBuffer = new unsigned char[nFileSize];
    fread(pDbBuffer, 1, nFileSize, fpdb);
    fclose(fpdb);

    unsigned char salt[16] = { 0 };
    memcpy(salt, pDbBuffer, 16);

#ifndef NO_USE_HMAC_SHA1
    unsigned char mac_salt[16] = { 0 };
    memcpy(mac_salt, salt, 16);
    for (int i = 0; i < sizeof(salt); i++)
    {
        mac_salt[i] ^= 0x3a;
    }
#endif

    int reserve = IV_SIZE;      //校验码长度,PC端每4096字节有48字节
#ifndef NO_USE_HMAC_SHA1
    reserve += HMAC_SHA1_SIZE;
#endif
    reserve = ((reserve % AES_BLOCK_SIZE) == 0) ? reserve : ((reserve / AES_BLOCK_SIZE) + 1) * AES_BLOCK_SIZE;

    unsigned char key[KEY_SIZE] = { 0 };
    unsigned char mac_key[KEY_SIZE] = { 0 };

    OpenSSL_add_all_algorithms();
    PKCS5_PBKDF2_HMAC_SHA1((const char*)pass, sizeof(pass), salt, sizeof(salt), DEFAULT_ITER, sizeof(key), key);
#ifndef NO_USE_HMAC_SHA1
    PKCS5_PBKDF2_HMAC_SHA1((const char*)key, sizeof(key), mac_salt, sizeof(mac_salt), 2, sizeof(mac_key), mac_key);
#endif

    unsigned char* pTemp = pDbBuffer;
    unsigned char pDecryptPerPageBuffer[DEFAULT_PAGESIZE];
    int nPage = 1;
    int offset = 16;
    while (pTemp < pDbBuffer + nFileSize)
    {
        printf("解密数据页:%d/%d \n", nPage, nFileSize / DEFAULT_PAGESIZE);

#ifndef NO_USE_HMAC_SHA1
        unsigned char hash_mac[HMAC_SHA1_SIZE] = { 0 };
        unsigned int hash_len = 0;
        HMAC_CTX hctx;
        HMAC_CTX_init(&hctx);
        HMAC_Init_ex(&hctx, mac_key, sizeof(mac_key), EVP_sha1(), NULL);
        HMAC_Update(&hctx, pTemp + offset, DEFAULT_PAGESIZE - reserve - offset + IV_SIZE);
        HMAC_Update(&hctx, (const unsigned char*)&nPage, sizeof(nPage));
        HMAC_Final(&hctx, hash_mac, &hash_len);
        HMAC_CTX_cleanup(&hctx);
        if (0 != memcmp(hash_mac, pTemp + DEFAULT_PAGESIZE - reserve + IV_SIZE, sizeof(hash_mac)))
        {
            printf("\n 哈希值错误! \n");
            getchar();
            return 0;
        }
#endif
        //
        if (nPage == 1)
        {
            memcpy(pDecryptPerPageBuffer, SQLITE_FILE_HEADER, offset);
        }

        EVP_CIPHER_CTX* ectx = EVP_CIPHER_CTX_new();
        EVP_CipherInit_ex(ectx, EVP_get_cipherbyname("aes-256-cbc"), NULL, NULL, NULL, 0);
        EVP_CIPHER_CTX_set_padding(ectx, 0);
        EVP_CipherInit_ex(ectx, NULL, NULL, key, pTemp + (DEFAULT_PAGESIZE - reserve), 0);

        int nDecryptLen = 0;
        int nTotal = 0;
        EVP_CipherUpdate(ectx, pDecryptPerPageBuffer + offset, &nDecryptLen, pTemp + offset, DEFAULT_PAGESIZE - reserve - offset);
        nTotal = nDecryptLen;
        EVP_CipherFinal_ex(ectx, pDecryptPerPageBuffer + offset + nDecryptLen, &nDecryptLen);
        nTotal += nDecryptLen;
        EVP_CIPHER_CTX_free(ectx);

        memcpy(pDecryptPerPageBuffer + DEFAULT_PAGESIZE - reserve, pTemp + DEFAULT_PAGESIZE - reserve, reserve);
        char decFile[1024] = { 0 };
        sprintf_s(decFile, "dec_%s", dbfilename);
        FILE* fp;
        fopen_s(&fp, decFile, "ab+");
        {
            fwrite(pDecryptPerPageBuffer, 1, DEFAULT_PAGESIZE, fp);
            fclose(fp);
        }

        nPage++;
        offset = 0;
        pTemp += DEFAULT_PAGESIZE;
    }
    printf("\n 解密成功! \n");
    return 0;
}

当然也有python脚本,而且我觉得python的脚本更舒服

# -*- coding: utf-8 -*-
from Crypto.Cipher import AES
import hashlib, hmac, ctypes

SQLITE_FILE_HEADER = bytes("SQLite format 3",encoding='ASCII') + bytes(1)#文件头
IV_SIZE = 16
HMAC_SHA1_SIZE = 20
KEY_SIZE = 32
DEFAULT_PAGESIZE = 4096 #4048数据 + 16IV + 20 HMAC + 12
DEFAULT_ITER = 64000
#yourkey
password = bytes.fromhex("f9ea4ebf79624221b16a2b6ea66cdab48863e64a2de4499d8c668a605865b3c0".replace(' ',''))
with open(r'path\MSG0.db', 'rb') as f:
    blist = f.read()
print(len(blist))

salt = blist[:16]#微信将文件头换成了盐
key = hashlib.pbkdf2_hmac('sha1', password, salt, DEFAULT_ITER, KEY_SIZE)#获得Key

first = blist[16:DEFAULT_PAGESIZE]#丢掉salt

# import struct
mac_salt = bytes([x^0x3a 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测试一下
hash_mac.update(first[:-32])
hash_mac.update(bytes(ctypes.c_int(1)))
# hash_mac.update(struct.pack('=I',1))
if (hash_mac.digest() == first[-32:-12]):
    print('Correct Password')
else:
    raise RuntimeError('Wrong Password')

blist = [blist[i:i+DEFAULT_PAGESIZE] for i in range(DEFAULT_PAGESIZE,len(blist),DEFAULT_PAGESIZE)]
with open(r'path\MSG0_dec.db', '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:])

途径1

解密后查看数据库,发现消息

cUB3Y4.png

发现一串密文跟"密码是手机号"的提示,猜测需要使用手机号进行解密,一般而言,微信账号文件夹下的config储存有个人信息,其中,在AccInfo.dat中可以发现手机号:13435148016,当然,我们也可以通过ce获得自己的手机号后再去内存偏移同样的地址来获得手机号

cUr8MR.png

>>> db(0x0000000068410000+0x1856ac0)
0x69c66ac0  31 33 34 33 35 31 34 38 30 31 36 00 00 00 00 00   13435148016.....
0x69c66ad0  0b 00 00 00 0f 00 00 00 98 88 79 a9 65 10 02 00   ..........y.e...
0x69c66ae0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
0x69c66af0  00 00 00 00 00 00 00 00 0f 00 00 00 00 00 00 00   ................
0x69c66b00  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
0x69c66b10  0f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
0x69c66b20  00 00 00 00 00 00 00 00 0f 00 00 00 00 00 00 00   ................
0x69c66b30  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................

之后,再对密文进行AES解密即可拿到flag

途径2

不过,对于3.0版本的微信,我们还可以通过查看撤回的消息来获得flag(查看撤回消息的方法,经测试,仅适用于3.0版本,不过可能是我姿势有问题没测出来其它版本的方法),直接在数据库中查看BytesExtra就能发现撤回消息的原文

cUsm6A.png

解base64即可

途径3

查看内存屏幕快照,使用volatility和gimp的原始数据加载的方式可以查看raw镜像的屏幕快照,具体步骤是用volatility先dump出进程,再修改后缀名为data,然后再使用gimp加载原始数据,再调整参数即可,该方法究极非预期,甚至不需要附件a,一瞬拿到密文跟密码是手机号的提示,当然,也可以拿到VeraCrypt的密码

raw镜像图片1

raw镜像图片2

参考文章

Volatility内存分析工具 - 某即时通讯软件Windows端数据库密钥的分析

PC版微信数据库解密详细教程

【CTF】利用volatility与Gimp实现Windows内存取证

最后修改:2021 年 08 月 31 日 08 : 58 AM
如果觉得我的文章对你有用,请随意赞赏