当前位置:   article > 正文

Android app 安全测试调研及执行_腾讯金刚审计系统

腾讯金刚审计系统

Android安全测试

一、通过在线工具进行测试

1.腾讯金刚审计系统
http://service.security.tencent.com

优点:包含了修复建议

2.阿里聚安全检测

网址: http://jaq.alibaba.com/ 
阿里聚安全下有自己的安全博客,包含一些:1.安全漏洞、2.病毒分析、3.技术研究、4.安全报告相关文档。

3.360捉虫猎手检测结果

网址: http://appscan.360.cn/ 
同样有自己的安全博客

4.爱加密

网址:http://safe.ijiami.cn/analyze
优点:在导出的报告中可以看到对当前apk的评分

5.百度MTC

网址: http://mtc.baidu.com/

总结
经比较感觉腾讯金刚审计系统和360捉虫猎手检测结果更全面详细,而且包含修复建意
在线工具的缺点是会把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下载地址:http://mwr.to/drozer
1.在客户端安装Drozer

2.在手机端或模拟器安装agent.apk

3.在手机端或模拟器运行agent.apk点击开启-->Embedded Server-->Enable

4.建立端口转发,drozer使用31415端口,即执行命令:adb forward tcp:31415 tcp:31415

5.drozer console connect

6.安装包中还包含一个测试应用程序sieve.apk

具体可参考:https://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.apk

dz> run app.package.list -f sample
com.xxx.xx (my)

3)获取my.apk的一些基本信息

  1. dz> run app.package.info -a com.xx.xxx
  2. Package: com.xx.xxx
  3. Application Label: my
  4. Process Name: my
  5. Version: 1.0
  6. Data Directory: /data/data/com.xxxx.xxxx
  7. APK Path: /data/app/com.xxx.xx-1.apk
  8. UID: 10217
  9. GID: [3003, 1028, 1015]
  10. Shared Libraries: null
  11. Shared User ID: null
  12. Uses Permissions:
  13. - android.permission.READ_LOGS
  14. - android.permission.INTERNET
  15. - android.permission.ACCESS_NETWORK_STATE
  16. - android.permission.READ_PHONE_STATE
  17. - android.permission.ACCESS_WIFI_STATE
  18. - android.permission.WRITE_EXTERNAL_STORAGE
  19. - android.permission.WAKE_LOCK
  20. - android.permission.VIBRATE
  21. - android.permission.WRITE_SETTINGS
  22. - org.agoo.android.permission.MESSAGE
  23. - android.permission.CHANGE_NETWORK_STATE
  24. - android.permission.CHANGE_WIFI_STATE
  25. - android.permission.GET_TASKS
  26. - android.permission.SEND_SMS
  27. - android.permission.READ_EXTERNAL_STORAGE
  28. - android.permission.RECEIVE_SMS
  29. - android.permission.SYSTEM_ALERT_WINDOW
  30. - android.permission.ACCESS_COARSE_LOCATION
  31. - android.permission.ACCESS_FINE_LOCATION
  32. - android.permission.RESTART_PACKAGES
  33. - android.permission.MANAGE_ACCOUNTS
  34. - android.permission.GET_ACCOUNTS
  35. - android.permission.READ_CONTACTS
  36. Defines Permissions:
  37. - org.agoo.android.permission.MESSAGE
  38. dz>

分析:可以看到myapk的版本信息,数据存储的目录,用户ID,组ID,是否有共享库,还有权限信息等。

4)APP攻击面分析

分析Activity/Broadcast Receiver/Content Provider/Service是否能被其他的的应用程序调用

  1. dz> run app.package.attacksurface com.xxx.xxxx
  2. Attack Surface:
  3. 5 activities exported
  4. 0 broadcast receivers exported
  5. 0 content providers exported
  6. 0 services exported
  7. is debuggable
  8. dz>

分析:结果显示了潜在可以利用的组件个数: “exported”表示组件可以被其他App使用。 services is debuggable表示我们可以用adb绑定一个调试器到进程。

调试方法参见:http://bobao.360.cn/learning/detail/140.html

