Android-APP安全(四)之流量分析与内外存储

2019-02-14 18,300

继上一篇Android-APP 安全测试(三)的内容

安全测试(四)主要针对三个方面来写:Andorid逆向与审计的补充、对 Android 设备进行流量分析、Android内外存储基础知识、Android 取证。因Android 取证涉及内容有点多,大部分内容会在安全测试(五)中写到。


Andorid逆向与审计的补充

Android 逆向与审计中对于源码混淆的审计我在第一篇APP文章中有写到,https://www.secpulse.com/archives/74861.html。前不久在一论坛看到一个大佬在2012的一篇文章,对于判断APK文件是否混淆 思路简单新颖(2012年的时候就有大佬提出了,然而我却在2019年才偶遇这篇文章~我和大佬的距离差了七年。)在这里分享给小伙伴,参考链接:https://bbs.pediy.com/thread-159959.htm

一个简单的方法判断APK文件是否混淆。

目前越来越多的恶意apk文件为了对抗杀毒软件以及分析人员的分析,由于商业软件自身的保密需要,很大程度上都会进行一定的混淆,更有甚者采用全反射调用的来掩藏自己的真实意图。虽然一定程度上经过混淆的文件的其文件大小都会变小。以著名的proguard为例,经过处理的apk文件大小往往不到其未经过处理的apk文件的1/3。

由于apk文件的混淆往往是伴随着文件的压缩和代码的优化问题,混淆的apk文件解压转换为jar文件,使用ju-gui打开以后有一个不太引人注意的细节问题---其中找不到资源文件类。

利用这一特性,我们可以直接利用apktool解压apk文件,对其smali文件的文件名进行分析,如果存在一个或以上的资源的smali文件,就可以证明该apk文件没有混淆,反之,则说明已经是混淆过了的文件。如下图所示

图片1.png

而全反射调用的判断就比较简单了,直接判断是否存在forname函数。

对于全反射调用请自行百度了解下吧~。

** 调用系统隐藏的API: 使用Class.forName("全类名")调用

哪些情况会使用反射

1. 指定类名/全类名字符串

2. 使用反射相关API : Class Method Field

 

对 Android 设备进行流量分析

网络流量是指,能够连接网络的设备在网络上所产生的数据流量。

性能数据给出的网络流量性能数据可以区分接收流量和发送流量:

接收流量:应用运行期间,网卡的下行流量,单位是字节

发送流量:应用运行期间,网卡的上行流量,单位是字节

 

通常应用程序会在网络数据中泄漏敏感信息。此外,你经常会遇到通过不安全的网络协议执行身份验证和会话管理的应用程序。网络流量分析我们主要分两种:被动分析和主动分析。


被动分析:

应用程序发送的网络数据不会被拦截。相反,我们将尝试捕获所有网络数据包,然后在网络分析器(如Wireshark)中打开它,然后尝试找出应用程序中的漏洞或安全问题。

被动分析:可以使用 tcpdump  来将所有的信息保存到设备中一个位置。此后,我们将该文件拉取到我们的系统,然后使用 Wireshark或其他包分析器查看它。

下面是我对被动分析做的详细实验步骤,仅供参考~

图片2.png

准备工具:wireshark,netcat,tcpdump

tcpdump链接:http://www.strazzere.com/android/tcpdump

tcpdump(需Root用户运行)拦截和显示发送或收到过网络连接到该机器的TCP/IP和其他数据包。简单说就监控手机进出网络数据。

Tcpdump抓取手机数据包特点:

1).基本只能针对Android手机

2).不能实时抓包

3).电脑需要安装Android SDK

4).电脑需要安装Wireshark

5).测试手机需要获取root权限

6).测试手机需要安装tcpdump软件


假如你的Android设备已经root了,你可以用如下方式创建一个目录,存放TCPdump的二进制可执行文件。

通过ADB命令,在Android设备上依次执行下面的命令。

adb shell
su
mkdir /data/tcpdump/
chmod 777 /data/tcpdump/

图片3.png

图片4.png

然后跳转到你本地tcpdump 的保存目录下,把下载后的tcpdump 上传到你的Android的tcpdump 的目录下。

执行下面命令:

adb push tcpdump /data/tcpdump /
adb shell
su
chmod 777 /data/tcpdump /tcpdump

图片5.png

当你把for android 版的tcpdump上传到设备上后,并把他的权限设为可执行之后,你应该执行下面这条命令,确认Android设备上的NETCAT是可用的。

如图:

图片6.png

上面运行nc不过是个确认检查而已,在大多数版本的Android系统上默认都自带了NETCAT 。如果没有,可以去下载一个。

