四、从安卓设备中逻辑提取数据

本章将尽可能通过使用免费和开源工具来涵盖逻辑数据提取。本章涵盖的大部分材质将使用之前在第 2 章中讨论的 ADB 方法建立安卓取证环境

到本章结束时,读者应该熟悉以下内容:

  • 什么是逻辑提取
  • 从逻辑提取中期待什么数据
  • 有和没有根目录都有哪些数据
  • 手动提取亚行数据
  • 亚行备用提取
  • 亚行 dumpsys 信息
  • 如何绕过安卓锁屏
  • SIM 卡提取

逻辑提取概述

在数字取证中,术语逻辑提取通常用于指不恢复已删除数据或不包括证据的完整逐位副本的提取。然而,逻辑提取更正确的定义,也在第 1 章介绍安卓取证中定义,是任何需要与基础操作系统通信的方法。由于与操作系统的这种交互,法医不能确定他们已经恢复了所有可能的数据;操作系统正在选择允许审查员访问的数据。

在传统的计算机取证中,逻辑提取类似于复制和粘贴文件夹,以便从系统中提取数据;这个过程将只复制用户可以访问和看到的文件。如果任何隐藏或删除的文件出现在被复制的文件夹中,它们将不会出现在文件夹的粘贴版本中。

然而,正如您将看到的,移动取证中逻辑提取和物理提取之间的界限比传统的计算机取证更加模糊。例如,由于广泛使用 SQLite 数据库来存储数据,删除的数据通常可以从移动设备上的逻辑提取中恢复。此外,几乎每个移动提取都需要与安卓操作系统进行某种形式的交互;没有简单的等效方法可以在不启动硬盘的情况下拉出硬盘并对其进行成像。出于我们的目的,我们将逻辑提取定义为获取用户可见数据的过程,并且可能包括已标记为删除的数据。

哪些数据可以逻辑恢复?

大多数情况下,任何和所有用户数据都可以逻辑恢复:

  • 联系人
  • 通话记录
  • 短信/MMS
  • 应用数据
  • 系统日志和信息

这些数据的大部分存储在 SQLite 数据库中,因此甚至可以通过逻辑提取来恢复大量删除的数据。

根访问

在对安卓设备进行取证分析时,限制因素往往不是被搜索的数据类型,而是审查员是否有能力访问数据。根访问在第 2 章建立安卓取证环境中有广泛的介绍,但它足够重要,值得重复。上面列出的所有数据,当存储在内部闪存中时,都是受保护的,需要根访问才能读取。这种情况的例外是存储在 SD 卡上的应用数据,这将在本书后面讨论。

没有 root 访问权限,法医不能简单地从数据分区复制信息。考官将不得不寻找某种方法来提升他们的特权,以便获得对联系人、通话记录、短信/彩信和应用数据的访问权限。这些方法通常会带来许多风险,例如可能会破坏或“阻塞”设备(使其无法启动),并且可能会更改设备上的数据以获得持久性。这些方法通常因设备而异,并且没有通用的一键方法来获得对每个设备的根访问权限。 MicroSystemation XRYCellebrite UFED 等商用移动取证工具具有内置功能,可以临时安全地根控许多设备,但不能覆盖所有安卓设备的广泛范围。

在本章中,我们将记录每种技术都需要 root 的情况。

根设备的决定应根据您当地的操作程序和您辖区的法院意见做出。法律对通过寻根获得的证据的接受程度因司法管辖区而异。

手动亚行数据提取

ADB pull命令可用于将单个文件或整个目录直接从设备上拉到法医的计算机上。这种方法对于小规模、有针对性的考试特别有用。例如,在严格涉及短信的调查中,审查员可以选择只提取相关文件。

USB 调试

本书前面已经讨论过设置亚行环境。但是,被检查的设备也必须正确配置。USB 调试是考官电脑与设备通信的实际方法。 USB 调试选项位于设置菜单中的开发者选项下。但是从安卓 4.2 开始,开发者选项菜单是隐藏的;要显示出来,用户必须进入设置 | 关于电话,然后点击内部号码字段七次。屏幕上会出现一个对话框,上面写着你现在是开发人员了!此时,设置菜单中有开发者选项;只需打开该菜单,选择启用 USB 调试

除了 USB 调试,考官的电脑上还必须安装正确的驱动。一般可以在网上找到,或者从制造商的网站上,或者在www.xda-developers.com找到。如果机器上安装了商业取证工具,则可能已经安装了适当的驱动程序。

类型

另一个优秀的资源是通用 ADB 驱动程序,可以在免费下载。

在安卓 4.2.2 之前,启用 USB 调试是通过 ADB 与设备通信的唯一要求。在安卓 4.2.2 中,谷歌增加了安全 USB 调试选项。安全 USB 调试选项增加了在设备屏幕上选择连接电脑的附加要求;这可防止 ADB 从不可信的计算机访问锁定的设备:

USB debugging

RSA 指纹对话框

如果选择了始终允许从这台计算机开始,设备将存储计算机的 RSA 密钥,并且即使设备被锁定,提示也不会出现在未来与该计算机的连接上。

类型

根据设备和操作系统版本,可能会绕过 安全 USB 调试保护。更多信息请访问https://labs . mwrinfosecurity . com/advances/2014/07/03/Android-4-4-2-secure-USB-debug-bypass/

也可以通过使用之前授权访问设备的计算机绕过安全 USB 调试,这将在本章后面的“安卓棒棒糖的问题”一节中讨论。

一旦 USB 调试被启用并且安全 USB 调试检查通过(取决于安卓版本),设备就可以进行检查了。要验证设备是否已连接并准备好使用 ADB,请执行以下命令:

adb devices

如果没有显示设备,请确保 USB 调试已启用,并且安装了正确的设备驱动程序:

USB debugging

如果设备状态为offlineunauthorized,则需要在屏幕上选择 安全 USB 调试提示:

USB debugging

如果一切运行正常,设备状态应显示device:

USB debugging

使用 ADB shell 确定设备是否已扎根

