Android-APP安全测试(一)

Android系统由于其开源的属性,市场上针对开源代码定制的ROM参差不齐,在系统层面的安全防范和易损性都不一样,Android应用市场对app的审核相对iOS来说也比较宽泛,为很多漏洞提供了可乘之机。市场上一些主流的app虽然多少都做了一些安全防范,但由于大部分app不涉及资金安全,所以对安全的重视程度不够;而且由于安全是门系统学科,大部分app层的开发人员缺乏安全技术的积累,措施相对有限。

据了解:反编译 Android apk 现象的发生主要原因,在于开发商投入市场的Android apk包未经任何加固保护。
总之就是现在的移动APP安全测试的需求迅速扩大,相关测试技能对于大家的日常工作来说是必不可少的。本人就最近研究APP,整理了APP安全测试做了部分总结。在针对APP进行渗透测试时,业务逻辑层和web端测试大同小异,所以着重介绍APP自身所特有的漏洞:反编译、二次打包、签名校验等;

 APP面临的主要风险

客户端:传统逆向分析类(反编译、调试、加密/签名破解…)

用户已经中招类(输入记录、导出组件、进程注入…)

服务端:

系统组件类(MS12-020、ShellShock、心血、ST2…)

业务应用类(注入跨站越权执行上传下载弱口令…)

 本地客户端测试

本章我主要介绍的本地客户端的测试,所需要的环境、工具、APK文件结构、架构、测试点等。以下目录结构如下,本篇所涉及到的在红框范围。

客户端测试工具-工具推荐(环境准备):

JDK:因为Android应用都包含JAVA外壳,所以JAVA环境是必要的。没有JAVA,就没有apktool、Eclipse、jarsigner。 

ADT:ADT中除了神器adb(Android Debug Bridge)和Monitor,还包含了Emulator虚拟机和Eclipse开发环境;另有较为新锐的替代品Android Studio。

 

GDB:作为大名鼎鼎的跨平台调试工具,GDB在实际测试中主要用于DUMP内存,从而发现敏感信息、解密数据、脱壳等等;

 

NDK:NDK可以在Windows上编译Android(arm)使用的Native层可执行文件(C/C++),各项Native层测试工具都可用NDK制作;

 

安卓设备:已root的真实手机/Emulator,不推荐x86虚拟机(VirtualBox/Genymotion)。x86虽然运行快,但是兼容性不佳,尤其客户APP涉及Native层时有时会出现莫名其妙的异常

 

***这里要特备注明的是对模拟器的选择***
创建模拟器的时候在选择android系统版本的时候会遇到的选项,选择x86的还是基于ARM架构的:

 

区别:

arm架构注重的是续航能力

x86架构注重的是性能

在目前大部分的移动设备(只能手机,平板等)和大部分的移动终端(超市消费时候刷卡的Pos机,ATM等)都是ARM的CPU。最主要原因因为续航能力。

而大部分的台式机和笔记本电脑,则是使用x86架构的CPU,因为这些设备更需要高性能的运转和高效的运算。

从目前来看,android手机目前还是arm架构占绝对主流,市场调研,目前90%的android手机都是arm架构的。

客户端测试工具-工具推荐(实用功能):

网络流量处理工具:BurpSuite/Fiddler:针对HTTP进行各种操作的利器

Wireshark:偶尔遇到不走HTTP的APP时,定位代码用

APK文件处理工具:

ApkTool:功能众多,主要用来解包和打包Apk文件

SignApk:对Apk文件进行签名,否则无法安装运行

Dalvik反编译工具:

Dex2Jar:将Dex文件转换为Jar文件,便于反编译JAVA

Smali2Java:直接从APK中反编译JAVA

通用逆向分析工具:

JD-GUI/Luyten:可以反编译Class/Jar文件,在Dex2Jar之后使用

IDA:当APP存在Native层代码时,用于进行逆向分析

 

ApkTool:功能众多,主要用来解包和打包Apk文件,推荐一个图形化懒人工具:ApkIDE。查壳工具

客户端测试 – 工具推荐(Xposed)

Xposed框架:XposedBridge:JAR文件,Xposed开发所必需的接口库

XposedInstaller:APK文件,Xposed运行环境,注意5.0前后版本不同

JustTrustMe

Xposed模块,能够解除绝大多数常见SSL函数库的证书校验

注:通过修改本地客户端的方法实现的通信加密攻击不能记为风险

BlockSecureFlag:

Xposed模块,能够解除所有APP的FLAG_SECURE设置

注:适用于截屏时提示“内存不足XXXX”的场景

Surrogate:

Xposed模块,能够手动配置修改任意函数的返回值,多用于固定化随机密钥

注:灵活性不如XPOSED开发,但使用方便,适合开发基础不深的同学

 客户端测试 – APK文件结构