确认了tcpdump和NETCAT都已经安装到你的Android设备上后,你可以执行下面命令,抓取网络流量,如果一切正常,你应该在屏幕上看见输出下面的这些信息。

./data/tcpdump/tcpdump  -w - | nc -l -p 31337

图片7.png


你应该把tcpdump的输出传给装在你本地计算机的Wireshark上,要完成这个任务,首先要执行下面命令,通过ADB设置一下端口转发

adb forward tcp:12345 tcp:31337

在端口转发之后,运行你本地计算机的NETCAT

ne .exe 127.0.0.1 12345

这样做了之后,所有的流量都会被正确的转发,你可以通过管道把输出转接到Wireshark。

adb forward tcp:12345 tcp:31337 && nc.exe 127.0.0.1 12345 | Wireshark -k -S -i -

运行此命令前我将netcat还有wireshark放在了同一目录下,之后就可以看到wireshark运转起来。

图片8.png

还可以将数据包导出到电脑,用wireshark打开

如下命令:

/tcpdump -p -vv -s 0 -w /sdcard/11.pcap #执行抓包命令,结果保存到SD卡22.pcap文件中
adb pull /sdcard/22.pcap E:/  #前为手机中文件及存放路径,后为电脑E盘根目录

使用Wireshark等工具分析抓包文件22.pcap

图片9.png

主动分析:

在主动分析中,渗透测试者将主动拦截所有正在进行的网络通信,并可以即时分析,评估和修改数据。这里需要设置代理,并且由应用/设备生成和接收的所有网络流量会通过该代理。

这里我们最常用的抓包工具就是burpsuite。利用burpsuite拦截数据包流量只需要在设置代理。

图片10.png

为了检查代理是否工作,打开任意APP。 然后我们能够看到它是否在代理中被拦截。

图片11.png

就先不说讲述的专业不专业,说我这个码是不是打的很专业~

正如我们在上面的屏幕截图中看到的,我们成功地拦截了来自设备和应用程序的所有基于 HTTP 的请求。

当通过 HTTP 协议进行通信时,上述方法可以正常用于应用和流量器的流量拦截。 在

HTTPS 中,由于证书不匹配,因此我们无法拦截流量。我们只需要将burpsuite中证书导出,安装到手机证书中即可。网上关于“Burpsuite抓取手机app的数据包-证书的导入”这类文章很多,百度到的一个仅供参考:https://blog.csdn.net/u011975363/article/details/83654074

之后就能看到抓包工具中抓取到了Https流量

图片12.png

以上是对Android被动分析、主动分析工具使用的详细介绍,欢迎小伙伴评论分享新思路哦~

image.png

Android内外存储基础知识

在这里提到Android内外存储的基础知识,也是为了后面在Android取证部分中会涉及到数据的存储位置。

Android手机上的存储空间可做如下划分:

内存:RAM

内部存储:内部ROM

外部存储:外部ROM和SDCard

手机上的存储在概念上分成了”内部internal“和”外部external“两部分,但其实都在手机内部。因此无论Android手机是否有可移动的sdcard,它都有外部存储和内部存储,且通过相同的Api方法来访问可移动的sdcard或者手机自带的存储。

以下是一部手机的存储展示图,用SDK中DDMS自带的Device File Explore打开后展现的文件目录。

图片13.png

图片14.png

(1)内部存储:

Android可以说是一个Linux操作系统,它的内部存储空间对于应用程序和用户来讲就是“/data/data“目录。内部存储与外部存储相比有着比较稳定,存储方便,操作简单,更加安全(可以控制访问权限)等优点,而它唯一的缺点就是空间有限。

内部存储空间的有限意味着应物尽其用,用来保存比较重要的数据,例如用户信息资料,口令秘码等不需要与其他应用程序共享的数据。注意应用程序被卸载时,应用程序在内部存储空间的文件数据将全部被删除,避免占用宝贵的空间。

内部存储即data文件夹,其中里面有两个文件夹值得关注:

·app文件夹(未root无法打开):存放着所有app的apk文件夹,当开发者调试某个app时,AS控制台输出的内容中有一项是uploading…,代表正在上传apk到这个文件夹。

·data文件夹:内部都是app的包名,存储着应用程序相关的数据,例如 data/data/包名/(shared_prefs、database、files、cache)

图片15.png

(2)外部存储:

外部存储是指用户在使用时自行在手机上添加的外部存储介质,例如TS卡,SD卡等闪存储介质。其显著的优点就是存储空间大,无需担心数据清除问题,与内部存储不同的是当应用程序卸载时,它在外部存储所创建的文件数据不会被清除,因此清理外部存储空间的责任丢给了用户自己。缺点则是不太稳定,闪存介质对于Android手机而言会出现SD卡不能正常使用的情况。