确定设备是否已扎根的最简单方法是使用 ADB 外壳。这将在设备上打开一个外壳,可以在考官的计算机上访问;这意味着在 shell 中运行的任何命令都将在设备上执行。一旦 USB 调试被启用并且安全 USB 调试被绕过(或者从恢复模式,如本章下文所述),打开本地计算机上的终端并运行:

adb shell

外壳会出现两种方式之一,要么是$要么是#:

Using ADB shell to determine if a device is rooted

在 Linux 系统上,#符号用于表示根用户,$符号表示非根用户。如果外壳返回显示#,则外壳具有根访问权限:

Using ADB shell to determine if a device is rooted

一些根深蒂固的设备可能需要更进一步的。如果外壳返回$,尝试运行su命令:

su

如果 su 二进制文件安装在设备上,这通常是 root 进程的一部分,如果 shell 没有打开它们,这将把 shell 的权限升级到 root。

类型

一些旧设备自动以 root 用户身份运行外壳;只需打开 ADB 外壳,可能就足以让审查员获得 root 访问权限。

亚行拉

正如在第 2 章中所讨论的设置安卓取证环境,ADB pull命令用于将文件从设备传输到本地工作站。亚行pull命令的格式为:

adb pull [-p] [-a] <remote> [<local>]

可选的-p标志显示传输进度,而可选的-a标志将复制文件的时间戳和模式。<remote>参数是设备上文件的确切路径。可选的<local>参数是文件在考官电脑上写入的路径。如果没有指定本地路径,文件将被写入当前工作目录。要查看亚行pull命令可能是什么样子,请运行以下命令:

adb pull p /data/data/com.android.providers.telephony/databases/mmssms.db C:/Users/Cases/Case_0001

该命令将从设备中提取短信数据库文件,并将其写入该案例的目录中。请再次注意,设备必须是根设备才能工作;否则,输出将简单地显示0文件被拉出。在我们的例子中,获得了以下输出:

ADB pull

前面的输出显示文件大小为1020400字节。由于我们的命令,数据库现在位于Case_0001文件夹中:

ADB pull

从设备中提取的数据库,在 Windows 资源管理器中可以看到

现在可以使用 SQL Browser 或其他取证工具检查数据库,这将在第 7 章安卓应用的取证分析中介绍。

同样,如果调查人员希望提取整个应用的文件,也可以通过 ADB 提取来完成:

ADB pull

这一次,ADB pull 命令提取了com.google.android.gm目录中的每个文件,恰好包含了 Gmail 的所有数据。输出相当长,因为它单独列出了所有31拉取的文件,所以整个输出没有显示在下图中,其中我们看到传输的总大小显示为1233373字节:

ADB pull

现在,Case_0002 目录包含了来自 Gmail 应用的所有文件,如下图所示:

ADB pull

从 Gmail 目录中提取的所有文件,在窗口资源管理器中都可以看到

甚至可以执行以下操作:

adb pull -p /data/data/ \Cases\Case_0003

这将从/data/data目录中提取所有可用的逻辑文件,并将它们放入审查员的Case_0003文件夹中。这不等同于物理映像,因为某些文件会被跳过,删除的文件不会被复制,但这是提取用户绝大多数应用数据的简单方法。

ADB pull命令的另一个优点是它对脚本编写非常有用。知识渊博的考官可以维护一个感兴趣的常用文件的路径列表,并编写一个脚本,自动从设备中拉出这些文件,甚至让脚本自动拉出整个/data/data目录。将执行此功能的 Python 代码的一个简单示例是:

from subprocess import Popen
from os import getcwd

command = "adb pull /data/data " + getcwd() + "\data_from_device"
p = Popen(command)
p.communicate()

注意代码不是很精炼;它的唯一目的是为了说明亚行的命令很容易编写。至少,正确实现代码应该包括指定输出目录和处理任何错误的选项。然而,假设 USB 调试已启用并且设备已扎根,前面代码的六行足以从逻辑上拉整个/data/data目录。

恢复模式

为了真正做到可靠,ADB 数据提取不应用于手机开机时。当设备运行时,可以修改时间戳,并且应用可能正在后台运行和更新文件。为了避免这种情况,检查人员应该将设备置于自定义恢复模式,如第 2 章设置安卓取证环境所示,如果可能的话。通过股票安卓恢复模式无法访问 ADB。通常,生根过程的第一步是刷新自定义恢复模式,以便在出现问题时提供修复设备的方法。根设备更有可能包含自定义恢复,但也有可能将自定义恢复闪存到非根设备。这种方法也可以让考官避免在较新版本的安卓上出现安全 USB 调试提示,虽然我们的测试显示这在安卓棒棒糖上不起作用。恢复模式也可能不需要启用 USB 调试,这使得它成为绕过锁定设备的绝佳选择。

此方法不适用于启用了全磁盘加密的设备。启动到恢复模式将而不是解密数据分区。

引导至恢复模式的过程因设备而异。通常,它包括关闭设备电源和按住音量键和电源键的组合。特定型号的指南可以在网上找到。

股票恢复模式通常会显示一张安卓操作的图片:

Recovery mode

库存回收模式

自定义恢复如下截图所示。此外,股票回收不允许亚行沟通;运行 adb 设备将不会显示任何设备。

许多设备的自定义恢复映像可以在https://www.clockworkmod.com/rommanagerhttp://teamw.in/project/twrp2找到。

如果设备处于自定义恢复模式,并且检查人员的计算机上安装了正确的驱动程序,则可以通过 ADB 访问该设备,就像它是实时的一样。请注意,使用 adb devices 命令的状态现在显示它处于恢复模式:

Recovery mode

在审查员开始通过 ADB 提取数据之前,还有最后一步:必须安装数据分区,以便访问用户数据。有些自定义恢复可能会自动装载,有些则不会。如果使用发条 Mod 恢复或Team Win Recovery Project(【TWRP】)图片来自上面的 URL,可以通过选择 Mounts 然后选择数据分区来挂载数据分区,如下截图所示。恢复菜单通常或者通过使用音量键上下移动和电源按钮选择来导航,或者根据所使用的自定义恢复图像而基于触摸。

对于 TWRP 恢复,从主恢复屏幕的中,选择安装:

Recovery mode

选择安装后,选择要安装的分区:

Recovery mode

在发条模块恢复中,选择安装和存储:

Recovery mode

然后选择要安装的分区:

Recovery mode

一旦安装了数据分区(以及审查员想要调查的任何其他分区),审查员就可以执行 ADB 数据提取,如本章前面所述。

如果设备没有自定义恢复,下面的部分将显示如何引导到其中。

快速启动模式

快速启动是安卓软件开发工具包中内置的另一个协议实用程序,用于直接与设备的启动加载程序交互。本质上,它是 ADB 的一个低得多的版本,并且经常被用来将新的图像闪存到设备上。这对考官有什么帮助?

Fastboot 可以允许检查者从自定义恢复映像启动,并临时获得设备的根访问权限,从而获得对原本不可用的数据的访问权限。快速启动不需要启用 USB 调试或根访问。商业取证工具通常使用将自定义引导加载程序加载到设备上的过程来临时确定设备的根,但是熟练的审查员也可以手动执行该过程。使用这种方法,将恢复映像加载到内存中;设备上的永久数据不会以任何方式改变。

使用 fastboot 最重要的需求是一个解锁的引导加载程序;锁定的引导加载程序不允许设备从未经制造商特别签名的代码启动。不幸的是,出于取证目的,大多数设备不再附带未锁定的引导加载程序,因为这是一个严重的安全风险,手动解锁引导加载程序通常会擦除用户数据。因此,这是一种可行方法的设备数量有些有限。但是,当它起作用时,对于考官来说,它绝对是一个无价的工具。

此方法不适用于启用了全磁盘加密的设备。引导至恢复模式将而不是解密数据分区。

确定引导加载程序状态

就像所有涉及安卓取证的事情一样,没有一个有保证的方法来确定引导加载程序是否被锁定,因为它因制造商而异。要引导到引导加载程序,请使用以下 ADB 命令:

adb reboot bootloader

设备应该引导到显示引导加载程序信息的屏幕。通常,该屏幕将显示引导加载程序状态,如下图所示。

这是 Nexus 5 的通用快速启动菜单。注意锁定状态表示引导加载程序未锁定:

Determining bootloader status

标准 HTC 快速启动屏幕如下:

Determining bootloader status

下面是一个标准的三星 奥丁模式画面;Odin 是三星专有的 fastboot:

Determining bootloader status

引导至自定义恢复映像

一旦引导加载程序被确定为解锁,检查者将需要一个自定义的恢复映像来引导。恢复映像的最佳来源是https://www.clockworkmod.com/rommanagerhttp://teamw.in/twrp_view_all_devices。这两个站点覆盖了各种各样的设备,并将为这种方法提供相同的功能。

为正在检查的设备选择正确的恢复映像绝对至关重要;它们不可互换,从错误的映像启动可能会损坏设备。

选择并下载恢复映像后,设备需要进入快速启动模式。这可以通过以下两种方式之一来实现:

  • 亚洲开发银行(Asian Development Bank)
  • 物理设备按钮

要通过 ADB 进入快速启动设备,设备必须已经启用 USB 调试。通过 ADB 进入快速引导模式的命令是:

adb reboot bootloader

如果无法启用 USB 调试或无法使用 ADB,则在设备启动时通常还会有一组按钮需要按下,类似于进入恢复模式。具体的组合可以在网上找到。

一旦设备处于快速启动模式,运行以下命令将验证设备是否已连接并准备好通信:

fastboot devices

以下命令将自定义恢复映像加载到内存中,并将设备引导至恢复模式:

fastboot boot 'path to image'

Booting to a custom recovery image

设备现在应该重新启动并进入恢复模式。如“恢复模式”部分所示,可能需要装载/数据分区才能访问用户数据。

进入 ADB shell 将显示审查员现在拥有根访问权限。设备将允许根访问,直到它重新启动。

Booting to a custom recovery image

如果快速引导引导命令失败,很可能表明设备的引导加载程序被锁定,如下图所示:

Booting to a custom recovery image

亚行备用提取

谷歌实现了 ADB 备份功能,从安卓 4.0 冰淇淋三明治开始。这允许用户(和法医检查人员)通过 ADB 将应用数据备份到本地计算机。这个过程不需要 root,因此对于取证非常有用。但是,它不会获取设备上安装的每个应用。当开发人员制作新应用时,默认情况下,它被设置为允许备份,但这可以由开发人员更改。实际上,似乎绝大多数开发人员都保留默认设置,这意味着备份确实会捕获大多数第三方应用。不幸的是,大多数谷歌应用禁用备份;来自 Gmail 和谷歌地图等应用的完整应用数据将不包括在内。

类型

由于需要用户与屏幕进行交互,因此这种方法对于锁定的设备无效。

通过 ADB 提取备份

ADB 备份命令的格式为:

adb backup [-f <file>] [-apk|-noapk] [-obb|-noobb] [-shared|-noshared] [-all] [-system|-nosystem] [<packages...>]

标志如下:

  • -f:命名输出文件的路径。如果未指定,默认为当前工作目录中的backup.ab
  • [-apk|noapk]:选择是否备份.apk文件。默认为-noapk
  • [-obb|-noobb]:选择是否备份.obb (APK 扩展)文件。默认为-noobb
  • [-shared|-noshared]:选择是否备份共享存储和 SD 卡的数据。默认为-noshared
  • [-all]:包括所有启用备份的应用。
  • [-system|-nosystem]:选择是否包含系统应用。默认为-system
  • [<packages>]:明确命名要备份的应用包。如果使用-all-shared,则不需要。

捕获所有可能的应用数据的 ADB 备份命令示例如下:

adb backup f C:/Users/Cases/Case_0001/backup.ab shared all

或者,捕获特定应用数据的 ADB 备份命令示例如下:

adb backup f C:/Users/Cases/Case_0001/facebook.ab com.facebook.katana

你应该看到类似这样的东西:

Extracting a backup over ADB

执行备份时,用户必须在设备上批准备份。这意味着不绕过屏幕锁定就无法执行备份:

Extracting a backup over ADB

接受设备上的备份

根据安装的应用数量,备份过程可能会花费大量时间。

解析亚行备份

