SM2
题目知识点:
Biased nonce attack
观察代码发现 nonce 有一定 bias,前 6 bits 永远是 0,构造格子解 HNP 得到密钥,解密得到 flag。
poc链接:https://raw.githubusercontent.com/chunqiugame/cqb_writeups/master/2022hmgb/sm2_poc.sage
MissingFile
00 楔子
本意是为了考察选手对于MTF的一些认知,以及对于微软里面常见的一个API CryptProtectData
加密获得的数据,也就是常说的 DPAPI Blob
的一些了解程度的考察。但是为了方便出题(其实是自己折磨自己了),用了各种办法将数据读入内存,反而导致flag的泄露(疑似是flag也被存在了内存中,还没有被抹去),导致出现了非预期解,给各位师傅道歉了。
01 致知力行
题目描述: 某日Akira检查自己电脑时,发现机器好像中毒了!Akira试着抢救,但被病毒发现,只剩下了一份快照,这份快照能帮Akira找到病毒留下的秘密吗?
题目描述中提到了机器中毒,其实就是指这台电脑 已经被攻击过,暗示memory之中会残留一些攻击者利用过的数据。通常情况下,内存中残留的数据不足以进行数据恢复,但是在某些特定情况下,数据已被加载到内存中时,便有获取某一些特定数据的机会,这一题就是模拟此场景。同时提到了被病毒发现,其实这里是想表达病毒进行了自我数据删除,所以有数据残留。
加密数据发现
.volatility_2.6_win64_standalone.exe -f memory imageinfo
可以看到是一个Win7SPx86的操作系统。然后简单分析一下文件,发现一个奇怪的文件名字:
.volatility_2.6_win64_standalone.exe -f memory --profile=Win7SP1x86 filescan
检查电脑上的文件时候,能够找到一个奇怪的目录:
UsersNewGuestDesktopHacker
然而这个目录内似乎什么也没有。但是题目里提到病毒把数据给删除了(假设该情况成立),于是考虑使用 mftparser
对内存中的 MFT
进行分析。关于这个MTF的介绍,网上有很多文章都有介绍,这边简单提一下:在Windows使用的NTFS文件系统中,有一个被称为 Master File Table
的数据,这部分数据会 存放在内存中,用于对NTFS中每个新增文件的一些信息进行记录,例如:文件的位置,修改时间等等。利用此特性,NTFS就能够快速定位每一个文件在磁盘上的位置,并且也能够让Explore能够对文件进行快速搜索。当文件大小不足1024字节的时候,这个文件数据 会直接存放到MFT中。由于大部分文件删除的时候,并不会直接抹去数据,而是标记此块数据已经被删除,所以MFT中通常会残留某些被删除的小文件的数据。
回到题目中,考虑到被删除的文件大概率为我们的目标文件,于是通过volatility提供的插件mtfparser找到被删除的数据:
.volatility_2.6_win64_standalone.exe -f memory --profile=Win7SP1x86 mftparser > mtfparser.txt
在其中找到可疑的文件 S3cret
。
文件解密
基础知识集:
DPAPI:
全称Data Protection Application Programming Interface
DPAPI blob:
一段密文,可使用Master Key对其解密
Master Key:
64字节,用于解密DPAPI blob,使用用户登录密码、SID和16字节随机数加密后保存在Master Key file中
Master Key file:
二进制文件,可使用用户登录密码对其解密,获得Master Key
这部分内容选自:https://3gstudent.github.io/%E6%B8%97%E9%80%8F%E6%8A%80%E5%B7%A7-%E5%88%A9%E7%94%A8Masterkey%E7%A6%BB%E7%BA%BF%E5%AF%BC%E5%87%BAChrome%E6%B5%8F%E8%A7%88%E5%99%A8%E4%B8%AD%E4%BF%9D%E5%AD%98%E7%9A%84%E5%AF%86%E7%A0%81
从文件的魔数可以看出来,这个文件用的是Windows的 DPAPI
技术进行的数据加密。DPAI就是Windows提供的一种数据保护API,它本质上使用了Windows通过用户自己登录(sids,登录密码等),以及域登录后的一些数据生成的密钥,并且使用内置的算法,对用户指定的数据进行加密。通常Windows上的浏览器历史数据,邮件加密,wifi密码等等都会以这种方式进行数据加密。
如果对这种数据进行解密的话,需要能够获取当前操作系统登录用户对应的 MasterKey
才能解开。然而获得这个 MasterKey
需要知道攻击者登录过程中使用的账户,以及账号的登录密码和对应的SIDs。通常的思路是利用这些数据生成一个blob加密过程中使用的MasterKey,从而对目标blob进行解密。
此时如果用 volatility 进行过文件扫描的话,会发现磁盘上残存则 mimikatz
,一个专门用于Windows渗透的工具。并且使用这个工具可以进行一些敏感数据的导出。考虑到本机曾经中毒而且存在mimikatz,攻击者可能对当前机器的密码进行了dump,内存中可能残存着可以利用的数据。
对于DPAPI加密的数据了,从filescan中可以发现,S3cret
被存放在一个叫做 NewGuest
的用户桌面,于是尝试dump基本信息。
.volatility_2.6_win64_standalone.exe -f memory --profile=Win7SP1x86 hivelist
.volatility_2.6_win64_standalone.exe -f memory --profile=Win7SP1x86 hashdump
于是发现电脑上有一个可疑的 NewGuest
用户。对其用户密码进行爆破可以得到其加密密码为弱口令 123456
。
由于生成需要知道对应的 sid
,于是可以通过如下的指令获得对应用户的sids。
.volatility_2.6_win64_standalone.exe -f memory --profile=Win7SP1x86 getsids
得到用户的SID为 S-1-5-21-206512979-2006505507-2644814589-1001
这里使用渗透工具mimikatz检查对应blob文件(这个加密文件就是我们通过插件mtfparser获取到的UsersNewGuestDesktopHackerS3cret文件内容)
可以知道这里需要一个GUID为 470a5148-d8c9-4453-bf41-f0c09d158bfd
的masterkey,这个文件正好也能在内存中找到(插件mtfparser获取到的 UsersNewGuestAppDataRoamingMICROS~1ProtectS-1-5-21-206512979-2006505507-2644814589-1001470a5148-d8c9-4453-bf41-f0c09d158bfd
):
将上述文件dump出来保存为 master.key
,并且使用mimikazi结合其SID生成 masterkey
dpapi::masterkey /in:"master.key" /sid:S-1-5-21-206512979-2006505507-2644814589-1001 /password:123456
最终使用这个密码将对应的blob文件解密即可:
dpapi::blob /in:dump_S3cret /masterkey:092c4220064c30bc7f8b15d2d48957c4926af0632149b9c08cd87f34fc43aa1204d775bdc6ab429a0d4d0826fb80b08250b125d92913e2f7578cf778073bfe38
得到明文为:
flag{Hide_Behind_Windows}
结语
题目的本意是想模拟一个被入侵后,对一个入侵后环境内存取证的过程,然而由于各种能力限制,导致一些场景重现起来困难重重,例如一些必要数据并不会每次都残留在内存中,抑或有时候会留下敏感数据。在最后其实本应使用更加纯净的环境进行出题,然而在出题最后验题过程中,没注意到验题解出来的数据居然也才留在内存中了,导致出现了非预期,因自己的粗心给各位师傅带来不好的做题体验感到非常抱歉。
– 未完待续 –
春秋GAME伽玛实验室
会定期分享赛题赛制设计、解题思路……
如果你日常有一些技术研究和好的设计思路
或在赛后对某道题有另辟蹊径的想法
欢迎找到春秋GAME投稿哦~
联系vx:cium0309
欢迎加入 春秋GAME CTF交流2群
Q群:703460426
原文始发于微信公众号(春秋伽玛):【WP】第二届“红明谷”杯数据安全大赛题目解析(二)