外部存储即storage文件夹或mnt文件夹。需要注意的是storage中有一个sdcard0文件夹,其中又分为公有目录和私有目录:

  • 公有目录:有9大类,比如DCIM、Download等系统为用户创建的文件夹;

  • 私有目录: 即Android文件夹/storage/sdcard/Android/,其中的data文件夹包含了许多包名组成的文件夹。

图片16.png

若应用程序在运行过程中需要向手机上保存数据,通常是保存在sdcard中/storage/sdcard,即应用直接在sdcard的根目录创建一个文件夹用于数据保存,不过当该app被卸载后,数据还保留在sdcard中,意味着留下了垃圾数据。

在开发中,Google官方建议App数据存储在外部存储的私有目录中对应App的包名下storage/sdcard/Android/data/包名/,这样当用户卸载掉App之后,相关的数据会一并删除!


(3)内外部存储常用目录操作

  • context.getFilesDir() 内部存储data/data/包名/files目录

  • context.getCacheDir() 内部存储data/data/包名/cache目录

  • Environment.getExternalStorageDirectory() 外部存储根目录

  • Environment.getExternalStoragePublicDirectory (Environment.DIRECTORY_DCIM) 外部存储公有目录

  • context.getExternalFilesDir() 外部存储私有目录storage/sdcard/Android/data/包名/files。一般存储长时间保存的数据。

  • context.getExternalCacheDir() 外部存储私有目录storage/sdcard/Android/data/包名/cache。一般存储临时缓存数据。

注意上述最后两个API:当app被卸载后,sdCard/Android/data/PackageName/下的所有文件都会被删除,不会留下垃圾信息。两个API对应的目录分别对应着 设置->应用->应用详情里面的“清除数据”与“清除缓存”选项。


(4)sd卡路径随着Android版本变化

  • android 4.0

Galaxy Nexus(GN)手机上的userData分区很大,被挂在/data 目录下。用户的数据通常是存储在SD卡上,可是GN无SD卡,即只有intenal内部存储。

Google直接在userData分区下虚拟了一个media目录,它是内置sd卡的数据存储位置,具体使用了fuse技术将/data/media虚拟成为一个叫做/dev/fuse的设备,为了让程序能认出来,被同时挂载在 /mnt/sdcard 目录,又为了兼容以前的程序,做了一个快捷方式(linux系统里叫软连接),因此 /sdcard 指向的就是 /mnt/sdcard。


  • android 4.1

在4.1中同样使用fuse技术,/dev/fuse 会被同时挂载到/storage/sdcard0 目录。“sdcard0”表示第一个sd卡(若有外置sd卡,那会多一个 /storage/sdcard1) /sdcard 软连接会指向 /storage/sdcard0 ,此时/mnt/sdcard 也是个软连接,会指向/storage/sdcard0。

/storage/sdcard0才是最终源头,/sdcard、/mnt/sdcard是指向它的一个软连接而已。


  • android 4.2及之后

在4.2之后,Android出现了一个“多用户”的功能特征,意味着一台设备可能被多个人同时应用,因此需要将每个人的数据、应用、个性配置分开。

4.2版本中同样使用fuse技术,而/dev/fuse 会被挂载到/storage/emulated/0 目录。(若有多个用户,0文件夹名称依次增加,例如/storage/emulated/1)

不仅如此,为了兼容Android版本升级,还同时挂载到/storage/emulated/legacy,建立了三个软连接指向自己:

  •     ·/storage/sdcard0

  •     ·/sdcard

  •     ·/mnt/sdcard

也许在手机设备开发中似乎没太注意到“多用户”新特性的作用,无需太过在意,它主要在平板上使用,手机端是禁用的,但底层实现原理相同。

/mnt/shell/emulated 目录和 /storage/emulated 下的文件夹是一样的。

/sdcard/:只是一个符号链接,链接到/storage/sdcard0/

/mnt/sdcard:Android4.0版本之前的显示

/storage/sdcard0 :Android4.0版本之后的显示

/storage/emulated/0/:这是参照“emulated MMC”,通常指其内部,“0”代表第一个用户,即设备拥有者。 如果您创建其他用户,则此数字将为每个用户增加。

/storage/emulated/legacy/:与上同理,但指向当前工作用户的部分。(对于“0”用户而言,这是/storage/emulated/0/的符号链接)

/storage/sdcard0/:注意这里的“0”并非是一个单独文件夹名,而是作为后缀一样,意味着“0”并不代表用户,而是设备(卡)本身,因此它不需要legacy链接。人们可以通过OTG将读卡器与另一个SD卡连接起来,然后路径将成为/storage/sdcard1/。