5)Activity组件暴露

  1. dz> run app.activity.info -a com.xxx.xxxx
  2. Package: com.xxxx.xxxx
  3. com.xxxxx.xxx.xSinaWeiboActivity
  4. Permission: null
  5. com.tencent.tauth.AuthActivity
  6. Permission: null
  7. com.xxx.xxxx.xxxx.WXEntryActivity
  8. Permission: null
  9. com.xxx.xxx.ContainerActivity
  10. Permission: null
  11. com.xxxxx.xxxx.MainActivity
  12. Permission: null
  13. dz>

分析:其中上图的MainActivity是程序启动时主界面,必须是exported,其他几个activity是理论上说是不能exported的。

我们可以通过命令run app.activity.start --component 包名 包名.类名启动Activity

dz#> 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组件暴露

  1. dz> run app.provider.info -a com.xxxx.sample
  2. Package: com.xxxxx.sample
  3. No matching providers.
  4. dz>

分析:我们可能没有用到Content Provider或者说是安全的。如果包含则会显示exported的content provider的具体信息,包括名字,权限,访问路径等,就可以做一此类如Sql注入的操作。

① 检查是否有sql注入

  1. dz> run scanner.provider.injection -a com.xxxxx.sample
  2. Scanning com.xxxx.sample...
  3. D:\Java\jdk1.8.0_11\bin\javac.exe -cp C:\drozer\lib\drozer\lib\android.jar ZipUtil.java
  4. C:\drozer\lib\drozer\lib\dx.bat --dex --output 4a78a7a38b67b985beccf6efac92375b.apk ZipUtil.class
  5. trouble processing:
  6. bad class file magic (cafebabe) or version (0034.0000)
  7. ...while parsing ZipUtil.class
  8. ...while processing ZipUtil.class
  9. 1 warning
  10. no classfiles specified
  11. drozer could not find or compile a required extension library.
  12. dz>

② 检查是否存在遍历文件的漏洞

  1. dz> run scanner.provider.traversal -a com.xxxxx.sample
  2. Scanning com.xxxx.sample...
  3. D:\Java\jdk1.8.0_11\bin\javac.exe -cp C:\drozer\lib\drozer\lib\android.jar ZipUtil.java
  4. C:\drozer\lib\drozer\lib\dx.bat --dex --output 4a78a7a38b67b985beccf6efac92375b.apk ZipUtil.class
  5. trouble processing:
  6. bad class file magic (cafebabe) or version (0034.0000)
  7. ...while parsing ZipUtil.class
  8. ...while processing ZipUtil.class
  9. 1 warning
  10. no classfiles specified
  11. drozer could not find or compile a required extension library.
  12. dz>

7)Broadcast receivers组件暴露

通过反编译可以看到有三个广播接收器被注册,且未设置exported=“false”

风险描述

导出的组件可以被第三方app任意调用,导致敏感信息泄露或者恶意攻击者精心构造攻击载荷达到攻击的目的。

修复建议

如果组件不需要与其他app共享数据或交互,请将AndroidManifest.xml 配置文件中设置该组件为exported = “False”。如果组件需要与其他app共享数据或交互, 请对组件进行权限控制和参数校验。

8)Service组件暴露

① 获取是exported状态的services的

  1. dz> run app.service.info -a com.xxxxx.sample
  2. Package: com.xxxxx.sample
  3. No exported services.
  4. dz>

分析:没有exported的services

② 关于Services模块

  1. dz> cd app
  2. dz#app> cd service
  3. dz#app.service> ls
  4. app.service.info Get information about exported services
  5. app.service.send Send a Message to a service, and display the reply
  6. app.service.start Start Service
  7. app.service.stop Stop Service
  8. 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都不应该在发行版本打印。但是为了app的错误采集,异常反馈,必要的日志还是要被输出的,只要遵循安全编码规范就可以将风险控制在最小范围。

建议:
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.html

3.反编译查看配置文件AndroidManifest.xml中activity组件(关注配置了intent-filter的及未设置export=“false”的)

通过分析AndroidManifest.xml,我们获得了以下信息:

包名:com.xxx.sample
入口”com.xxxx.sample.MainActivity

其它组件的export同Activity

三、参考资料

1.《Android 安全测试初探》合集:http://testerhome.com/topics/1698

2.Android Hacking and Security

英文原文: http://resources.infosecinstitute.com/android-hacking-security-part-1-exploiting-securing-application-components/

中文:http://bobao.360.cn/learning/detail/122.html

3.Android安全中文网站: http://www.droidsec.cn

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/267287
推荐阅读
相关标签
  

闽ICP备14008679号