Android应用(APK文件)通常是由以下四部分组成的:1.清单文件(AndroidManifest.xml、/META-INF)

内含APK的包名、组件列表、启动组件、公共权限声明、各个组件的权限声明等一系列声明信息

2.Dalvik可执行文件(classes.dex、classes2.dex、…)

Java源代码->Smali中间代码->Dalvik机器码->Dalvik虚拟机->ARM/x86机器码

classes.dex中的便是Dalvik机器码

3.Native可执行文件(/lib)

其中包含很多.so链接库,多为C/C++编写而成的ARM/x86代码

可以通过JNI(Java-Native Interface)与JAVA层相互调用

4.资源文件(/assets、/res、零散放置的其它种种)

除了图片等数据性质的文件之外,还有可能会有其它三种文件

 客户端测试 – 反编译保护

把apk当成zip并解压,得classes.dex执行:dex2jar.bat classes.dex文件路径

得classes.dex.jar

使用jd-gui或luyten打开jar文件,即可得JAVA代码

jd-gui虽然搜索功能较好,但解析代码(尤其是混淆过的代码)时经常出BUG。luyten在这方面更加稳定,可以将两者结合使用。
有些APK会包含多个dex,全部转换成jar后合并压缩包即可
***这里特别说下代码混淆器:开源版还有商业版***
混淆器可以通过一些方法来保护你的代码不被反编译,他们不会阻止反编译器或者dex2jar对你的代码进行逆向过程,但是他们会使反编译出来的代码变得更难理解,最简单的方式,他们将APK中所有的变量和方法的名字和字符串转换成一到两个字符的字符串,这就从JAVA源码中去掉了很多代码的含义,使其更难找到一些特定的信息,比如说找到一个API key 或者你存储用户登录信息的位置,好的混淆器会改变代码的流程,大多数情况下可以把业务逻辑隐藏起来,混淆器不会阻止一个一心想要破解你这个应用的黑客去理解你代码所做的事情,但他会让这个过程显得更难了。跟很多java反编译器一样,也有很多的java混淆器,比如ProGuard,yGuard,RetroGuard,DashO,Allatori,Jshrink,Smokescreen,JODE,JaveGuard,Zelix Klassmaster,以及jCloak,这些还只是其中一小部分,甚至还有一款Android 的classes,dex混淆器,叫作Apkfuscator,你可以从http://github.com/strazzere/APKfusctor上 获取,或者你也可以试下http://shield4j.com上的Shield4j。

ProGuard是一个混淆代码的开源项目,它的主要作用是混淆代码,殊不知ProGuard还包括以下4个功能。

压缩(Shrink):检测并移除代码中无用的类、字段、方法和特性(Attribute)。

优化(Optimize):对字节码进行优化,移除无用的指令。

混淆(Obfuscate):使用a,b,c,d这样简短而无意义的名称,对类、字段和方法进行重命名。

预检(Preveirfy):在Java平台上对处理后的代码进行预检,确保加载的class文件是可执行的。

Progurad是免费的,而且已经集成到Android ADT中了,使用起来很方便。Proguard只能保护代码,却不能保护我们的apk文件。任何人都可以使用apktool工具,反编译我们开发的apk文件,进而更改其中各种资源,或者更改部分代码,甚至是注入代码,然后再打包回apk,二次发布后,达到自己的目的。或者是加入了广告,或者是增加了恶意木马病毒等。不需要multi-dex。Proguard会对输入的jar文件按照shrink – optimize – obfuscate – perverify的顺序依次进行处理,最后得到输出jar文件。Proguard使用library jars来辅助对input jars类之间的依赖关系进行解析, library jars自身不会被处理,也不会被包含到output jars中。

它能发现并删除无用类、字段(field)、方法和属性值(attribute)。它也能优化字节码 并删除无用的指令。最后,它使用简单无意义的名字来重命名你的类名、字段名和方法名。经过以上操作的jar文件会变得更小,并很难进行逆向工程。但是有耐心的攻击者仍能分析出代码结构

 

DexGuard 是GuardSquare公司推出的移动应用App安全软件,经过特别设计用于防止安卓系统上的应用APP与SDK遭受逆向工程与各类安全入侵的威胁DexGuard是收费的,DexGuard是在Proguard基础上,加入了更多的保护措施。使用DexGuard混淆后,生成的apk文件,就无法正常使用apktool反编译了。尽管还是能够反编译出部分资源文件,但是由于反编译过程不完全,就无法再打包成apk了。这样就保护了我们的apk文件,不会被二次打包发布了。代码混淆力度更大 + 资源混淆 + so加壳等。自带multi-dex扫描

客户端测试 – 安装包签名

使用JDK中的jarsigner.exe检查安装包的签名:jarsigner.exe -verify APK文件路径  -verbose -certs

文 / Aex
LEAVE A REPLY
loading