为了兼容Android版本升级,还同时挂载到/storage/emulated/legacy,建立了三个软连接指向自己:/storage/sdcard0 、/sdcard、/mnt/sdcard。

 

Android 取证

Android 取证这部分内容会涉及比较多,大部分内容我会写在安全测试(五)中。本章安全测试(四)只做一个简单介绍,以下对Android 取证技术的讲解,思路取材大多来源于网络以及《Android 取证实战》一书。

之后所写的关于Android取证的大概思路,都在如下我清晰的草稿纸上。

图片17.png

取证类型:

逻辑采集:取证员与设备交互并从文件系统提取数据。该数据可以是任何内容,诸如应用特定数据,联系人,通话记录,消息,web 浏览器历史,社交网络用户信息和财务信息。逻辑采集的优点是,在大多数情况下比物理采集更容易获取逻辑信息。然而,在一些情况下,该方法的一个限制是,在这种情况下的证据(智能手机及其数据)具有被篡改的高风险。

物理采集:这意味着对整个物理存储介质进行逐位拷贝。我们还可以在执行物理采集时定位不同的单个分区。与逻辑采集相比,这种方法慢得多,但更可靠和可信赖。此外,为了在智能手机上执行物理采集,检查者需要熟悉不同类型的文件系统,例如 Yet Another Flash File System 2(YAFFS2),ext3,ext4,rfs 等。

 

文件系统:

在 Android 中进行物理采集有点棘手,一个主要原因是文件系统不同。

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

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

大多说用户使用的U盘格式都是FAT32格式,因为它的兼容性相对好一些,几乎可以完美应对所有操作系统,并且快速的进行读写工作。但是它的缺点是是不能设置权限,安全等级较低。并且最关键的一点就是它最高只能支持4G以下的单个文件传输。随着文件越来越大,一个高清的电影就已经达到了好几个G的大小,相比之下FAT32已经属于落后“产品”。

制作副本或创建现有数据系统映像的最有名的工具之一是 dd,它从原始来源到系统进行逐块复制。然而,由于该工具的一些缺点,例如缺少内存块以及跳过坏块,会导致数据损坏,因此不推荐在取证调查期间使用。

 

如何查看Android 文件系统分区:

Android 基于 Linux 内核,并从 Linux 本身派生其大部分功能和属性。 在 Android 中,文件系统被划分为不同的分区,每个分区都具有重要意义。在 Android 设备上查看分区,我们可以使用 adb shell  然后查看 proc下的 mtd文件,如下面的命令所示。

图片18.png

在大多数 Android设备上,我们通常会看到一些数据分区,如system,userdata , cache ,recovery ,boot ,pds ,kpanic 和misc ,它们安装在dev 列指定的不同位置。为了看到不同的分区和类型,我们可以在 adb shell中键入mount。

通过执行 mount  命令列表,所有不同的分区及其位置将被挂载:

图片19.png

Android USB大容量存储终端设备映像

目前所有的Android终端设备都配备有外接的安全数字(SDK)卡,或者是内置的多媒体卡(eMMC),给用户提供所需要的大容量存储空间。需要这些存储终端设备的理由是基于安全和隐私保护的需要,通常存储在/data/data中的用户应用数据都是被隔离开的。然而,用户希望在Android终端设备和个人电脑之间来回拷贝音乐、图像、视频或者其他各类文件,这些大容量的FAT文件系统分区可以解决这些问题。用户的敏感数据依然能够得到保护,同时,用户又能够访问大尺寸、便携式的文件。

如何获得SD卡或eMMC的取证映像

在不需要从终端设备中取出任何卡的前提下,目前从SD卡或eMMC中获取取证映像的方式主要有两种。第一种方法将UMS终端设备接口暴露给取证工作站,然后使用任何可选择的取证工具获取映像。第二种方法,不将USB暴露给取证工作站,而是在终端设备上使用dd命令。

 

关于android取证详细的工具介绍以及使用方式将在下一篇写到,欢迎小伙伴一起探讨android安全相关问题,一起学习一起成长~



最后:祝大家新年快乐哦~

本文参考链接:

https://www.jianshu.com/p/23abbd62781e

https://bbs.pediy.com/thread-159959.htm

https://www.jianshu.com/p/70db63beafff

https://blog.csdn.net/itermeng/article/details/79423035

参考资料:

《Android 渗透测试学习手册》

《Android取证实战:调查、分析与移动安全》


本文作者:Lemon

本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/97228.html

Tags:
评论  (0)
快来写下你的想法吧!

Lemon

文章数:68 积分: 647

安全问答社区

安全问答社区

脉搏官方公众号

脉搏公众号