【转】手机安全测试
一、通过在线工具进行测试
1.腾讯金刚审计系统service.security.tencent
优点:包含了修复建议
2.阿里聚安全检测网址: jag.alibaba
阿里聚安全下有自己的安全博客,包含一些:
1.安全漏洞、2.病毒分析、3.技术研究、4.安全报告相关文档。
3.360捉虫猎手检测结果appscan.360.cn/同样有自己的安全博客
4.爱加密网址:safe.ijiami.cn/analyze
优点:在导出的报告中可以看到对当前apk的评分
二、使用Drozer测试
1.Drozer简介drozer是一款针对Android系统的安全测试框架。drozer可以帮助Android app和设备变得更安全,其提供了很多Android平台下的渗透测试exploit供你使用和分享。对于远程的exploit,它可以生成shellcode帮助你进行远程设备管理。
1.更快的Android安全评估drozer可以大大缩减Android安全评估的耗时,通过攻击测试暴露Android APP的漏洞。
2.基于真机的测试drozer运行在Android模拟器和真实设备上,它不需要USB调试或其他开发即可使用。
3.自动化和扩展drozer有很多扩展模块,你可以找到他们进行测试以发现Android安全问题。
2.Drozer的安装和使用
1.安装Drozer下载地址:mwr.to/drozer
1.在客户端安装Drozer2.在手机端或模拟器安装agent.apk
3.在手机端或模拟器运行agent.apk点击开启-->Embedded Server-->Enable
4.建立端口转发,drozer使用31415端口,即执行命令:adb forward tcp:31415 tcp:31415
5.drozer console connect
6.安装包中还包含一个测试应用程序sieve.apk具体可参考www.mwrinfosecurity.com/system/assets/559/original/mwri_drozer-users-guide_2013-09-11.pdf
2.Drozer测试my.akp
1)查看所有的安装的App的包名dz> run app.package.list
2)查找my.apkdz> run app.package.list -f samplecom.xxx.xx (my)
3)获取my.apk的一些基本信息dz>run app.package.info -a com.xx.xxx Package: com.xx.xxx Application Label: my Process Name: my Version: 1.0 Data Directory: /data/data/com.xxxx.xxxx APK Path: /data/app/com.xxx.xx-1.apk UID: 10217 GID:[3003, 1028, 1015] Shared Libraries: null Shared User ID: null Uses Permissions: - android.permission.READ_LOGS - android.permission.INTERNET - android.permission.ACCESS_NETWORK_STATE - android.permission.READ_PHONE_STATE - android.permission.ACCESS_WIFI_STATE - android.permission.WRITE_EXTERNAL_STORAGE - android.permission.WAKE_LOCK - android.permission.VIBRATE - android.permission.WRITE_SETTINGS - org.agoo.android.permission.MESSAGE - android.permission.CHANGE_NETWORK_STATE - android.permission.CHANGE_WIFI_STATE - android.permission.GET_TASKS - android.permission.SEND_SMS - android.permission.READ_EXTERNAL_STORAGE - android.permission.RECEIVE_SMS - android.permission.SYSTEM_ALERT_WINDOW - android.permission.ACCESS_COARSE_LOCATION - android.permission.ACCESS_FINE_LOCATION - android.permission.RESTART_PACKAGES - android.permission.MANAGE_ACCOUNTS - android.permission.GET_ACCOUNTS - android.permission.READ_CONTACTS Defines Permissions: - org.agoo.android.permission.MESSAGE dz>
分析:可以看到myapk的版本信息,数据存储的目录,用户ID,组ID,是否有共享库,还有权限信息等。
4)APP攻击面分析分析Activity/Broadcast Receiver/Content Provider/Service是否能被其他的的应用程序调用dz>run app.package.attacksurface com.xxx.xxxx Attack Surface:
5 activities exported 0 broadcast receivers exported 0 content providers exported 0 services exported is debuggable dz>分析:结果显示了潜在可以利用的组件个数: “exported”表示组件可以被其他App使用。 services is debuggable表示我们可以用adb绑定一个调试器到进程。调试方法见:bobao.360.cn/learning/detail/140.html5)Activity组件暴露dz>run app.activity.info -a com.xxx.xxxx Package: com.xxxx.xxxx com.xxxxx.xxx.xSinaWeiboActivity Permission: null com.tencent.tauth.AuthActivity Permission: null com.xxx.xxxx.xxxx.WXEntryActivity Permission: null com.xxx.xxx.ContainerActivity Permission: null com.xxxxx.xxxx.MainActivity Permission: null dz>分析:其中上图的MainActivity是程序启动时主界面,必须是exported,其他几个activity是理论上说是不能exported的。我们可以通过命令run app.activity.start --component 包名 包名.类名启动Activitydz#> run app.activity.start --component com.xxx.sample 包名.类名dz#> run app.activity.start --component com.xxxx.sample com.xxx.xxxxx.WXEntryActivity解决方案:保护应用程序组件
① 设置android:exported属性为false在AndroidManifest.xml文件中,我们应该设置设置android:exported属性为false来保护应用。
② 通过权限控制限制访问android:exported属性不是唯一的限制措施。我们还可以通过基于权限的方法来定制一个Activity的权限。这个可以限制应用之间的访问权限。无需暴露的组件请设置exported=”false”;若需要外部调用,建议添加自定义signature或signatureOrSystem级别的私有权限保护;需要暴露的组件请严格检查输入参数,避免应用出现拒绝服务。
6)ContentProvider组件暴露dz>run app.provider.info -a com.xxxx.sample Package: com.xxxxx.sample No matching providers. dz>分析:我们可能没有用到Content Provider或者说是安全的。如果包含则会显示exported的content provider的具体信息,包括名字,权限,访问路径等,就可以做一此类如Sql注入的操作。
① 检查是否有sql注入dz>run scanner.provider.injection -a com.xxxxx.sample Scanning com.xxxx.sample... D:\Java\jdk1.8.0_11\bin\javac.exe -cp C:\drozer\lib\drozer\lib\android.jar ZipUtil.java C:\drozer\lib\drozer\lib\dx.bat --dex --output 4a78a7a38b67b985beccf6efac92375b.apk ZipUtil.class trouble processing: bad class file magic(cafebabe)or version(0034.0000)...while parsing ZipUtil.class ...while processing ZipUtil.class 1 warning no classfiles specified drozer could not find or compile a required extension library. dz>
② 检查是否存在遍历文件的漏洞dz>run scanner.provider.traversal -a com.xxxxx.sample Scanning com.xxxx.sample... D:\Java\jdk1.8.0_11\bin\javac.exe -cp C:\drozer\lib\drozer\lib\android.jar ZipUtil.java C:\drozer\lib\drozer\lib\dx.bat --dex --output 4a78a7a38b67b985beccf6efac92375b.apk ZipUtil.class trouble processing: bad class file magic(cafebabe)or version(0034.0000)...while parsing ZipUtil.class ...while processing ZipUtil.class 1 warning no classfiles specified drozer could not find or compile a required extension library. dz>7)Broadcast receivers组件暴露通过反编译可以看到有三个广播接收器被注册,且未设置exported=“false”风险描述导出的组件可以被第三方app任意调用,导致敏感信息泄露或者恶意攻击者精心构造攻击载荷达到攻击的目的。修复建议如果组件不需要与其他app共享数据或交互,请将AndroidManifest.xml 配置文件中设置该组件为exported = “False”。如果组件需要与其他app共享数据或交互, 请对组件进行权限控制和参数校验。
8)Service组件暴露
① 获取是exported状态的services的dz>run app.service.info -a com.xxxxx.sample Package: com.xxxxx.sample No exported services. dz>分析:没有exported的services
② 关于Services模块dz>cdappdz#app>cdservicedz#app.service>ls app.service.info Get information about exported services app.service.send Send a Message to a service, and display the reply app.service.start Start Service app.service.stop Stop Service dz#app.service>
3.Logcat安全android.permission.READ_LOGS:app读取日志权限,android 4.1之前版本通过申请READ_LOGS权限就可以读取其他应用的log了。但是谷歌发现这样存在安全风险,于是android 4.1以及之后版本,即使申请了READ_LOGS权限也无法读取其他应用的日志信息了。4.1版本中 Logcat的签名变为“signature|system|development”了,这意味着只有系统签名的app或者root权限的app才能使用该权限。普通用户可以通过ADB查看所有日志。通过 adb shell logcat可以查看所有logcat信息有些人认为任何log都不应该在发行版本打印。但是为**p的错误采集,异常反馈,必要的日志还是要被输出的,只要遵循安全编码规范就可以将风险控制在最小范围。建议:Log.e()/w()/i():建议打印操作日志Log.d()/v():建议打印开发日志
1、敏感信息不应用Log.e()/w()/i(), System.out/err 打印。2、如果需要打印一些敏感信息建议使用 Log.d()/v()。(前提:release版本将被自动去除)3、Log.d()/v()的返回值不应被使用。(仅做开发调试观测)参考:http://www.droidsec.cn/android-logcat-security/4.反编译查看myapk.apk是否安全1.使用APKTOOL反编译AndroidManifest.xml文件2.检查AndroidManifest.xml文件是否有如下内容:android:debuggable="true"如果你在其中发现了这样的内容,该应用是可以被调试的。很显示我们的xxxxx_sample是可被调试的。调试方法参见:http://bobao.360.cn/learning/detail/140.html3.反编译查看配置文件AndroidManifest.xml中activity组件(关注配置了intent-filter的及未设置export=“false”的)通过分析AndroidManifest.xml,我们获得了以下信息:包名:com.xxx.sample入口”com.xxxx.sample.MainActivity其它组件的export同Activity
三、参考资料1.《Android 安全测试初探》合集:testerhome.com/topics/16982.Android Hacking and Security英文原文: resources.infosecinstitute.com/android-hacking-security-part-1-exploiting-securing-application-components/中文:bobao.360.cn/learning/detail/122.html3.Android安全中文网站:/www.droidsec.cn