生成的备份数据存储为一个.ab文件,但实际上是一个已经用 Deflate 算法压缩的.tar文件。如果在创建备份时在设备上输入了密码,该文件也将被 AES 加密。还应该提到的是,这些文件可能存在于嫌疑人的计算机上,可以使用相同的方法进行分析。

有很多免费的实用程序可以把.ab备份文件变成可以查看的.tar。一个这样的工具是安卓备份提取器,位于http://sourceforge.net/projects/adbextractor/

要使用安卓备份提取器,只需将其文件提取到带有备份的目录中。运行该实用程序的命令是:

java -jar abe.jar unpack backup.ab backup.tar

如果命令运行正常,命令行将显示如下:

Parsing ADB backups

输出的第一行通知审查员文件没有加密。如果它被加密了,审查员将不得不在命令行的末尾传递密码作为参数。如输出所示,上一节中创建的备份约为 4 GB,尽管它仍然是压缩的。如果没有指定路径,.tar文件将位于命令行指定的路径或当前工作目录。解压缩.tar文件可以在 Linux 命令行上手动完成,也可以使用许多窗口存档工具之一,如 WinRAR 或 7Zip:

Parsing ADB backups

备份中的目录,在 Windows 资源管理器中可以看到

亚行备份中的数据位置

现在备份已经转换为.tar文件,然后提取,审查员可以查看备份中包含的数据。在我们的示例中,在备份的根目录中有两个目录:

  • apps:该文件夹包含来自/data/data的数据,用于备份中包含的应用。
  • shared:该文件夹包含 SD 卡的所有数据,仅当–shared 参数在命令行传递时才出现。

请注意,应用目录中的文件按照它们的包名存储在目录中(就像在 ADB 外壳中的/data/data中看到的),共享目录正是用户通过将 SD 卡插入计算机来访问 sd 卡时会看到的。

对于从备份中提取的用户数据的一个良性示例,用户的潘多拉活动如下所示。潘多拉是一个流媒体音乐服务,在谷歌 Play 商店有数百万的下载量。潘多拉的应用数据将包含在名为com.pandora.android的文件夹中的备份的应用文件夹中。

Data locations within ADB backups

备份中的潘多拉目录

这是一个相当标准的安卓应用布局,正如在第 2 章设置安卓取证环境中所讨论的。应用的数据库将在db文件夹中:

Data locations within ADB backups

潘多拉备份的数据库文件夹中的文件

XML 配置设置将在sp文件夹中:

Data locations within ADB backups

潘多拉备份的 sp 文件夹中的文件

使用数据库查看器查看pandora.db会显示用户创建的站,以及创建时间的时间戳:

Data locations within ADB backups

备份中 pandora.db 的内容

在 XML 首选项文件中,可以在firstInstallId下找到应用安装的时间戳。请注意,转换时间戳的确切方法见第 7 章安卓应用的取证分析:

Data locations within ADB backups

XML 首选项文件的内容

如果出于某种奇怪的原因,用户潘多拉的使用是调查中的一个主要问题,审查员可以从这两个看似无关紧要的文件中确定什么?

首先,lastTransmissionfirstInstallID时间戳相差在毫秒以内,表示应用安装后从未使用过。此外,在某些情况下,每个工作站的创建日期比应用的安装日期早几年。这将表明用户在其他设备上使用了潘多拉,这可能与调查高度相关。

虽然潘多拉通常与数字取证调查没有密切关系,但它是一个可以从亚行的简单备份中收集数据的例子。更详细的应用分析将在第 7 章安卓应用的取证分析中介绍。

ADB 倾印系统

Dumpsys 是一款内置于安卓操作系统的工具,一般用于开发目的,显示设备上运行的服务状态。然而,它也可以包含感兴趣的信息。Dumpsys 不需要根访问,但与所有 ADB 命令一样,它确实需要在设备上启用 USB 调试,并绕过安全 USB 调试。

可以查看的确切服务因设备和安卓版本而异。要查看可以转储的所有可能服务的列表,请运行以下命令:

adb shell service list

该命令的输出将显示为一个列表,如下所示:

ADB Dumpsys

位于冒号前的服务名是我们将传递给 dumpsys 的参数。一个有效的 dumpsys 命令,使用前面截图中的服务号 7(iphonesubinfo),如下所示:

adb shell dumpsys iphonesubinfo

在下面的截图中,我们看到iphonesubinfo服务的输出包括设备 IMEI:

ADB Dumpsys

有许多有趣的 dumpsys 服务;以下是几个例子。由于 dumpsys 服务可能因操作系统版本和设备而异,因此此列表并非包罗万象,仅旨在向法医表明 dumpsys 的实用性:

  • iphoneseubinfo
  • 电池
  • 前列腺素
  • 用户
  • 阿彭斯
  • 无线网络连接
  • 通知

倾倒 sys 细菌的状态

Batterystats 用于显示正在运行的应用的使用情况。它的输出可能非常冗长,这取决于正在使用的应用的数量。在下面的截图中,输出被重定向到一个文件,因为它不适合 Windows 命令行:

Dumpsys batterystats

这向我们展示了谷歌 Chrome 的网络使用情况。这些信息可以用来表明该应用最近被使用过,即使 Chrome 在隐姓埋名模式下被使用,并且在其他地方没有留下任何法医证据,这些信息也会存在。

唤醒锁定部分对于检测恶意软件非常有用。唤醒锁是一种保持设备唤醒(不进入睡眠模式)的方法,表示应用试图在后台保持运行。

倾印系统 procstats

proccstats是一项服务,通过运行应用来显示处理器的使用情况。与 batterystats 类似,这是另一种可用于显示应用最近在设备上使用的方法,如以下屏幕截图所示:

Dumpsys procstats

倾销用户

从安卓果冻豆开始,谷歌在平板设备上增加了对多用户的支持。随着棒棒糖的发布,谷歌将这种支持扩展到了手机上。长期以来,数字取证中最具挑战性的问题之一是证明在实施犯罪行为时谁在使用设备;“谁在键盘后面?”

在用户服务上运行 dumpsys 将显示所有用户的上次登录信息:

Dumpsys user

