团体赛题目整体分为两部分:磁盘镜像分析 & 安卓模拟器分析,难度上第一部分比较简单,第二部分涉及到很多安卓相关知识,相对比较困难

Part1 磁盘镜像分析(300分)

基于硬盘镜像文件(windows7disk.E01),要求:

01 请找出操作系统设置的时区名称。(20分)

取证大师自动取证,在系统痕迹的时区信息里

image-20210527192150877

02 请给出源磁盘的SHA256哈希值。(10分)

计算镜像的hash,直接取证大师就可以

名称: E:\中科实数杯\windows7disk.E01; 设备类型: 磁盘镜像; 大小: 30.00 GB; 
扇区数: 62,914,560; 计算扇区数: 62914560; 起始扇区: 0; 结束扇区: 62914559; 设备序列号: ; 
SHA-256值: 4547A61A11064DF47B272A4803788597F9A5E9AC0F11A93ABE58C8B8588956CB  

03 请找出使用Bitlocker加密的虚拟磁盘文件中文件名为“新建文本文档.txt”的文件内容。(10分)

在取证之后的文件分析中可以看到有2个vhd文件

image-20210527193710270

和一个bitlocker的恢复密钥

image-20210527193932740

用火眼把镜像仿真起来,把vhd挂载后用恢复密钥尝试分别解密,发现第二个可以解开,里面的txt内容就是本题答案

C6B1DC7D41DFF9D85800217E7F8CC3BF7A89BA349C69A5B2C4E9966CD3689CC4

04 请找出各分区文件系统类型。(10分)

镜像里只有一个分区,类型为NTFS

05 请找出操作系统主机名。(10分)

取证结果的系统信息里

image-20210527194513924

06 请找出操作系统版本号。(10分)

同上,也在系统信息里

image-20210527194804054

07 请找出使用Bitlocker加密的虚拟磁盘文件恢复密钥文件名是什么。(20分)

在取证结果的密钥检索里可以看到这个文件,跳转到源文件即可看到文件名,或者仿真之后与之前的vhd文件在同一个文件夹

image-20210527195036227

08 请找出用户“poiuy”的SID。(10分)

取证结果的用户信息里

image-20210527195114383

09 请找出操作系统中安装的浏览器名称的对应的安装日期。(10分)

仿真后可以看到只安装了Google Chrome,在取证结果的安装软件中可以找到对应的安装日期

image-20210527195249569

10 请找出曾经连接到该系统的U盘的品牌、序列号、最后插拔日期。(20分)

取证结果的USB设备使用痕迹中

image-20210527195410178

11 请找出回收站中的文件(含原位置)。(30分)

取证结果的用户痕迹中有回收站删除记录

image-20210527195811688

12 请找出用户“poiuy”的登录密码。(10分)

取证结果的用户信息里,可以看到对应用户密码的NThash值

image-20210527224305615

如果本题只是问hash值的话到这里就可以了,如果想要得到原本的密码,还需要爆破hash,当然在线网站可以直接解,如果你有比较全的字典也可以用hashcat进行爆破(最终密码是09876543),hashcat使用方法就不细讲了,可以看看文章

13 请找出使用Bitlocker加密的虚拟磁盘文件。(20分)

在第三题已经提到过了

image-20210527193710270

*14 请找出使用Bitlocker加密的虚拟磁盘文件中文件名为“my.vhd.txt”的文件内容。(30分)

这题...真的有解吗

已经尝试了n种方法但至今未解,除了出题方外现在应该还没有人解出此题,感兴趣的同学可以继续尝试,在此我提供一些思路:

  1. 在内存中找恢复密钥(EFDD)
  2. 爆破弱密码(hashcat、bitcracker)
  3. 在镜像中搜寻密钥相关信息(明文或恢复)

15 请找出操作系统中安装的Android模拟器名称和安装日期。(20分)

取证结果的安装软件里:夜神模拟器

image-20210528001714719

16 请找出操作系统中安装的浏览器最后浏览过的网站域名。(10分)

