MissingFile
前置知识
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
楔子
本意是为了考察选手对于MTF的一些认知,以及对于微软里面常见的一个API
CryptProtectData
加密获得的数据,也就是常说的DPAPI Blob
的一些了解程度的考察。但是为了方便出题(其实是自己折磨自己了),用了各种办法将数据读入内存,反而导致flag的泄露(疑似是flag也被存在了内存中,还没有被抹去),导致出现了非预期解
题目
题目描述: 某日Akira检查自己电脑时,发现机器好像中毒了!Akira试着抢救,但被病毒发现,只剩下了一份快照,这份快照能帮Akira找到病毒留下的秘密吗?
思路
题目描述中提到了机器中毒,其实就是指这台电脑 已经被攻击过,暗示memory中会残留一些攻击者利用过的数据。通产情况下,内存中残留的数据不足以进行数据恢复,但是在某些特定的情况下,数据被加载到内存中,便有获取一些特定数据的机会,这一题就是模拟这种场景,同时提到了被病毒发现,其实这里是想表达病毒进行了自我数据删除,所以有数据残留。
加密数据发现
对于此类内存分析题,首先通过volatility调查当前内存版本
vol -f memory imageinfo
然后我们查看桌面上的文件
vol -f memory --profile=Win7SP1x86_23418 filescan | grep -E -i "desktop"
我们发现了一个奇怪的目录UsersNewGuestDesktopHacker以及mimikatz.exe
然而这个目录内似乎什么也没有。但是题目里提到病毒把数据给删除了(假设该情况成立),于是考虑使用
mftparser
对内存中的MFT
进行分析。关于这个MTF的介绍,网上有很多文章都有介绍,这边简单提一下:在Windows使用的NTFS文件系统中,有一个被称为Master File Table
的数据,这部分数据会 存放在内存中,用于对NTFS中每个新增文件的一些信息进行记录,例如:文件的位置,修改时间等等。利用此特性,NTFS就能够快速定位每一个文件在磁盘上的位置,并且也能够让Explore能够对文件进行快速搜索。当文件大小不足1024字节的时候,这个文件数据 会直接存放到MFT中。由于大部分文件删除的时候,并不会直接抹去数据,而是标记此块数据已经被删除,所以MFT中通常会残留某些被删除的小文件的数据。
我们就可以利用volatility中内置的插件mftparser 来查找Hacker目录中被删除的数据
vol -f memory --profile=Win7SP1x86 mftparser > mtfparser.txt
我们追踪Hacker文件夹的时候找到了一个可疑文件S3cret
官方WP的提示说从文件的魔数可以看出来,这个文件用的是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
根据前置知识,我们解密Master Key file需要用户登录密码,以及sid
然后我们就需要搜索关于NewGuest用户的sid
使用命令
vol -f memory --profile=Win7SP1x86_23418 getsids
vol -f memory --profile=Win7SP1x86_23418 getsids | grep NewGuest
得到sid S-1-5-21-206512979-2006505507-2644814589-1001
然后我们将DPAPI加密的文件S3cret文件dump出来,这里我不知道怎么dump,就手动删除前面的偏移量以及后面的ASCII编码(卑微)
将十六进制转为文件dump_s3cret(也就是DPAPI blob文件)
这个时候我们就可以使用渗透工具mimikatz检查对应的blob文件的内容
dpapi::blob /in:"dump_S3cret"
可以知道这里需要一个GUID为 470a5148-d8c9-4453-bf41-f0c09d158bfd Master key,我们试着返回内存去寻找这个Master Key文件(也就是从我们之前保存的mtfmaster.txt中查找关于这个GUID的信息)
cat mtfparser.txt| grep "470a5148-d8c9-4453-bf41-f0c09d158bfd"
2022-02-13 08:35:13 UTC+0000 2022-02-13 08:35:13 UTC+0000 2022-02-13 08:35:13 UTC+0000 2022-02-13 08:35:13 UTC+0000 Users\NewGuest\AppData\Roaming\MICROS~1\Protect\S-1-5-21-206512979-2006505507-2644814589-1001\470a5148-d8c9-4453-bf41-f0c09d158bfd
我们找到了这条数据,然后我们可以查看大约匹配到的数据的前后50条数据
手动导出hex数据
我们将文件提取出来了之后保存为Master.key。并且使用mimikatz结合SID 和 用户登录密码 提取出 masterkey
mimikatz # dpapi::masterkey /in:"master.key" /sid:S-1-5-21-206512979-2006505507-2644814589-1001 /password:123456
masterkey:092c4220064c30bc7f8b15d2d48957c4926af0632149b9c08cd87f34fc43aa1204d775bdc6ab429a0d4d0826fb80b08250b125d92913e2f7578cf778073bfe38
最后使用 masterkey解密DPAPI blob文件
dpapi::blob /in:dump_S3cret /masterkey:092c4220064c30bc7f8b15d2d48957c4926af0632149b9c08cd87f34fc43aa1204d775bdc6ab429a0d4d0826fb80b08250b125d92913e2f7578cf778073bfe38
内容被提取出来了
66 6c 61 67 7b 48 69 64 65 5f 42 65 68 69 6e 64 5f 57 69 6e 64 6f 77 73 7d 00
flag{Hide_Behind_Windows}