由于一次只能有一个用户登录,因此查看最近一次登录的用户将识别设备上当前使用的帐户。

倾销应用 Ops

App Ops 可能是最有趣的 dumpsys 服务。术语“应用操作”通常用于指应用可访问的权限。在旧版本的安卓系统中,有传言称谷歌将允许用户撤销应用的特定权限。这从未实现,但这个服务至少保留了下来,并显示了应用最后一次使用它可以访问的每个权限的时间。下面是谷歌 Chrome 的另一个例子:

Dumpsys App Ops

在上面的输出中,我们可以看到在 App Ops 被 dumpsys 转储之前大约 1 小时 7 分钟,Chrome 使用了TAKE_AUDIO_FOCUS权限,之后使用了AUDIO_MEDIA_VOLUME。这表明 Chrome 是用来听什么和什么时候听的。

更有趣的例子是下面的电话应用:

Dumpsys App Ops

44分钟前,用户使用手机应用需要READ_CONTACTS权限,随后立即使用WRITE_CALL_LOG权限。我们可以推测用户几分钟前打了一个电话44;即使他们后来从记录中删除了这个电话。

wi-fi 倾印系统

无线网络服务将显示一个已经保存连接的所有 SSIDs 的列表。例如,这对于显示用户在某个位置可能很有用。文件系统上也有更详细的无线信息,但需要 root 用户才能查看。使用 dumpsys,我们无需 root 用户即可访问这些数据:

Dumpsys Wi-Fi

倾销系统通知

通知服务将提供关于当前活动通知的信息。这对于记录设备被扣押时的状态或识别哪个应用正在显示特定通知非常有用。每个通知可能相当大,包含大量信息,其中只有一部分可能有用。以下示例显示了来自 Gmail 应用的传入电子邮件,其中包括主题(This is a test email)和正文(To see a test notification):

Dumpsys notification

Dumpsys 结论

运行没有服务名的 dumpsys 命令将在所有可用服务上运行 dumpsys。但是,输出会非常大,应该重定向到文本文件中。在大多数平台上,这样做的命令是:

adb shell dumpsys > dumpsys.txt

这会将输出写入当前工作目录中的 dumpsys.txt。然后可以搜索输出,或者运行解析脚本来提取已知的相关字段。

Dumpsys 是一个极其强大的工具,可以用来显示在设备上其他地方无法获得的信息。我们建议在关闭之前,在每个安卓设备被查封时运行 dumpsys。这将保存大量以后可能有用的信息,并且不需要 root。

绕过安卓锁屏

锁屏是安卓法医检查最具挑战性的方面。通常,整个调查取决于检查者是否有能力接触到锁定的设备。虽然有方法绕过它们,但这可能高度依赖于操作系统版本、设备设置和检查者的技术能力。没有什么神奇的解决方案可以在每台设备上每次都有效。像 Cellebrite 和 XRY 这样的商业取证工具具有相当强大的旁路能力,但远非万无一失。本章将展示考官如何通过免费工具和方法增加绕过锁定设备的几率。

审查员不应试图猜测设备上的模式/个人识别码/密码。许多制造商实施一种设置,在多次尝试失败后擦除设备。许多还允许用户降低这个数字。

锁定屏幕类型

有许多方法可以用来保护设备,绕过每种方法的方法各不相同:

  • 无/幻灯片
  • 模式
  • 个人识别码
  • 密码
  • 智能锁
    • 可信面孔
    • 可信位置
    • 可信设备

可能存在其他安全选项;由于安卓是开源的,可能性只受到开发者想象力的限制。这些是谷歌发布的安卓棒棒糖股票版中的选项。供应商使用的大多数安全选项通常使用这些股票期权中的一种作为故障保险,以防用户无法使用其独特的期权登录。首次使用该设置的版本也指库存安卓;各种制造商可能已经更快地实现了它们。

无/滑动锁定屏幕

滑动解锁屏幕是大多数安卓设备的默认设置。它不提供任何级别的安全性,并且通过在屏幕上向指示的方向滑动手指来绕过。

模式锁定屏幕

模式锁定屏幕是标志性的安卓安全方式。通常被称为扫码 和类似的名字,这些都需要用户用手指在设备上追踪一个图案。这个锁的一个常见旁路是 涂抹攻击,寻找用户手指在屏幕上留下的图案。

密码/个人识别码锁定屏幕

熟悉苹果 iOS 的用户会认可这个选项。它需要用户输入密码或个人识别码来解锁设备。这些被归为一类,因为从法律上讲,它们是相同的:它们以相同的方式存储密码。

智能锁

智能锁是安卓棒棒糖中引入的一个术语,尽管面部解锁选项以前是可用的。它们需要一个特定的条件来解锁设备:必须识别用户的面部,用户必须在已知的位置,或者特定的其他设备必须在附近。

可信脸

面部解锁的工作原理与听起来完全一样:它使用面部识别来确定用户之前是否被设置为可信用户。旧版本的面部锁很容易被可信用户的照片所欺骗,尽管新版本可能需要用户眨眼才能解锁设备。

可信位置

可信位置在安卓棒棒糖中可用,通常也被称为 地理围栏。如果用户位于已标记为受信任的位置(如家中或工作场所),设备将不会锁定。用户无需输入,但必须启用全球定位系统。

可信设备

可信设备是在安卓棒棒糖有售,通过蓝牙工作;如果附近有被设置为可信设备的设备,锁定屏幕将被禁用。这可以用于智能手表、通过蓝牙配对的车辆、蓝牙耳机或任何其他支持蓝牙的设备。

所有智能锁选项都需要模式/个人识别码/密码作为备份安全方法。这意味着我们只需要学习如何绕过模式/个人识别码/密码,就可以破解所有的安全选项。

一般旁路信息

在所有情况下,绕过锁定屏幕将需要从设备中检索文件。模式锁在/data/system/gesture.key存储为哈希值,个人识别码/密码锁在/data/system/password.key存储为哈希值。此外,password.key 哈希是加盐的;盐值存储在安卓 4.4 之前的/data/data/com.android.providers.settings/databases/settings.db,以及运行安卓 4.4 及更高版本的设备上的/data/system/locksettings.db