取证结果的上网记录里,安装的浏览器为Google Chrome,看历史记录,找最后访问的

image-20210528002150300

域名的话只取https://passport.baidu.com/即可

17 请找出操作系统最后登录的用户。(10分)

取证结果的账户登录里

image-20210528135639561

18 请找出操作系统安装日期。(10分)

取证结果的系统信息里

image-20210528135830906

19 请找出操作系统中安装的浏览器“自动填充”中保存的网站密码信息(网站、用户名、密码)。(20分)

在已知用户poiuy登录密码的情况下,利用火眼的取证分析可以直接得到答案

image-20210528144616480

20 请给出源磁盘的大小(字节)。(10分)

源磁盘30G,转换成bytes即可

30 * 1024 * 1024 * 1024 = 32212254720

Part2 安卓模拟器分析

当事人在电脑上安装了Android模拟器,下面内容均为模拟器中Android系统及应用的信息,请分析如下事项:

21 请通过分析给出登录“大发”应用使用的密码保存在本地文件中时使用的加密算法名称。(10分)

目标应用在安卓模拟器里,所以首先要找到模拟器对应的虚拟机,在火眼取证分析里可以看到

image-20210528202249313

在取证大师里也能找到,只不过他没有单独的手机模拟器识别的分类,找起来会不那么直观

把这个模拟器的vmdk文件导出,再用取证工具进行分析,手机应用后缀为apk,直接搜索关键字,可以看到名字比较独特的就一个

image-20210528202724826

将其导出后丢进jeb反编译,找到和登录相关的部分

image-20210528203304859

可以看到在loadPWD()方法中调用了securityGet()这个函数,继续跟进

image-20210528203420467

可以看到在这个函数中有调用了一个加密相关的函数encrypt(),再跟进

image-20210528203457719

得到加密算法

22 请提供“大发”应用安装包的SHA256哈希值。(10分)

可以取证大师直接跳转到base.apk的源文件进行计算,也可以把apk拿出来自己算,也可以雷电app智能分析

image-20210609143030704

23 请分析系统自带浏览器,通过分析给出浏览器主页的链接。(20分)

此题仿真后打开模拟器,查看浏览器的设置即可,但是想要查看浏览器的设置,首先要解锁手机,单纯绕过密码解锁手机的方式很简单,在模拟器所在目录的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

删除后重启即可直接进入模拟器

打开手机自带的浏览器,右上角设置,常规,打开即可看到设置的默认主页

image-20210609151030111

24 请通过分析给出“大发”应用中使用的“极光推送”的AppKey值。(10分)

要解出这道题,首先我们要知道什么是AppKey

Appkey简称API接口验证序号,是用于验证API接入合法性的。接入哪个网站的API接口,就需要这个网站允许才能够接入,如果简单比喻的话:可以理解成是登陆网站的用户名。

我们一般要在AndroidManifest.xml文件中定义三方平台的appkey,appid等属性值,类似下面的代码

<meta-data
            android:name="UMENG_APPKEY"
            android:value="59dee5af82b6355b3d00000c" />

在得知AppKey的所在位置后,我们就可以轻松找到本题的答案,以JEB为例

image-20210609162146341

25 请分析给出“大发”应用的签名里的国家代码。(10分)

雷电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,是菲律宾的国家域名

26 请通过分析给出Android设备的序列号。(10分)

进入模拟器后打开设置,最下面的关于平板电脑,状态信息

image-20210609170730128

27 请通过分析给出连接的WiFi名称。(10分)

同样进入模拟器,设置中的WLAN

image-20210609170928983

28 请分析给出“大发”应用的主Activity。(10分)

主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中搜索对应的字符串即可

image-20210609190915231

这部分acitivty对应的android:name就是此题的答案

org.zywx.wbpalmstar.uex11818.activity.SplashActivity

29 请提供“大发”应用包名称及安装日期。(10分)

包名直接雷电app分析就有

image-20210609191620740

安装日期就在火眼中找到对应的包名

image-20210609191657247

30 请通过分析给出登录“大发”应用使用的密码。(30分)

