Android 渗透测试学习手册 第五章 Android 取证

2022-12-01 15:26:17 浏览数 (1)

第五章 Android 取证

作者:Aditya Gupta 译者:飞龙 协议:CC BY-NC-SA 4.0

5.1 取证类型

取证是使用不同的手动和自动方法从设备中提取和分析数据。它可以大致分为两类:

  • 逻辑采集:这是的一种取证方法,其中取证员与设备交互并从文件系统提取数据。该数据可以是任何内容,诸如应用特定数据,联系人,通话记录,消息,web 浏览器历史,社交网络用户信息和财务信息。逻辑采集的优点是,在大多数情况下比物理采集更容易获取逻辑信息。然而,在一些情况下,该方法的一个限制是,在这种情况下的证据(智能手机及其数据)具有被篡改的高风险。
  • 物理采集:这意味着对整个物理存储介质进行逐位拷贝。我们还可以在执行物理采集时定位不同的单个分区。与逻辑采集相比,这种方法慢得多,但更可靠和可信赖。此外,为了在智能手机上执行物理采集,检查者需要熟悉不同类型的文件系统,例如 Yet Another Flash File System 2(YAFFS2),ext3,ext4,rfs 等。

5.2 文件系统

在我们深入取证以及从设备提取数据之前,我们应该清楚地了解文件系统类型和它们之间的差异。正如我们前面讨论的,在 Android 中进行物理采集有点棘手,一个主要原因是文件系统不同。

Android 文件系统的主分区通常被分区为 YAFFS2。在 Android 中使用 YAFFS2 的原因是,它为设备提供了优势,这包括更高的效率和性能,以及更低的占用空间。几年前,当 Android 刚刚推出时,取证是平台上的一个大问题,因为几乎没有支持 YAFFS2 文件系统格式的取证工具。

SD 卡是 FAT32 类型,是正常系统用户中的共享格式。因此,为了获取 SD 卡的映像,可以使用任何常规的数据采集取证工具。

制作副本或创建现有数据系统映像的最有名的工具之一是 dd,它从原始来源到系统进行逐块复制。然而,由于该工具的一些缺点,例如缺少内存块以及跳过坏块,会导致数据损坏,因此不推荐在取证调查期间使用。在接下来的章节中,我们将深入介绍 Android 文件系统,并将研究如何以最有效的方式从文件系统中提取数据。

Android 文件系统分区

正如我们在前面的章节中讨论的,Android 基于 Linux 内核,并从 Linux 本身派生其大部分功能和属性。 在 Android 中,文件系统被划分为不同的分区,每个分区都具有重要意义。

为了在 Android 设备上查看分区,我们可以使用adb shell然后查看proc下的mtd文件,如下面的命令所示。 在一些不存在mtd文件的设备中,在proc下有另一个名为partitions的文件,如下面的命令所示:

代码语言:javascript复制
adb shell
cat /proc/mtd

以下是在设备上执行上述命令来列出所有分区后的输出的屏幕截图。

正如我们在上面截图中看到的,存在各种文件系统分区及其各自的大小。 在大多数 Android 设备上,我们通常会看到一些数据分区,如systemuserdatacacherecoverybootpdskpanicmisc,它们安装在dev列指定的不同位置。 为了看到不同的分区和类型,我们可以在adb shell中键入mount

正如我们在下面的截图中可以看到的,通过执行mount命令列表,所有不同的分区及其位置将被挂载:

5.3 使用dd提取数据

dd工具是取证中最常用的工具之一,以便为数据提取过程创建映像。 换句话说,它用于将指定的输入文件转换并复制为输出文件。 通常在分析期间,我们不允许与证据直接交互和更改。 因此,获得设备文件系统的映像,然后对其执行分析总是一个好的选择。