如果设备被锁定,审查员应该如何访问这些文件?同样,没有每次都有效的神奇解决方案,但有一些选项,如下所示:

  • 亚洲开发银行(Asian Development Bank)
    • 需要根目录
    • 需要 USB 调试
    • 需要安全 USB 调试配对(取决于操作系统版本)
  • 引导至自定义恢复模式
    • 不需要根目录(根目录将通过恢复映像提供)
    • 不需要 USB 调试(通过快速启动完成)
    • 不需要安全 USB 调试(这个完全绕过)
    • 需要解锁的引导加载程序
  • JTAG/芯片关闭
    • 高度先进
    • 不需要任何特定的设备设置或选项

安卓 4.4 之前的设备上需要拉取才能破解 PIN/密码的文件有:

  • / data/system/password.key
  • /data/data/com.android.providers.settings/databases/settings.db

在运行安卓 4.4 及更高版本的设备上,破解个人识别码/密码需要提取的文件有:

  • /data/system/password.key
  • /data/system/locksettings.db

只需要提取一个文件就可以破解所有安卓版本的模式锁:

  • /data/system/gesture.key

类型

实际破解个人识别码或密码并不总是必要的。也可以通过简单地覆盖或删除文件来绕过它们。然而,这改变了原始证据,在你的管辖范围内可能没有法律效力。

请注意,以下破解部分不适用于棒棒糖设备。模式锁不再是无盐的,并且在撰写本文时,还没有发布关于如何回收盐的信息。但是,仍然可以通过删除相关文件来绕过锁定屏幕。

有许多工具可以自动绕过锁屏;但是,在本章中,我们将展示手动过程来解释这些工具在后台做什么。执法免费的好工具可以在https://andriller.com/找到。

破解安卓模式锁

现在我们有了gesture.key,其中包含模式锁信息,让我们来看看文件内容:

Cracking an Android pattern lock

十六进制编辑器中手势键的内容

文件的十六进制内容是刷卡模式的未加密 SHA-1 散列。事实上,可能的模式数量有限(最少有四位数,最多有九位数,因为每个数字只能使用一次),破解此哈希的最简单方法是字典攻击。考官可以创建一个包含所有可能模式的字典,但是重新发明轮子并不总是必要的。总部位于英国的 CCL 取证公司提供了一个免费的 Python 脚本来创建哈希字典。可在http://www . cclgroupltd . com/product/Android-pattern-lock-scripts/下载。

文件是GenerateAndroidGestureRainbowTable.py。要运行它,Python 3 必须安装在考官的系统上。Python 3 可在https://www.python.org/downloads/下载。许多取证工具提供 Python 支持或自己使用,因此审查员可能已经安装了它。要执行该文件,只需导航到包含它的目录并运行:

Cracking an Android pattern lock

该脚本可能需要一段时间才能运行,可能需要 20 到 30 分钟。一旦完成,现在应该有一个名为AndroidLockScreenRainbow.sqlite的文件与GenerateAndroidGestureRainbowTable.py脚本在同一个目录中。

现在我们有了一个包含所有可能的安卓模式的散列的数据库,我们只需要查找我们在gesture.key文件中找到的散列。这可以用 SQLite 查看器甚至 SQL 命令手动完成。然而,CCL Forensics 也提供了Android_GestureFinder.py,一个将在先前创建的数据库中查找散列的脚本。

不幸的是,这个免费的脚本不太适合我们的目的。它是为了查看物理转储二进制文件并找到锁屏模式而构建的;我们已经有了包含模式的文件。为了让脚本正常工作,我们需要修改代码。Android_GestureFinder.py需要在某种代码友好的编辑器中打开;记事本++,崇高的文本,或 Python IDLE 图形用户界面都将工作。以下截图来自崇高文本。复印一份文件,打开原件,找到第 85 行,上面写着:

if regex.match(chunk) is not None:

这一行需要注释掉。为此,只需在行首放置一个#标志:

#if regex.match(chunk) is not None:

由于 Python 的格式,我们现在将撤消注释掉的语句后面的行中的缩进。第 86、89、91 和 92 行需要移到左边,以便它们与我们的注释掉的语句一致。最后,第 94 行需要向左移动四个退格,这样它就比上面一行缩进一个制表符。最终代码应该如下所示:

Cracking an Android pattern lock

安卓系统的最终代码

请注意,第 85 行现在以#开始,第 86、89、91 和 92 行与第 85 行对齐,第 94 行从其他行向右缩进一个制表符(或从其原始位置缩进四个退格)。

现在代码已经准备好运行我们的文件了;将更改保存到Android_GestureFinder.py。确保AndroidLockScreenRainbow.sqlitegesture.key文件与Android_GestureFinder.py在同一个目录下,并运行以下脚本:

Cracking an Android pattern lock

输出应该很快返回,因为它在哈希数据库中执行简单的查找。Offset是否定的,因为我们对单个文件使用了脚本;如果指向二进制物理转储,它将显示 blob 中锁屏散列的偏移量。Hash列显示找到的哈希值,Pattern是对应的锁屏模式:

Cracking an Android pattern lock

锁定屏幕编号

在本例中,图案将从左上角的0开始,穿过中间的 4 ,触摸右下角的 8 ,然后穿过底部中间的 7 ,并在左下角的 6 结束。这种模式现在可以在设备上绕过锁定屏幕。

如果脚本遇到错误,文件可能没有被正确修改。以下结果可能表明该脚本未被正确修改;也许运行的是文件的副本,而不是修改后的版本:

Cracking an Android pattern lock

要解决此错误,请验证脚本是否如上所示进行了修改。以下错误表明缩进不当:

Cracking an Android pattern lock

要解决此错误,请导航到指定的行(在上面的示例中为 86),并确保对齐方式如前面修改后的代码所示。

如果错误无法解决,或者如果修改脚本对检查人员来说太令人生畏,哈希值总是可以在哈希数据库中手动查找。在http://sourceforge.net/projects/sqlitebrowser/可以找到一个优秀的免费 SQL 查看器,SQLite 的数据库浏览器。

