#!/usr/bin/python
# -*- coding:utf-8 -*-
import struct
import binascii
import scrypt
N = 16384;
r = 8;
p = 1;
f = open('gatekeeper.pattern.key', 'rb') # 读取gatekeeper.pattern.key文件
blob = f.read()
s = struct.Struct('<' + '17s 8s 32s')
(meta, salt, signature) = s.unpack_from(blob) # 提取其中关键的信息
f1 = open('password.txt', 'r') # 读取字典
lines = f1.readlines()
for data in lines:
password = data.strip()
to_hash = meta
to_hash += password # 将字典中读取的密码和meta信息组合成to_hash
hash = scrypt.hash(to_hash, salt, N, r, p)
print
'signature %s' % signature.encode('hex')
print
'Hash: %s' % hash[0:32].encode('hex') # 取hash值的前32位
print
'Equal: %s' % (hash[0:32] == signature)
if hash[0:32] == signature: # 如果相同,程序结束
print password
print
"OK"
exit()
0x00我是新手,这个问题是一个复杂的取证问题,我想重新演示一下。我参考了一些专家的博客,并将它们放在上面。0x01wmctf解答。由于我没有取证专家,所以我选择使用FTK来挂载映像(实际上可以直接使用FTK将磁盘文件加载为驱动器,然后在虚拟机中打开,但与这个问题无关,我从Tokeii的博客中学到了这一点)。提示:曾经远程连接到其他计算机。从Tokeii的博客中,我了解到了几种可能的思路。1.default.rdp文件。2.在注册表中搜索Terminal Server Client。3.BMC和bin缓存文件,可以缓存远程桌面图片,文件位置:%userprofile%AppDataLocalMicrosoftTerminal Server ClientCache。4.Credentials位置:%userprofile%AppDataLocalMicrosoftCredentials。在这里,我找到了bin文件,可以使用BMC-tools工具导出图片。我查看了一下图片,大致是访问计算机的一些截图,有一万多张需要拼接。由于重新演示太麻烦,我直接复制了答案。可以看出VeryCrypt的密码是5eCuri7yPaSsW0rd@__WMCTF。然后我启动了autopsy。大致分析了一下加密文件,这里没有取证专家那么智能,所以只能手动尝试。而且第四个文件名的字符串很奇怪,猜一下可以发现是第四个文件。使用上面的密码在VeryCrypt中挂载,可以获得一个nox-disk2.vmem。使用DiskGenius挂载,读取已删除文件,发现了一张通讯录截图。根据Android的特性,可以直接从/data/com.android.providers.contacts/databases/导出通讯录数据库。在数据库中发现了加密的字符串,猜测是AES,密钥是锁屏密码(由于navicat出了一些问题,我先使用了博客中大师的图像)。nox是夜神模拟器,这个文件是夜神模拟器的映像文件,下载夜神模拟器的双开器来挂载映像。进行取证解锁锁屏密码,非常厉害。在早期版本(2.3-5.1)的Android手机中,与锁屏密码相关的文件如下,这种类型的加密方式相对简单,只需要破解相关的SHA1哈希值即可。/data/system/password.key /data/system/gesture.key在6.0-8.0版本的Android手机中,与锁屏密码相关的文件如下,该类型的加密方式相对复杂,应该采用的是scrypt-hash算法。/data/system/gatekeeper.pattern.key /data/system/gatekeeper.password.key解密脚本
安装scrypt库在Windows上非常麻烦…我哭了。在套神的博客中,他说可以使用hashcat来解密,但我从未使用过,尝试后再补充。解锁后,可以直接查看联系人信息,这算是一个提示。使用锁屏密码解密AES后,得到了flag。
0x02层层取证。稍微有些绕,但并不难,这里直接使用当时比赛写的wp。使用FTK打开磁盘映像,找到了一个提示。提示:你甚至无法模拟打开计算机,还想要flag?使用Arsenal Image Mounter挂载映像并将其另存为vmdk文件,然后在vmware中将其作为虚拟机打开。使用volatility工具获取用户xiaoming的密码。也可以直接使用Passwarekit来获取。
xiaoming_handsome输入密码成功启动计算机后,读取了便签上下层的word文档密码,但在计算机上没有找到word文件(这里也可以直接使用volatility查看StikyNot.exe便签进程)。Win7便签存储位置:%appdata%MicrosoftSticky Notes C:Users你的用户名AppDataRoamingMicrosoftSticky Notes StickyNotes.snt文件是便签的数据文件。StickyNotes.snt的编码问题:fs22字符段后面是便签的内容,如果便签中包含中文,中文内容以“xxxx”形式存在,然后每行以par结尾。可以将“”替换为“%”,使用urldecode方式解密,编码注意选择为gb2312。参考。在内存中,我看到了一个D盘的BitLocker恢复密钥文件的浏览记录,直接使用Elcomsoft Forensic Disk Decryptor根据磁盘映像文件和mem文件破解出BitLocker恢复密钥,解锁磁盘。在解锁的磁盘中,我看到了流量包2.pcapng,发现其中的UDP包中有rar文件的文件头,追踪UDP流,提取流量包中的数据恢复rar文件。然后根据压缩文件的提示,使用开机密码解压rar文件,并使用之前得到的word密码打开docx文件,flag就在文件中。
0x03 wifi。我看了wp感觉这个问题不难,分数给得很高,但当时我没有接触过一些东西,所以没有解出来,但我觉得还是学到了一些东西。首先贴上雪殇大佬的博客,我从中学到了很多。大致的思路是使用volatility分析映像文件,得到一个zip文件,zip文件的密码是网络适配器的UID,但当时不知道在哪里找,现在知道了可以通过关键字Interface来查找。拿到密码解压缩zip文件,得到.cap文件的密码。服务器端的流量包是一个哥斯拉的shell,使用base64decodepayload发现进行了三次异或加密,加密的密钥已知,所以再进行一次异或就可以看到源代码,然后查看客户端发送的流量,使用哥斯拉的加密方式解密得到flag。
0x04 羊城杯。这是我第一次出题,可能有点太简单了。题目很简单,如果主机连接到git,会留下一个ssh,其中包含连接的邮箱,可以查到github账号。然后本来想让大家解一个加密的小程序,但由于出题时间很紧迫(之前拖延太久了…),而且其他misc题目也不简单,所以决定不要出太难了,没有加密,直接反编译或阅读源代码就能获得flag。在网上随便找一个unpack项目。以前的微信版本直接拖动wxapkg即可获得小程序源代码,但新版微信取消了这个功能,以前加密的解密方法可以在github上找到工具。在出题过程中遇到了一些问题:在拉取镜像之前,一定要删除所有不需要的东西,否则很容易被意外发现,可以使用cleanmgr清理内存等。将Win7镜像拉下来后,dumpfile的内容都是空的,尝试了几个镜像工具都是这样,不知道为什么,后来换了XP镜像就可以了,如果有大佬知道原因,请告诉我。大概就是这些了~~~