默认情况下,dd工具在大多数基于 Linux 的系统中,以及在 Android 设备中的/system/bin中都存在。 如果它不存在于你的设备中,您可以安装 BusyBox,它将安装dd以及一些其他有用的二进制文件。 你可以从 BusyBox 应用程序(https://play.google.com/store/apps/details?id=stericson.busybox)获取dd的二进制文件,或者你甚至可以自己交叉编译。

dd的标准语法如下:

代码语言:javascript复制
dd if = [source file which needs to be copied] of = [destination file to be created]

有几个命令行选项可以与dd一起传递,其中包括:

  • if:这是要复制的输入文件
  • of:这是内容要复制给它的输出文件
  • bs:这是块大小(一个数字),指定dd复制映像的块大小
  • skip:这是在开始复制过程之前要跳过的块数

让我们现在继续,并取得现有分区之一的映像来进行取证

我们需要找到的第一个东西是不同的分区,它们存在于我们的 Android 设备上,就像我们之前做的一样。 这可以通过查看/proc/mtd文件的内容来完成。

接下来,我们需要了解数据分区的位置,因为这里我们采集数据分区的备份。 在这种情况下,它位于mtdblock6。 这里,我们将启动dd,并将映像存储在sdcard中,稍后我们将使用adb pull命令拉取映像。 adb pull命令只是简单地允许你将文件从设备拉取到本地系统。

复制可能需要一些时间,一旦复制完成,我们可以退出adb shell,访问我们的终端,并键入以下代码:

代码语言:javascript复制
adb pull /mnt/sdcard/data.img data.img

我们还可以使用 Netcat 工具将映像直接保存到远程位置/系统。 为此,我们首先需要将端口从设备转发到系统。

代码语言:javascript复制
adb forward tcp:5566 tcp:5566

同时,我们需要在这里启动 Netcat 工具,监听端口 5566。

代码语言:javascript复制
nc 127.0.0.1 5566 > data.img

此后,我们必须执行adb shell进入设备,然后启动dd工具,并将输出转发到 Netcat。

代码语言:javascript复制
nc -l -p 5566-e dd if=/dev/block/mtdblock6

这将把映像保存到系统中,而不是保存在设备上的任何位置,然后再拉取它。 如果你的手机上没有dd二进制,你也可以安装 BusyBox 来获得dd二进制。

开始取证调查之前应该确保的一件事是,检查设备是否被设置为在超级用户模式下操作,这通常需要设备的 root。 然而,我们遇到的所有设备并不都是 root。 在这些情况下,我们将使用我们的自定义恢复映像来启动手机,然后 root 设备。

5.4 使用 Andriller 提取应用数据

Andriller 是由 Denis Sazonov 以 Python 编写的开源多平台取证工具,它有助于从设备中提取一些基本信息,并且有助于进行取证分析。 分析完成后,将生成 HTML 格式的取证报告。

为了下载它,我们可以访问官方网站http://android.saz.lt/cgi-bin/download.py并下载必要的包。 如果我们在 Linux 或 Mac 环境中,我们可以简单地使用wget命令来下载并解压软件包。 因为它只是一个 Python 文件,以及一些其他必要的二进制文件,所以没有必要安装它; 相反,我们可以直接开始使用它。

代码语言:javascript复制
$ wget http://android.saz.lt/download/Andriller_multi.tar.gz

Saving to: 'Andriller_multi.tar.gz'

100%[=============================>] 1,065,574    114KB/s   in 9.2s

2013-12-27 04:23:22 (113 KB/s) - 'Andriller_multi.tar.gz' saved [1065574/1065574]  

$ tar -xvzf Andriller_multi.tar.gz

一旦解压完成,我们可以访问 Andriller 文件夹,之后只需使用python andriller.py运行它。 Andriller 的主要依赖之一是 Python 3.0。 如果你使用 Python 2.7 ,它预装在大多数操作系统上,你可以从官方网站http://python.org/download/releases/3.0/http://getpython3.com/下载 3.0 版本 。

现在,一旦我们连接了设备,我们可以继续运行Andriller.py,以便从设备捕获信息,并创建日志文件和数据库。

代码语言:javascript复制
$ python Andriller.py

一旦开始运行,我们会注意到,它会打印出设备的几个信息,如 IMEI 号码,内部版本号和安装的社交网络应用程序。 这里,它检测到 WhatsApp 应用程序以及与其相关联的电话号码,因此它将继续并拉取 WhatsApp 应用程序的所有数据库。

分析完成后,我们将看到类似以下屏幕截图的屏幕:

如果我们查看它为我们创建的 HTML 文件,它将显示一些关于设备的基本信息,如下面的屏幕截图所示。 它还在文件夹db下的同一文件夹目录中创建所有数据库的转储。

如果我们分析这个应用程序的源代码,我们可以在Andriller.py的源代码中看到,它会检查设备中存在的不同包。 我们还可以在这里添加我们自己的包并保存数据库,我们希望 Andriller 为我们寻找它。

如下面的截图所示,你可以手动添加更多要使用 Andriller 备份的数据库。

5.5 使用 AFLogical 提取所有联系人、通话记录和短信

AFLogical 是由 viaForensics 编写的工具,以便从设备创建逻辑采集并将结果呈现给取证员。它从设备中提取一些关键组件,包括短信,联系人和通话记录。

为了使用 AFLogical,我们需要从 GitHub 库https://github.com/viaforensics/android-forensics下载项目的源代码。下载后,我们可以将此项目导入我们的 Eclipse 工作区并进行构建。我们可以从我们现有的代码中访问File | New | Other | Android | Android Project,然后选择下载的源代码路径。

一旦我们将项目导入到我们的工作区,我们就可以在我们的设备上运行它,方法是右键单击项目并选择“运行为 Android 应用程序”。一旦我们运行它,我们将注意到,我们的设备上的AFLogical应用程序提供了选项来选择要提取什么信息。在以下屏幕截图中,你将看到 AFLogical 在设备上运行,并询问用户有关要提取的详细信息:

我们将检查所有东西,然后单击Capture。 AFLogical 将开始从不同来源捕获详细信息,并将捕获的详细信息保存在 SD 卡中的csv文件中。 捕获过程完成后,我们会注意到一个警告框。

我们现在可以查看我们的 SD 卡路径,我们可以找到保存的.csv文件。

然后我们可以在任何.csv文件查看器中打开这些.csv文件来查看详细信息。 因此,AFLogical 是一个快速有效的工具,用于从设备中提取一些信息,如联系人,通话记录和消息。

5.6 手动转储应用的数据库

既然我们已经看到,很多工具可以帮助我们进行取证,我们还可以使用adb和我们的手动技能从设备中提取一些信息。 正如我们之前学到的,应用程序文件存储在/data/data/[应用程序的包名]/位置。 由于大多数应用程序也使用数据库来存储数据,我们注意到在名为directory的包中有另一个名为databases的文件夹。 这里需要注意的一点是,这只会帮助我们从使用数据库的应用程序中提取信息,以便转储应用程序和其他相关信息。 在某些应用程序中,我们可能还会注意到,应用程序将数据存储在 XML 文件中或使用共享首选项,我们需要手动审计它们。

Android 使用 SQLite 数据库(我们将在下一章深入讨论)与.db文件格式。 下面是手动提取所有数据库的步骤:

  • 进入设备,并创建一个文件夹来存储所有数据库
  • 查找所有.db文件并将其复制到创建的文件夹
  • 压缩文件夹并拉取它

因此,我们可以使用adb shell查找/data/data/location中的所有数据库文件,将它们压缩到归档文件中,然后将其拉取出来。

在 SD 卡中创建一个名为BackupDBS的文件夹。

为此,我们可以简单地执行adb shell,然后在/mnt/sdcard下创建一个名为BackupDBS的文件夹:

代码语言:javascript复制
adb shell 
mkdir /mnt/sdcard/BackupDBS

查找所有.db文件并将其复制到BackupDBS

为此,我们可以使用一个简单的命令行绝技来查找和复制/data/data中的所有.db文件。 我们首先使用find命令查找所有.db文件。 在以下命令中,我们使用find工具,并指定从当前位置搜索,然后查找具有任何文件名(通配符*)以及扩展名db的所有文件(即*.db),以及类型为文件f

代码语言:javascript复制
find . -name "*.db" -type f

下面的截图展示了输出:

现在,我们可以简单地使用cpfind,以便将其复制到BackupDBS目录

代码语言:javascript复制
find . -name "*.db" -type f -exec  cp {} /mnt/sdcard/BackupDBS ;

现在,如果我们查看/mnt/sdcard下的BackupDBS目录,我们的所有数据库都已成功复制到此位置。

压缩并拉取文件。 现在,在同一位置,我们可以使用tar工具创建一个压缩包,并使用adb pull

代码语言:javascript复制
tar cvf backups.tar BackupDBS/

然后,从系统中,我们可以简单地像这样拉取它。 此方法也可以用于通过在/data/app/data/app-private文件夹中查找文件类型.apk,来从手机中拉取所有.apk文件。

如果我们仔细看一看,在我们的backups.tar中,还有一个名为msgstore.db的 WhatsApp 应用程序的数据库。 让我们继续分析和研究数据库内部的内容。 为此,我们需要首先解压我们刚才拉取的tar归档文件。

代码语言:javascript复制
tar -xvf backups.tar

现在,为了分析名为msgstore.db的 WhatsApp 的 SQLite 数据库,我们可以下载并使用任何 SQLite 浏览器。 对于本书,我们使用 SQLite 数据库浏览器,可以从http://sourceforge.net/projects/sqlitebrowser/下载。

现在,如果我们在 SQLite 数据库浏览器中打开msgstore.db文件并访问浏览器数据,我们可以在 SQLite 浏览器中看到我们的所有 WhatsApp 对话。 在以下截图中,我们可以看到在 SQLite 数据库浏览器中打开的msgstore.db,它显示 WhatsApp 应用程序的所有聊天对话:

5.7 使用 logcat 记录日志

Android logcat 有时在取证调查期间很有用。 它包含在电话以及收音机上执行的所有活动的日志。 虽然不完整,它可以帮助调查员了解设备中发生了什么。

为了捕获和保存 logcat 转储文件,我们可以简单地使用adb logcat并将输出保存到一个文件,稍后我们可以分析它。

代码语言:javascript复制
adb logcat > logcat_dump.log

我们还可以使用logcat以更加详细和有用的方式获取日志。 例如,我们可以通过指定-b参数和radio来获取收音机日志。 -b标志用于显示缓冲区(如收音机或事件)的 logcat。 -v标志用于控制输出格式,它代表verbose(详细),也可以是timebriefprocesstagrawthreadtimelong。 除了-v,我们还可以使用-d(调试),-i(信息),-w(警告)或-e(错误)。

代码语言:javascript复制
adb logcat -v time -b radio -d 

我们还可以使用其他工具,如dmesg,它将打印内核消息,以及getprop,它将打印设备的属性:

代码语言:javascript复制
adb shell getprop

XDA 开发人员成员 rpierce99 还提供了一个应用程序,用于自动捕获来自 logcat 和其他相关来源的信息,这些信息可以从https://code.google.com/p/getlogs/下载并使用。

5.8 使用备份功能来提取应用数据

Android 从 4.0 起引入了使用adb的备份功能。 此功能可用于创建应用程序的备份及其整个数据。 这在取证上非常有用,因为取证员可以捕获应用程序及其整个数据。 请参阅以下步骤:

这可以通过在终端中执行adb backup命令,后面附带应用程序的包名来完成。 如果我们不知道应用程序的准确包名称,我们可以使用pm列出所有包,然后过滤应用程序名称。

执行此操作的另一种方法是使用pm list package命令,其中-f标志指定要在包名称中查找的字符串。

接下来,我们可以简单地使用应用程序的包名称,来备份任何我们需要的应用程序。

代码语言:javascript复制
adb backup [package name] -f [destination file name]

目标文件将以文件扩展名.ab(Android 备份)存储。 在这里,我们采集了 WhatsApp 应用程序的备份。

一旦我们运行命令,它将暂停,并要求我们在设备上确认,如下面的截图所示:

在这里,我们需要选择Back up my data(备份我的数据)选项,并且还可以为备份指定加密密码。 一旦备份过程完成,我们将获得whatsapp_backup.ab文件。

接下来,我们需要解压此备份,以便从.ab文件获取数据库。 为此,我们将使用ddopenssl创建一个.tar文件,然后我们可以解压它。

现在,由于我们获得了.tar文件,我们可以使用tar xvf简单解压它。

一旦它解压完成,我们可以访问apps/[package-name]下的db文件夹,来获取数据库。 这里,程序包名称为com.whatsapp

让我们快速使用ls -l来查看db文件夹中的所有可用文件。 正如你可以看到的,我们拥有msgstore.db文件,它包含 WhatsApp 对话,我们已经在上一节中看到了。

总结

在本章中,我们分析了执行取证的不同方法,以及各种工具,我们可以使用它们来帮助我们进行取证调查。 此外,我们了解了一些我们可以执行的手动方法,来从设备中提取数据。

在下一章中,我们将深入 SQLite 数据库,这是 Android 渗透测试的另一个要素。

0 人点赞