这道题我们可以利用逆向思维,这个应用有记住密码的功能,那么我们先去分析应用是如何记住密码的

在网上查找一些Android实现记住密码的方法,可以找到一些文章

可以看到这些方法都有一个共同的特点:使用 SharedPreferences 来保存密码

接下来我们再分析本题所给的应用,以工具jadx为例,搜索关键字remember可以看到一系列相关的内容,其中就包含了rememberpassword

image-20210609203811236

双击跳转到saveRememberPasswordStatus()这个函数,可以看到本应用也同样是使用 SharedPreferences 来保存密码

image-20210609204214939

同时也可以看到在这个函数所在类的最开始也定义了一系列和用户登录相关的参数,其中也包括了用户名和密码

image-20210609204728262

那么我们直接跳转到声明SharedPreferencesManager类的地方,在一开始可以看到默认存储的PreferencesName

image-20210609205250337

可以初步确定保存在本地的用户名和密码存储在这个文件中,而 SharedPreferences 存储变量的文件路径为

/data/data/[应用程序包]/shared_prefs

使用 SharedPreferences 储存的参数都是以键值对的形式保存在xml文件中

包名我们在第29题已经得到了,即完整路径为

/data/data/com.elughkhktu.leohwiuirgk/shared_prefs/ds-preferences.xml

利用adb连shell,输出此文件的内容

image-20210609210729293

可以看到用户登录账号为djujjf,即39题的答案

还有两个类似base64加密的非明文字符串

PH1fbMBQcfO/9coO/+2vAA==
GmyQesTJK3mvE9Tf1wxfWA==

直接解base64为乱码,推测是加密过的密码,继续看源码,在下面可以看到加密相关的函数

image-20210609211138317

加解密用到的函数为SharedPreferencesAesCrypto类下的encrypt和decrypt,直接跳转到类声明

image-20210609211303910

可以看到是先AES/CBC/PKCS5Padding再base64,解密即可得到用户密码

image-20210609211711273

image-20210609211720439

31 请通过分析给出“大发”应用用户登录信息保存在本地的文件名。(10分)

上题中已经提到了

/data/data/com.elughkhktu.leohwiuirgk/shared_prefs/ds-preferences.xml

32 请提供“大发”应用中硬编码的服务器URL列表中的域名。(10分)

硬编码是指将可变变量用一个固定值来代替的方法,与从外部获取数据或在运行时生成数据不同,硬编码数据通常只能通过编辑源代码和重新编译可执行文件来修改,更通俗地讲,就是把一个本来应该(可以)写到配置信息中的信息直接在程序代码中写死了。

既然是直接写在程序代码中的网址,那我们就反编译apk后在源码中寻找

搜索关键字URL,可以找到一个叫WebServerUrl的类,打开可以看到里面都是些定义的文件字符串

image-20210610001450084

根据定义我们可以知道这些都是软编码(非硬编码),指向的都是些可以直接修改的文件,而在下面我们可以看到四个非常醒目的网址

image-20210610001804394

这四个网址都是直接写死在代码中,无法进行修改的,就是本题的答案

33 请通过分析给出Android版本号。(10分)

进入模拟器,设置最下面

image-20210609232615965

34 请分析给出“大发”应用的开发者姓名。(10分)

可见25题,Bee Weng

35 请提供“大发”应用版本号。(10分)

APK Messenger

image-20210609233136387

36 请通过分析给出系统中时区设置信息。(10分)

模拟器设置,日期和时间

image-20210609233452673

37 请分析给出“大发”应用的签名中记录的有效期(日期)。(10分)

APK Messenger

image-20210609233616171

38 请提供“大发”应用使用的权限。(10分)

进入模拟器,设置,应用,应用权限

image-20210609233819972

39 请通过分析给出登录“大发”应用使用的账号。(10分)

见30题,djujjf

40 请通过分析给出Android系统解锁图案。(30分)

参考文章: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()

image-20210610011544691

成功得到图形锁:123578946

image-20210610013415898

其他wp