用数据库浏览器为 sqlite 打开 androidlock screenrainbow . SQLite,并选择“浏览数据”选项卡。然后,只需在哈希列的搜索字段中键入在手势. key 中找到的哈希值。请注意,数据库中的字符是小写的;搜索字段区分大小写:

Cracking an Android pattern lock

sqlite 浏览器中 androidlocksscreenrainbow . SQLite 文件的内容

结果就像脚本已经运行过一样。

破解安卓个人识别码/密码

要破解个人识别码/密码锁,我们需要查看之前提取的文件内容。Password.keygesture.key非常相似;它包含一个密码哈希,如下图所示:

Cracking an Android PIN/Password

十六进制编辑器中 password.key 的内容

然而,这一次是咸的。为了有机会破解它,必须回收盐。如上所述,它的位置将取决于设备运行的安卓版本。如果设备运行 4.3 或更低版本,它将位于secure表内的settings.db文件中。在 4.4 或更高版本中,它将位于locksettings表内的locksettings.db中。下面的例子显示了locksettings.db,但是两者的过程是相同的。

在数据库文件中,我们需要定位lockscreen.password_salt键。这可以在 SQL 浏览器中完成,或者只需在十六进制编辑器中打开文件并搜索即可。盐值突出显示如下:

Cracking an Android PIN/Password

十六进制编辑器中 locksettings.db 的内容

对于模式锁,我们能够使用字典攻击来快速破坏模式,因为可能性相对较少。有了加盐散列,字典攻击是不可行的,因此我们将简单地强制它。

CCL 取证再次为此目的提供了一个有用的 Python 脚本。也可以使用其他破解工具,如 hashcat。 CCL 取证密码工具可在免费下载。将下载两个文件,BruteForceAndroidPin.pyRecoverAndroidPIN.pyRecoverAndroidPIN.py用于在物理图像中定位必要的文件;我们不需要它来达到我们的目的。

BruteForceAndroidPIN.py的格式为:

python BruteForceAndroidPIN.py <hash> <salt> <max code length (4-16)> t

末尾的t参数用于指示哈希是密码;破解个人识别码不需要它,只会增加运行时间。

上面显示的哈希值来自个人识别码,因此我们只需填写<hash><salt><max code length>字段:

Cracking an Android PIN/Password

这个例子的个人识别码是2587,如输出所示。破解这个密码不到一秒钟,然而更长的密码甚至更短的密码可能需要更长的时间。

安卓 SIM 卡提取

传统上,SIM 卡用于在设备之间传输数据。过去,SIM 卡用于存储许多不同类型的数据,例如:

  • 用户数据
    • 联系人
    • 短信
    • 拨打的电话
  • 网络数据
    • 集成电路卡识别符(ICCID):SIM 卡的序列号
    • 国际移动用户身份 ( IMSI ):将 SIM 卡与特定用户账户关联的标识符
    • 移动综合业务数字网:分配给用户识别模块的电话号码
    • 位置区域标识 ( LAI ):标识用户所在的小区
    • 认证密钥 ( Ki ):使用向移动网络认证
    • 各种其他网络特定信息

随着设备存储、SD 卡和云备份容量的增加,在 SIM 卡上存储数据的必要性已经降低。因此,大多数现代智能手机通常不会在 SIM 卡上存储太多用户数据。上面列出的所有网络数据仍然存在于 SIM 卡上,因为 SIM 卡是连接所有现代(4G)蜂窝网络所必需的。

与所有安卓设备一样,虽然没有具体规定用户数据不能存储在 SIM 卡上,但默认情况下这是不会发生的。单个设备制造商可以轻松决定将用户数据写入 SIM,单个用户可以下载应用来提供该功能。这意味着设备的 SIM 卡应该在法医检查期间进行检查。这是一个非常快速的过程,永远不应该被忽视。

获取 SIM 卡数据

SIM 卡应始终从设备中取出并单独检查。虽然有些工具声称通过设备接口读取 SIM 卡,但这可能无法恢复 SIM 卡上已删除的数据或所有数据;考官确定所有数据都已获取的唯一方法是使用经过测试和验证的工具,通过独立的 SIM 卡读卡器读取 SIM 卡。

SIM 卡的位置因设备而异,但通常存储在电池下方或设备侧面的托盘中。取出 SIM 卡后,应将其放入 SIM 卡读卡器中。市场上有数百种 SIM 卡读卡器,所有主要的移动取证工具都附带了一个读卡器,可以与他们的软件配合使用。通常,取证工具也会支持第三方 SIM 卡阅读器。

令人惊讶的是,缺乏全面、免费的 SIM 卡读取软件。使用的任何软件在用于实际的法医调查之前,都应该在已填充已知数据的 SIM 卡上进行测试和验证。此外,请记住,许多可用的免费软件适用于旧的 2G/3G SIM,但在现代 4G SIM 上可能无法正常工作。我们用了移动编辑!Lite,免费版 mobile edit!,为以下截图。在http://www.mobiledit.com/downloads有售。

下面的截图显示了一个从运行 4.4.4 版本的安卓手机中提取 4G SIM 卡的示例;请注意,尽管 SIM 卡已被积极使用了一年多,但没有获得任何可被视为用户数据的信息,尽管诸如 ICCID、IMSI 和 MSISDN(自己的电话号码)等字段可能对传票/逮捕令或调查的其他方面有用。

Acquiring SIM card data

SIM 卡提取概述

以下截图突出显示 SIM 卡上的短信:

Acquiring SIM card data

下图突出显示了 SIM 卡的电话簿:

Acquiring SIM card data

下图突出显示了 SIM 卡(也称为 MSISDN)的电话号码:

Acquiring SIM card data

SIM 卡安全

由于 SIM 卡符合既定的国际标准,所有 SIM 卡都提供相同的安全功能:4 至 8 位数的个人识别码。通常,该个人识别码必须通过设备上的菜单进行设置。在安卓设备上,这个设置可以在设置 | 安全 | 设置 SIM 卡锁中找到。SIM 卡个人识别码完全独立于任何锁屏安全设置,只需在设备启动时输入。SIM 卡 PIN 只保护 SIM 卡上的用户数据;即使 SIM 卡被 PIN 锁定,所有网络信息仍可恢复。

