团体赛题目整体分为两部分:磁盘镜像分析 & 安卓模拟器分析,难度上第一部分比较简单,第二部分涉及到很多安卓相关知识,相对比较困难
基于硬盘镜像文件(windows7disk.E01),要求:
取证大师自动取证,在系统痕迹的时区信息里
计算镜像的hash,直接取证大师就可以
名称: E:\中科实数杯\windows7disk.E01; 设备类型: 磁盘镜像; 大小: 30.00 GB;
扇区数: 62,914,560; 计算扇区数: 62914560; 起始扇区: 0; 结束扇区: 62914559; 设备序列号: ;
SHA-256值: 4547A61A11064DF47B272A4803788597F9A5E9AC0F11A93ABE58C8B8588956CB
在取证之后的文件分析中可以看到有2个vhd文件
和一个bitlocker的恢复密钥
用火眼把镜像仿真起来,把vhd挂载后用恢复密钥尝试分别解密,发现第二个可以解开,里面的txt内容就是本题答案
C6B1DC7D41DFF9D85800217E7F8CC3BF7A89BA349C69A5B2C4E9966CD3689CC4
镜像里只有一个分区,类型为NTFS
取证结果的系统信息里
同上,也在系统信息里
在取证结果的密钥检索里可以看到这个文件,跳转到源文件即可看到文件名,或者仿真之后与之前的vhd文件在同一个文件夹
取证结果的用户信息里
仿真后可以看到只安装了Google Chrome,在取证结果的安装软件中可以找到对应的安装日期
取证结果的USB设备使用痕迹中
取证结果的用户痕迹中有回收站删除记录
取证结果的用户信息里,可以看到对应用户密码的NThash值
如果本题只是问hash值的话到这里就可以了,如果想要得到原本的密码,还需要爆破hash,当然在线网站可以直接解,如果你有比较全的字典也可以用hashcat进行爆破(最终密码是09876543
),hashcat使用方法就不细讲了,可以看看文章
在第三题已经提到过了
这题...真的有解吗
已经尝试了n种方法但至今未解,除了出题方外现在应该还没有人解出此题,感兴趣的同学可以继续尝试,在此我提供一些思路:
取证结果的安装软件里:夜神模拟器
取证结果的上网记录里,安装的浏览器为Google Chrome,看历史记录,找最后访问的
域名的话只取https://passport.baidu.com/
即可
取证结果的账户登录里
取证结果的系统信息里
在已知用户poiuy登录密码的情况下,利用火眼的取证分析可以直接得到答案
源磁盘30G,转换成bytes即可
30 * 1024 * 1024 * 1024 = 32212254720
当事人在电脑上安装了Android模拟器,下面内容均为模拟器中Android系统及应用的信息,请分析如下事项:
目标应用在安卓模拟器里,所以首先要找到模拟器对应的虚拟机,在火眼取证分析里可以看到
在取证大师里也能找到,只不过他没有单独的手机模拟器识别的分类,找起来会不那么直观
把这个模拟器的vmdk文件导出,再用取证工具进行分析,手机应用后缀为apk,直接搜索关键字,可以看到名字比较独特的就一个
将其导出后丢进jeb反编译,找到和登录相关的部分
可以看到在loadPWD()
方法中调用了securityGet()
这个函数,继续跟进
可以看到在这个函数中有调用了一个加密相关的函数encrypt()
,再跟进
得到加密算法
可以取证大师直接跳转到base.apk的源文件进行计算,也可以把apk拿出来自己算,也可以雷电app智能分析
此题仿真后打开模拟器,查看浏览器的设置即可,但是想要查看浏览器的设置,首先要解锁手机,单纯绕过密码解锁手机的方式很简单,在模拟器所在目录的bin目录下有adb.exe,可以用它来调用shell执行一些命令
首先打开模拟器,然后在bin目录打开cmd,执行adb.exe shell
,接下来我们只需要找到储存锁屏密钥的文件并将其删去即可
我们通过夜神模拟器可以得知这个安卓虚拟机的版本是Android 7,此版本的锁屏密码相关文件如下
/data/system/gatekeeper.pattern.key
/data/system/gatekeeper.password.key
我们先将这两个文件复制出来,在接下来解锁屏密码时会用到
adb pull /data/system/gatekeeper.pattern.key C:\Users\poiuy\Desktop
adb pull /data/system/gatekeeper.password.key C:\Users\poiuy\Desktop
然后再删掉
rm -rf /data/system/gatekeeper.pattern.key
rm -rf /data/system/gatekeeper.password.key
删除后重启即可直接进入模拟器
打开手机自带的浏览器,右上角设置,常规,打开即可看到设置的默认主页
要解出这道题,首先我们要知道什么是AppKey
Appkey简称API接口验证序号,是用于验证API接入合法性的。接入哪个网站的API接口,就需要这个网站允许才能够接入,如果简单比喻的话:可以理解成是登陆网站的用户名。
我们一般要在AndroidManifest.xml文件中定义三方平台的appkey,appid等属性值,类似下面的代码
<meta-data
android:name="UMENG_APPKEY"
android:value="59dee5af82b6355b3d00000c" />
在得知AppKey的所在位置后,我们就可以轻松找到本题的答案,以JEB为例
雷电app智能分析或APK Messenger
CN=Bee Weng, OU=App Team, O=Desheng Group, L=Manila, ST=Republika ng Pilipinas, C=PH
可以看到这些信息,参考文章,可以知道参数的含义分别是
CN: 名字和姓氏
OU: 组织单位名称
O: 组织名称
L: 城市或区域名称
ST: 省/市/自治区名称
C: 国家/地区代号
所以本题答案为PH,是菲律宾的国家域名
进入模拟器后打开设置,最下面的关于平板电脑,状态信息
同样进入模拟器,设置中的WLAN
主Activity在AndroidManifest.xml文件中,形如以下
<activity android:name=".MainActivity">
<intent-filter >
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
在将apk反编译后,在AndroidManifest.xml中搜索对应的字符串即可
这部分acitivty对应的android:name
就是此题的答案
org.zywx.wbpalmstar.uex11818.activity.SplashActivity
包名直接雷电app分析就有
安装日期就在火眼中找到对应的包名
这道题我们可以利用逆向思维,这个应用有记住密码的功能,那么我们先去分析应用是如何记住密码的
在网上查找一些Android实现记住密码的方法,可以找到一些文章
可以看到这些方法都有一个共同的特点:使用 SharedPreferences 来保存密码
接下来我们再分析本题所给的应用,以工具jadx为例,搜索关键字remember
可以看到一系列相关的内容,其中就包含了rememberpassword
双击跳转到saveRememberPasswordStatus()
这个函数,可以看到本应用也同样是使用 SharedPreferences 来保存密码
同时也可以看到在这个函数所在类的最开始也定义了一系列和用户登录相关的参数,其中也包括了用户名和密码
那么我们直接跳转到声明SharedPreferencesManager
类的地方,在一开始可以看到默认存储的PreferencesName
可以初步确定保存在本地的用户名和密码存储在这个文件中,而 SharedPreferences 存储变量的文件路径为
/data/data/[应用程序包]/shared_prefs
使用 SharedPreferences 储存的参数都是以键值对的形式保存在xml文件中
包名我们在第29题已经得到了,即完整路径为
/data/data/com.elughkhktu.leohwiuirgk/shared_prefs/ds-preferences.xml
利用adb连shell,输出此文件的内容
可以看到用户登录账号为djujjf,即39题的答案
还有两个类似base64加密的非明文字符串
PH1fbMBQcfO/9coO/+2vAA==
GmyQesTJK3mvE9Tf1wxfWA==
直接解base64为乱码,推测是加密过的密码,继续看源码,在下面可以看到加密相关的函数
加解密用到的函数为SharedPreferencesAesCrypto
类下的encrypt和decrypt,直接跳转到类声明
可以看到是先AES/CBC/PKCS5Padding再base64,解密即可得到用户密码
上题中已经提到了
/data/data/com.elughkhktu.leohwiuirgk/shared_prefs/ds-preferences.xml
硬编码是指将可变变量用一个固定值来代替的方法,与从外部获取数据或在运行时生成数据不同,硬编码数据通常只能通过编辑源代码和重新编译可执行文件来修改,更通俗地讲,就是把一个本来应该(可以)写到配置信息中的信息直接在程序代码中写死了。
既然是直接写在程序代码中的网址,那我们就反编译apk后在源码中寻找
搜索关键字URL,可以找到一个叫WebServerUrl的类,打开可以看到里面都是些定义的文件字符串
根据定义我们可以知道这些都是软编码(非硬编码),指向的都是些可以直接修改的文件,而在下面我们可以看到四个非常醒目的网址
这四个网址都是直接写死在代码中,无法进行修改的,就是本题的答案
进入模拟器,设置最下面
可见25题,Bee Weng
APK Messenger
模拟器设置,日期和时间
APK Messenger
进入模拟器,设置,应用,应用权限
见30题,djujjf
参考文章:Cracking gatekeeper.pattern.key
镜像所给Android版本为7.1.2(33题已经提到过),在6.0~8.0的Android版本中,对锁屏密码采取的加密方式为scrypt-hash
在第23题中,我们已经提到了此版本下Android的锁屏密码储存在本地的文件位置
/data/system/gatekeeper.pattern.key
/data/system/gatekeeper.password.key
而有关锁屏密码的详细信息则储存在device_policies.xml文件中
/data/system/device_policies.xml
将这三个文件都提取出来,xml文件内容如下
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<policies setup-complete="true">
<active-password quality="65536" length="9" uppercase="0" lowercase="0" letters="0" numeric="9" symbols="0" nonletter="9" />
</policies>
可以看到密码的长度为9,所以先生成一个由不重复9位数组成的密码字典,再对密码进行比对hash爆破即可
import struct
import binascii
import scrypt
N = 16384;
r = 8;
p = 1;
f=open('gatekeeper.pattern.key', 'rb')
blob = f.read()
s = struct.Struct('<'+'17s 8s 32s')
(meta, salt, signature) = s.unpack_from(blob) #Extract the key information
f1=open('password.txt','r')
lines=f1.readlines()
for data in lines:
password=data.strip()
to_hash = meta
to_hash += password #to_hash = meta + passwd
hash = scrypt.hash(to_hash, salt, N, r, p)
print 'signature %s' % signature.encode('hex')
print 'Hash: %s' % hash[0:32].encode('hex')
print 'Equal: %s' % (hash[0:32] == signature)
if hash[0:32] == signature: #if same, over
print "Pattern Key: " + password
print "Found!!!"
exit()
成功得到图形锁:123578946