继上一篇Android-APP 安全(四)之流量分析的内容
在安全测试(四)后面部分有提到写android取证的内容,android取证中关于文件系统与数据结构会在本章详解写道。android取证详细取证的内容、方式、取证工具以及工具的使用方式将在下一章写到。
以下对Android 取证技术的讲解,整理思路取材大多来源于网络以及《Android 取证实战》一书。
上一篇文章已简单介绍了Andorid关于存储方式以及存储路径。这篇文章会详细介绍下Andorid文件系统与数据结构。本篇涉及比较基础底层,主要为linux内核(也就是android)文件系统的分析,看的过程可能比较枯燥~但是对于我们后面学习Android取证以及对Android 安全研究的同学都有帮助~
因为运行Andorid终端设备的底层硬件和软件都非常出色,所以取证师和安全工程师主要工作重点是获取、分析及理解终端设备中所存储的数据。包括所存储数据的类型、数据存储的位置、以什么样的方式进行存储以及存储这些数据的媒体介质的特性等。
1.1 存储的数据
应用程序时产生这些数据的源泉,而应用程序又来源于很多不同方面,包括以下来源:
Andorid自带的应用程序
由制造商安装的应用程序
由无线移动服务提供商安装的应用程序
更多的谷歌/Andorid应用程序
由用户自己安装的应用程序,通常来源于Andorid市场
在Andorid终端设备上存在的抽样数据如下:
文本数据(短信/彩信)
联系人
通信日志
邮件数据(Gmail、Yahoo、Exchange)
短信/聊天
相片/视频
上网记录
搜索记录
驾驶方向
存储在终端设备上的文件
收藏的音乐
财务信息
购物记录
共享文件
1.2 应用数据存储目录结构
Andorid应用程序主要将数据存储在两个地址:内部存储和外部存储。内外部存储我在Andorid-APP 安全(四)之流量分析与内外存储 这篇中提到过,详细了解可以参考https://www.secpulse.com/archives/97228.html。
最常见的标准目录见下表:
1.3 数据如何存储
Andorid给开发者提供了5种在终端设备上存储数据的方式。取证师至少从4中数据格式的文件中获得数据。因此,理解这4种数据格式非常重要。
持久的数据存储在NAND闪存、SD卡或者网络上。具体来说,这5种方式如下。
共享优先
内部存储
外部存储
SQLite
网络
除了应用程序开发者存储的数据之外,Linux内核和Andorid栈也通过日志、程序调试以及其他的标准信息服务提供信息。
1.3.1 共享优先
共享优先使开发者能够将基础数据类型的变量定义-数值二元组及轻量级的XML格式进行存储。可以存储在优先文件中的基础数据类型如下:
boolean:正确或错误
float:单精度32位IEEE 754浮点数
int:32位正负互补整数
long:64位正负互补整数
strings:字符串,通常采用UTF-8编码
共享优先文件通常存储在应用程序的数据目录中的shared_pref(/data/data/com.android.phone/shared_prefs)文件夹中,文件的后缀是.xml。在所参考的MUMU模拟器上,Andorid手机共享优先目录有2个XML文件:
优先文件所包含的优先数据类型有int、bllolen和string:
1.3.2 内部存储器上的文件
内部存储在Andorid-APP 安全(四)之流量分析与内外存储 这篇中提到过,这里只引申一点:
确定应用程序的子目录中的哪些文件属于这种类型的最好方法是使用一个排除过程。原则上,任何在应用程序的/data/data子目录下,不属于shared_prefs、lib、cache及databases子目录中的文件都是由开发者创建和控制的文件。
1.3.3 外部存储器上的文件
外部存储在Andorid-APP 安全(四)之流量分析与内外存储 这篇中提到过,这里不在详细论述。
1.3.4 SQLite
另一个基于NAND/SD卡的、为开发者使用的存储系统是一种具体类型的文件:SQLite数据库。数据库用于存储结构化的数据,SQLite是一个非常流行的数据库格式,应用于很多移动系统以及传统的操作系统中。
SQLite数据库的存储路径以及查看方式我在Andorid-APP 安全测试(二)中提到过,这里不做详细论述。连接:https://www.secpulse.com/archives/76102.html
1.3.5 网络
最后一个开发者可以使用的数据存储机制就是网络,关于网络存储方式我在Andorid-APP 安全测试(二)中有过提到:
你可以在网络上存储和读取基于web服务的数据。如果要进行网络操作,使用以下软件包中的类:
java.net.*
android.net.*
这些软件包主要在底层为开发者提供与网络和web服务器等进行交互的应用编程接口。使用网络的应用程序需要更多的专用代码,虽然并不是所有的取证相关数据都存储在终端设备上,而常见的是,重要的配置和数据库数据都可以得到恢复。
举例来说,Dropbox是一个非常流行的文件共享网站,与其他网络存储空间不同的是,DropBox具有本地虚拟硬盘式的操作体验。DropBox提供Windows、Linux和Mac OS X客户端,目前有增加了手机客户端,安装后可选择将本地备份、存储、共享的文件上传到DropBox的网络存储空间进行保存。在安装了此应用程序后,你可以看到在一个应用程序文件夹/data/data/com.dropbox.android下有4个标准的目录:
Log.txt是一个关于所有活动的详细日志。某些内容具有潜在价值,具体来说:
所有的操作都有时间戳
提供成功的用户认证以及用户名
从Gallery引入的图像
SD卡上的特定文件被上传
Dropbox服务被电话服务给终端
数据库为有关Dropbox应用、终端设备以及用户和与其交互的其他人提供了取证分析和安全相关的重要数据。当Andorid应用程序完成安装并登陆时,Dropbox自动地将Andorid intro.pdf文件与Dropbox账号进行同步。当一个共享的PDF文件被打开时,它会被缓存在SD卡上。更多的关于此文件的元数据以及对其的使用都包含在数据库中。尽管Dropbox在应用程序中广泛地使用网络存储,我们仍然可以恢复有用的信息。
1.3.4 内核、系统及应用日志
另外一个取证分析师能够找到与调查或审计相关联的文件和信息的区域,就是标准的Linux文件系统。很不幸,这是一件非常宽泛和不可控制的时间,但是却至少为我们提供了一个获取相关信息的起点。
(1) linux内核日志
linux内核是linux操作系统底层和抽象的界面,为终端设备中的硬件提供访问。由于内核扮演着终端设备所有功能的中心的角色,其对关键事件和活动进行日志记录的能力得到充分的利用。Linux终端设备中的内核日志通过使用命令dmesg进行访问。此命令会将已有内核信息发往控制台,部分截图如下:
正如你注意到的,这些数据非常细并且很底层。然而,这些数据可以提供重要的有关时间戳、活动以及终端设备开启时的丰富信息。但是,如果终端设备近期没有被重新开启,最初的日志将不会继续存在。
执行这个命令不要求在终端设备上具有任何特别的访问权限,只要USB调试打开即可。如果在一个终端设备或者仿真器运行此命令。会注意到有太多的信息显示在显示屏上,那么就可以将dmesg的结果输送(发送)到一个叫做wc程序来确定日志的总行数,即使用wc来计算行数:
因而,内核日志有685行,如果需要更深入地查看信息,或者是将这些信息加入到一个报告中,则可以将dmesg的输出导向一个文件。
demsg > demsg.log
之后就可以使用一个文本编辑器或者一个显示程序打开文件demsg.log来查看内核日志包含的内容。
(2)logcat
Andorid还有另外几个可用的程序调试技术。其中一个叫做logcat的程序可以用于显示某个时刻被更新的系统和应用程序的调试信息列表。
通过浏览logcat以上的简短日志,可以看到:
经度和维度数据
日期/时间信息
应用程序细节
日志非常详细,每一个日志信息都以一个信息类型指示符开头。如表:
Logcat程序也可以提供来自于完整的蜂窝无线电的调试日志,可以使用以下命令来查看:logcat -b radio
虽然日志是详细的,然而通常也是神秘的,对日志进行扫描搜索可以获得如下信息:
事件的时间(使用unix的时间方式表达,如t=1296218163)
蜂窝调制解调器进行通信所使用的AT命令
接收者、时间以及编码的短信消息
终端设备的蜂窝IP地址、网络及地点信息
无线通信服务提供商信息
这些都是非常底层的信息,但是,如果这些日志得到恢复,则可以提供关于终端设备的重要信息。
Logcat的最后一个功能就是显示事件日志:
logcat -b events
上面的日志很详细,但是,系统中发生的不同时间将会产生大量的日志信息。
(3)dumpsys
dumpsys提供关于服务、存储及系统其他方面很细节、很有用的信息。所提供的信息类型包括以下:
目前正在运行的服务
针对每一项服务所转储出的信息
在当前活动管理状态下的服务、播报、等待的企图、活动以及进程
进程信息,包括内存、进程ID号(PID)、数据库等
按照以下方式运行dumpsys命令:
dumpsys
内容过多,这样不但可以看到使用的程序,而且可以看到用户所使用的账号名。再进一步查看日志,可以同样获得最后10个同步的实际时间戳。另外还有一个iphonesubinfo的服务,但是此服务与苹果的iphone没有任何关系,尽管它们有很相似的名称。手机类型和终端设备ID(被改变过)能够从此分段中获得。终端设备ID不是此终端设备的序号,而是它的移动设备识别号,用于在CDMA网络中能够唯一地识别此终端服务。
另外一个很好的信息来源是位置服务,可以从中得知最后一次采集到的位置信息及时间。位置信息在所记录的时间时是准确的,因此可以用来提供终端设备位置的历史信息。网络状态部分提供其他更多信息,包括更多关于手机基站的信息。
需要指出的是,尽管涉及众多的技术细节,但要注意最后一个片断是关于内存的信息,该片断是每个进程号(PID)的输出。这不但利于确定哪些进程正在运行,而且对于确定他们访问了哪些数据库很有用处。例如,在对一个案件的调查中,调查者需要了解当收到一封邮件时,哪些信息会被更新。从dumpsys命令运行结果的列表中可以看到。此信息对于解释android设备上的数据如何相互关联非常有用。
(4)dumpstate
另外一个程序调试命令是dumpstate,用于将前述的部分调试与系统信息进行结合。与其他的命令相似,此命令的运行方式如下:
dumpstate
adbd作为root运行,显示在仿真器或终端设备上的第一部分是对应用的跟踪。之后列出的是关于终端设备、制造、无线电、网络和具体的内核方面的基本信息。
(5)bugreport
最后一个程序调试命令进一步建立在以上讨论过的命令上,它将logcat、dumpsys和dumpstate输出通过一个命令结合在一起,显示在显示屏上的内容是为了提交一个程序调试报告。此命令的运行方式如下:
以上命令将执行dumpstate,在运行此命令时,输出被保存在一个文件,然后对此文件内容进行统计:
可以看到超过42000行含有时间戳、应用数据和系统信息的调试数据。对此数据进行解析将会得出非常有用的信息。
Android终端设备主要具有两种类型的内存:易失性内存(随机访问内存,RAM)和非易失性内存(NAND闪存)。每一类型的内存为终端设备上所存储的数据提供了不同程度的细节。
2.1 随机访问内存
系统使用随机访问内存(RAM)装载、执行及处理操作系统、应用程序和数据的关键部分,存储的内容在重新开机时不会被保存。像传统的计算机那样,RAM可能包含应用程序用户处理数据的非常重要的信息。以下是该类信息的一些实例:
密码
加密密钥
用户名
应用数据
源于系统进程和服务的数据
随机访问内存(RAM)相当于PC机上的移动存储,用来存储和保存数据的。在任何时候都可以读写,RAM通常用作操作系统或其他正在运行的程序的临时存储介质(可称作系统内存)。不过,当电源关闭时时RAM不能保留数据,如果需要保存数据,就必须把它们写入到一个长期的存储器中(例如硬盘)。正因为如此,有时也将RAM称作"可变存储器"。RAM内存可以进一步分为静态RAM(SRAM)和动态内存(DRAM)两大类。
对android内存进行检查的解决方案。Android提供了一个将应用程序所使用的内存转储进一个文件的机制,该机制的实现是通过向应用程序发送一个特别信号。为了发送此信号,需要获得应用程序的进程识别号(PID),可以通过执行ps命令获得:
下一步,需要在终端设备上运行一个拥有root权限的交互用shell,并设置/data/misc拥有足以让它对内存的转储内容进行读取和写入的访问权限。
adb shell su chmod 777 /data/misc
然后,就可以发送对内存进行转储并显示目录内容,然后我们就可以结束交互的adb shell,使用pull命令在本地工作站对此文件进行分析。例如对Gmail的内存快速扫描可发现应用程序调用的各种加密共享程序库以及基于HTTP的交互情况。甚至可以看到时间戳、个人信息等。
2.2 NAND闪存
与随机访问内存(RAM)有所不同,NAND闪存属于不易失性存储,因此,存储的数据即使在系统断电或重启时都能完好保留。NAND闪存不但用于存储系统文件,而且用于存储大部分的用户数据。NAND闪存的特性与现代硬盘磁性介质的特性有很大不同。这些特性使NAND闪存成为在移动终端设备中的使用的理想存储,同时,也给程序员带来了很多挑战,给取证分析师带来了很多机遇。
首先,NAND闪存没有传统的磁性硬盘系统所使用的运动机械旋转部分。这样就改进了持久性,并且在体积上变得更小,也降低了终端设备的电能损耗。存储器由一个或多个芯片组成,在芯片上又经常将NAND闪存和随机访问内存(RAM)集成在一起,最后再与终端设备的电路板直接进行集成。
NAND闪存卡的读取速度远大于写入速度。
当芯片磨损,抹除与程序的操作速度会降到相当慢。传递多个小型文件时,若是每个文件长度均小于闪存芯片所定义的区块大小时,就可能导致很低的传输速率。访问的迟滞也会影响性能,但还是比硬盘的迟滞影响小。
闪存控制器的质量也是影响性能的因素之一。即使闪存只有在制造时做缩小晶粒(die-shrink)的改变,但如果欠缺合适的控制器,就可能引起速度的降级。
NAND闪存的不足时它能够被写/擦除的次数(生命周期)非常有限,存储块很快就无法再用于存储数据。生命周期随终端设备的不同而不同,主要决定因素是作为存储比特位构成单位的每个NAND闪存核中存储的数据量。
可以看出,NAND闪存有很多限制和制约,因此,开发者对文件系统必须有充分了解,以有效地在制约范围内进行使用。不像传统的硬盘那样在出场时就配有相应的固件用于对其进行管理,android终端设备中使用的NAND闪存在出厂时连控制器都没有。所以对存储的管理都依赖于NAND闪存进行接口的软件。纠错码(ECC)和损耗程度度量是两项重要的应用技术,都对取证和数据恢复具有重大影响。
纠错码(ECC)技术使用一个算法检测读写操作中的错误,并立刻对某些错误进行纠正。由于NAND闪存随着时间增加而逐渐退化,系统必须有能力在页和块变为不可使用时将其检测出,并将存储的数据进行恢复。
第二个对NAND闪存进行有效管理的重要算法是损耗程度度量代码,它将写入的数据分散在NAND闪存的整个空间上,以避免由于过度使用某些区域以造成这些区域中块的快速损耗。
2.3 MTD
在最初没有mmc和emmc时候,android基本使用nand,onenand,nor,ecc nor作为存储设备,MTD(Memory Technology Devices)是可以直接在这些原始设备上操作的。android机器启动后,可以通过命令cat proc/mtd,来查看。
随着,mmc,emmc,CompactFlash等带有FTL(Flash Translate Lay)存储设备的出现,mtd系统已经不能操作。
cat /proc/mtd
但是采用了emmc期间以后这个分区是看不到了(可能也是被内核给隐藏了)
但是问题来了,看不到以前的比较直观的分区名字了,不知道mmcblk0p11对应哪个区域是cache data ?
还好你可以到/dev/block目录下,可以查看文件的别名链接。
可以对照下 df 看看分区大小是不是一样的,同时知道了 blk以后就可以轻松的dd 拷贝出需要的分区文件了。
与很多Linux系统一样,android中使用了数个文件系统,很多用户启动和运行系统。我们重点将放在存储用户数据的分区上,特别是EXT、FAT32和YAFFS2文件系统。
我们通过查看文件/proc/filesystems的内容来确定linux内核(也就是android)所支持的文件系统。如下:
以上操作支持的18个文件系统中,以NAND闪存或SD卡这样的物理终端设备作为支持的只有5个。其他的文件系统具有“nodev”性质,即他们本质上是虚拟文件系统。不被写入到任何的物理终端设备中。只有6个“nodev”文件系统实际应用在终端设备中:
rootfs
tmps
cgroup
proc
sysfs
devpts
以下3个终端设备支持的文件系统:
1) ext3
2) yaffs2
3) vfat
下面会对大多数文件系统进行简要介绍,并对用于存储绝大部分用户数据的YAFFS2文件系统进行深入分析。
3.1 rootfs、devpts 、sysfs和cgroup文件系统
很多linux中文件系统用于对系统进行启动、操作和管理,通常也就不包含对取证调查来说有用的信息。但是还需对这些文件系统进行认真检查,包括内核内部运行状况,为的是努力识别系统中存在的安全漏洞以及其他弱点。Android中4个与基础架构相关的文件系统:
首先,rootfs是内核在系统开启时挂载根(root)文件系统之处。为了能够完成启动过程,内核需要访问核心的文件和共享程序库,因此需要挂在根文件系统。随着内核逐步完成启动过程,其他的文件系统作为根文件系统的子目录被挂载。
devpts文件系统用于为android终端设备提供模拟终端会话界面,类似于使用telnet或ssh与一个传统的UNIX服务器进行连接,每当连接到一个虚拟终端,在/dev/pts下就会生成一个新的节点。例如,如果在android终端设备有一个adb shell连接,则/dev.pts会显示以下信息:
可以看到存在两个adb shell连接以及一个由安装在终端设备上的应用程序产生的终端应用连接。可以看到最初的/dev/pts/0连接存在。同时,出现了另外两个连接,其中一个源于一个正在运行的具有唯一用户名的终端应用
sysfs是另外一个虚拟文件系统,它包含了终端设备上的系统配置和控制文件。存在以下顶层目录:
如果好奇的话,可以通过对/sys运行adb pull而将文件获取到取证服务器上,然后就可以被任何用户读取。执行以下命令:
adb pull /sys sys
可以看到,大量的文件被获取,然后就可以使用所有的linux工具对数据进行检验。它可以提供终端设备上的底层信息,为安全研究提供帮助。
3.2 proc
proc文件系统在/proc目录下以结构化的方式提供关于内核、进程和配置参数方面的详细信息。Shell用户可以查看其中的某些文件。但是,除非拥有root访问权限,否则很多文件是无法被访问的。正如从前,查看proc文件系统的一个方法就是使用pull将文件从android终端设备上获取到本地PC上。此操作会耗费一些时间,并有可能造成某些文件被挂起而导致不完整的复制。
从proc文件系统中可以获得关于终端设备的有价值的信息。检查者应该对这些文件进行审计,并应该直接从/proc目录下的文件开始,而不是从任何子目录开始。
3.3 tmpfs
tmpfs的优点是通过使用随机访问内存(RAM),存储器的速度非常快,并且是非永久性的,在重启时不会被保存。
对于取证师来说,这变成了一个挑战,如果重要的数据存在于tmpfs挂载点上,对这些数据的收集必须在终端设备重启或关机前完成。它同时也提供了一个独特的机会,因为tmpfs通常可以被shell用户读取,取证程序可以被复制并在tmpfs中运行,也不需要对NAND闪存或SD卡做任何改变。这就使检查者不需要对NAND闪存和SD卡做任何改变的情况下从android终端设备上获得取证数据。
标准的安装具有以下4个tmpfs挂载点:
·/dev ·/mnt/asec ·/app-cache ·/mnt/sdcard/.android secure
/dev目录下所包含的终端设备文件允许内核对连接的诸如NAND闪存、SD卡、字符设备等终端设备进行读和写。/mnt/asec和/mnt/sdcard/.android secure目录是后增加到android系统中的,允许将应用程序存储在SD上,而不是/data/data中,因为SD卡能够提供更大的存储空间。
/app-cache也是新增加到android中的,看起来是为了提供更多的tmpfs空间供应用程序使用。
3.4 扩展文件系统-EXT
扩展文件系统是Linux作为操作系统开发时的标准文件系统。众所周知,linux支持很多不同的文件系统。但是,默认的文件系统是EXT。虽然EXT是大多数笔记本电脑、台式机和LINUX服务器的组成部分,它并没有出现在早期的android终端设备中。然而,EXT从2010年出现在终端设备中,在2010年12月9日,谷歌在其android开发者博客中宣布将会有更多的android终端设备从YAFFS文件系统过度到EXT文件系统。从从YAFFS文件系统过度到EXT文件系统在网上热烈讨论的以下几个因素决定:
越来越多的android终端设备从不成熟的NAND闪存过渡到更规律的模块终端设备(eMMC)
EXT4是linux中的标准文件系统,完全支持unix系统的访问权限以及语意,
EXT4非常稳定,并且性能很高
YAFFS只有单线程,因此会在即将面市的双核系统中变成瓶颈
从取证分析的角度来看,EXT4只不过是另外一个检查师需要了解以及取证工具需要支持的文件系统。
3.5 FAT32/VFAT
Android终端设备通常具有一个或者多个微软的FAT32分区,一般在SD卡上和eMMC。使用这个脆弱的文件系统的理由是因为与其他操作系统的兼容性。微软的FAT32文件系统在包括Mac OS X、所有的Windows版本、linux等大多数的操作系统中得到广泛支持。这就意味着存储在FAT32分区上的android数据可以很容易在其他文件系统中被读取和修改,甚至被删除。
在linux中,FAT32分区的文件系统驱动程序的名称叫做VFAT但是千万不要与微软早期的虚拟FAT文件混为一谈,此系统通过增加支持长文件名等一系列功能给FAT16和FAT32文件系统之间建立一座桥梁。
4.6 YAFFS2
YAFFS2是一个开放源码的文件系统,专门面向NAND闪存而开发。Android终端设备使用的最新版的YAFFS(YAFFS2)更加严格地遵守NAND闪存指南,目的是改进NAND闪存的持久性,同时进行了优化,使其能够进行在内存缺乏的移动或嵌入式终端设备上。
YAFFS2特别为日渐增加的NAND闪存终端设备而设计,具有一系列重要的解决此存储介质中严格要求的功能。YAFFS具有 以下特点:
是一个具有日志结构的文件系统(在意外失去供电时也能够保护数据)
提供内置的损耗程度变量和纠错功能
能够处理废块
速度快,并在随机访问内存(RAM)中占用很小的空间
在android终端设备中,查看/proc/yaffs文件可以获得YAFFS2文件系统的详细信息:
注:Linux 支持几种不同的文件系统。每个文件系统都有自己的优缺点和性能特征。文件系统的一个重要属性是日志,它允许系统在崩溃后更快地恢复。通常,日志文件系统比非日志文件系统更好。ext4和yaffs2是日志类型的文件系统。
vfat 文件系统(也称为 FAT32)没有日志功能,且缺乏完整的 Linux 文件系统实现所需的许多特性。它可用于在 Windows 和 Linux 系统之间交换数据,因为 Windows 和 Linux 都能读取它。不要将这个文件系统用于 Linux,除非要在 Windows 和 Linux 之间共享数据。如果您在一个 vfat 磁盘上解压缩一个 Linux 归档文件,那么您将丢失权限(比如执行权限),还会丢失该归档文件中可能存储的符号链接。
我们已经详细讨论了android系统中关于内存的很多部分。我们不但讨论了随机访问内存(RAM)和NAND闪存,而且详细讨论了很多文件系统。这些背景信息会极大的帮助对android终端设备进行取证和安全分析。下面介绍android终端设备上挂在的文件系统。
挂载的文件系统
当不使用任何参数运行mount命令(挂载命令)时,结果将显示已经挂载的文件系统列表以及他们所具有的选项。
所有mount命令的选项都在手册中加以解释。然而,在大多数情况下,快速浏览一下就可以让检查者获得需要的信息,如挂载点、类型以及文件系统的访问权限。
使用df命令可以获得已经挂载的文件系统中的可用空间信息:
Android终端设备中的物理内存、文件系统以及相应的数据结构是数据存储的基本构成要素。对于这些结构的深入理解有助于对将来出现的新的文件系统和数据结构进行研究和开发。
本文作者:Lemon
本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/100184.html
(2)logcat 中第一张图片,怎么看出来经纬度的?