SIM 卡将允许三次尝试输入个人识别码。如果其中一次尝试是正确的,计数器将重置。另一方面,如果所有这些尝试都不正确,SIM 卡将进入个人解锁键 ( PUK ) 模式。PUK 是一个由运营商指定的 8 位数号码,在购买 SIM 卡时经常可以在文档中找到。任何商业取证软件都不可能绕过 PUK;因此,检查人员永远不要试图在设备上输入个人识别码,因为设备不会显示在激活 PUK 之前还有多少次尝试。考官可能会在不知情的情况下 PUK 锁定了 SIM 卡,并且无法访问该设备。然而,取证工具将显示在 PUK 被激活之前还有多少次尝试,如前面的截图所示。

SIM 卡 pin 码的常见运营商默认值为 0000 和 1234。如果在激活 PUK 之前还有 3 次尝试,审查员可以使用这些默认值之一成功解锁 SIM。

运营商在发放 SIM 卡时通常会保留 PUK 密钥。这些可以通过向承运人发出传票或授权令获得。

SIM 克隆

SIM 个人识别码本身几乎不提供额外的安全性,并且可以通过 SIM 克隆轻松绕过。SIM 克隆是几乎所有商业移动取证软件都提供的功能,尽管克隆一词有些误导。在移动取证的情况下,SIM 克隆是将网络数据从锁定的 SIM 复制到没有激活个人识别码的无菌 SIM 上的过程。手机将根据该网络数据(通常是国际刑事调查局和 IMSI)识别克隆的 SIM 卡,并认为这是以前插入的同一 SIM 卡,但这次将没有 SIM 卡个人识别码。这个克隆的 SIM 卡也将无法访问蜂窝网络,这使得它成为类似于飞机模式的有效解决方案。因此,SIM 克隆将允许检查者访问设备,但是原始 SIM 上的用户数据仍然不可访问,因为它仍然受到个人识别码的保护。

我们不知道有任何执行取证 SIM 克隆的自由软件。然而,几乎所有商用移动取证套件都支持它。这些套件通常包括一个 SIM 卡读卡器、执行克隆的软件,以及用于克隆过程的多个空白 SIM 卡。

安卓棒棒糖的问题和机遇

正如在章节中多次提到的,最近发布的安卓棒棒糖 5.0 版本引入了许多强大的安全功能,这当然给法医带来了复杂性。最初宣布安卓棒棒糖设备将默认配备全磁盘加密,然而,由于许多设备的性能问题,谷歌后来收回了这一要求。谷歌只是强烈建议在用户首次创建账户时启用全磁盘加密,而不是要求。谷歌也暗示这将是未来操作系统版本的要求,更多信息可在9.9 部分找到。

启用全磁盘加密的设备几乎不可能绕过锁定的设备,因为即使密钥文件可以恢复,它们也会被加密;尽管商业工具制造商最终肯定会赶上来。在撰写本文时,没有已知的绕过锁定的加密棒棒糖设备的方法,除非它启用了 USB 调试,并且之前记住了计算机的 RSA 密钥来绕过安全 USB 调试。在这种情况下,adbkeyadbkey.pub文件可以从嫌疑人的电脑中取出,放在检查机上;然后,该设备会认为它正在与一台已知的、经过批准的计算机进行通信。在 Windows 电脑上的C:\Users\<username>\.android和苹果电脑上的/Users/<username>/.android可以找到adbkeyadbkey.pub文件。

执行棒棒糖取证的审查员有一个显著的优势:本章前面提到的智能锁。智能锁允许用户设置条件,如果满足这些条件,设备将保持解锁状态,甚至不需要输入密码一次。如果在已启用的可信位置进行检查,检查者将无需绕过锁定。如果受信任设备在附近,并且在检查设备时打开,也是如此。但是,设备上没有显示正在使用受信任的设备;该设备似乎没有锁屏。因此,保护现场的所有数字证据变得更加重要。以前会被忽视的设备,如蓝牙耳机,可能会成为让考官通过锁定设备的关键。设备与车辆配对变得越来越普遍,因此检查人员可能不得不坐在嫌疑人的车辆上进行提取!棒棒糖的额外安全性意味着审查员可能需要在取证过程中发挥更大的创造力。

安卓棒棒糖还为所有设备带来了多用户支持,此前仅限于平板电脑。在具有多个帐户的设备上,所有用户的数据仍然可以在/data分区中找到,但是驻留在稍微不同的位置。如果在设备上设置了多个账户,每个账户的 app 数据目录可以在/data/user中找到。每个用户将被分配一个唯一的号码;0是设备上的第一个账户设置。/data/user/0目录实际上是/data/data的象征性链接。第二个账户在10目录,直接包含第二个用户的所有应用数据。每个添加的用户都存储在10递增的目录中;即第三用户在/data/user/20,第四用户在/data/user/30等等。

总结

本章涵盖了许多与安卓设备的逻辑提取相关的主题。概括来说,各种方法及其要求如下:

|

方法

|

要求

| | --- | --- | | 亚行贷款 |

  • USB debugging enabled
  • Secure USB debugging in 4.2.2+
  • Get user data through Shangrao root access

| | 亚行退出复苏模式 |

  • It must be a custom recovery to enable ADB access.
  • Root access to get user data

| | 从自定义恢复映像快速启动 |

  • Unlock boot loader
  • Boot image of device

| | 亚行支持 |

  • USB debugging has been enabled.
  • Secure USB debugging in 4.2.2+
  • Bypass must be done from the running device (non-recovery mode)

| | adb dumpsys 公司 |

  • USB debugging enabled
  • Secure USB debugging in 4.2.2+
  • Bypass must be done from the running device (non-recovery mode)

| | SIM 卡提取 |

  • No, it should be done independently of the equipment.

|

此外,可以从 SD 卡中恢复有价值的用户数据,这将在第 5 章从安卓设备中物理提取数据中介绍。

如果屏幕被锁定,审查员可以使用上面列出的方法提取关键文件并破解它们,以便绕过它。

这一章有很多数据。为了帮助简化,建议的最佳实践流程图如下所示:

Summary

安卓取证流程图