安全测试 [原创] Android app 安全测试调研及执行

叶子 · 2015年03月18日 · 最后由 回复于 2020年06月08日 · 7514 次阅读
本帖已被设为精华帖!

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 的一些基本信息

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 绑定一个调试器到进程。

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

5) 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 包名 包名.类名启动 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 组件暴露

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> cd app
dz#app> cd service
dz#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 都不应该在发行版本打印。但是为了 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

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 51 条回复 时间 点赞

总结的好全. 非常赞. 安全测试在线服务以后会是一个趋势.

赞一个!果断收藏~

果断收藏~

妹纸不错

最近看到几个朋友在玩 drozer 了

Drozer 感觉就是看到一本书上介绍的 Mercury。@emily 妹纸能给我发一个安装包不? 放到 360 云盘上面或者发我邮箱 312743168@qq.com = 3=多谢哦!

@emily 找到下载地址了 _______^

学习了,感谢分享!

收藏,感谢分享

叶子 #10 · 2015年03月19日 Author

#1 楼 @seveniruby 我也觉得安全测试在线服务以后会是一个趋势.虽然会上传 apk,但他们应该会对这些 apk 做保护,要不然不是自砸招牌

叶子 #11 · 2015年03月19日 Author

#6 楼 @weamylady 已发送,Drozer 原名的确是叫 Mercury

叶子 #44 · 2015年03月19日 Author

#5 楼 @anikikun 还没太玩儿明白,可以通过 Python 自己写脚步,可惜还不会 Python,看来要抓紧学了

叶子 #13 · 2015年03月19日 Author

#2 楼 @xuxu 谢谢组长,我会继续努力的 😃

叶子 #14 · 2015年03月19日 Author

#3 楼 @chenhengjie123 谢谢最开始的帮助🌻

叶子 #15 · 2015年03月19日 Author

#4 楼 @kasi 学艺不精,还请多多指教

#11 楼 @emily 嗯嗯,我刚装上在尝试。总是出现这个错误,后面装个 java1.8 再看看有木有问题:

dz> run scanner.provider.injection -a xxx.xx
Scanning cmb.pb...
"C:\Program Files\Java\jdk1.7.0_65\bin\javac.exe" -cp E:\drozer\lib\drozer\lib\a
ndroid.jar ZipUtil.java
[Errno 22] Invalid argument

#15 楼 @emily 用了 JDK1.8 以后就好使了- 3-

mark 啊

好帖,必须顶啊.我收藏了.

纯干货,居然是个妹纸,点赞。

D:>cd D:\drozer

D:\drozer>adb forward tcp:31415 tcp:31415

D:\drozer>drozer console connect
Could not find java. Please ensure that it is installed and on your PATH.

If this error persists, specify the path in the ~/.drozer_config file:

[executables]
java = C:\path\to\java
Selecting 9fd6c533af60cf5 (Sony Ericsson LT26ii 4.1.2)

.. ..:.
..o.. .r..
..a.. . ....... . ..nd
ro..idsnemesisand..pr
.otectorandroidsneme.
.,sisandprotectorandroids+.
..nemesisandprotectorandroidsn:.
.emesisandprotectorandroidsnemes..
..isandp,..,rotectorandro,..,idsnem.
.isisandp..rotectorandroid..snemisis.
,andprotectorandroidsnemisisandprotec.
.torandroidsnemesisandprotectorandroid.
.snemisisandprotectorandroidsnemesisan:
.dprotectorandroidsnemesisandprotector.

drozer Console (v2.3.4)
dz>
安装 drozer 后总是报这个错,jdk 和 jre 均已安装,求指点,谢谢!

#21 楼 @zgxlz 这个报错好像没影响,你可以试试能否继续操作下去,比如执行下 run app.package.list,应该能显示出你手机上安装的应用

叶子 #23 · 2015年04月07日 Author

#21 楼 @zgxlz 你需要新建一个.zrozer_confile 文件 [我的位置:C:\Users\MyName],里边写

[executables]
java = 你java.exe所在位置

如我的

@m3hkhhg 不修改也可以执行后续命令的操作,emily 说的方法我试了下,是可行的,你也可以试下!

@emily 你说的方法是可行的,谢谢!

#25 楼 @zgxlz 已试,可以,3Q!

#10 楼 @emily 是的,肯定要保护的,不然就是自砸招牌,谁还敢用啊

试了下,1.腾讯金刚审计系统 2.阿里聚安全检测 3.360 捉虫猎手检测结果 4.爱加密 5.百度 MTC
这五种在线安全检测工具只支持安卓 apk 的扫描,不支持 ios 的 ipa 扫描

一直报这个错误,也没找到好的解决方法,求指点,谢谢!@emily

drozer Console (v2.3.4)
dz> run app.package.list
unknown module: 'app.package.list'

查到这个帖子,已经解决了 ,谢谢~
https://testerhome.com/topics/2181

windows 需要 先切到 drozer 目录 cd c:\drozer 安装目录
再 drozer console connect 就找到了


为什么会出现这个问题,求教,谢谢!

#30 楼 @doubao 去官网下载和更新 drozer 试试吧。据说早期版本存在一些模块没有打包编译后文件。亲测有效

在执行带有 scanner 的命令时,小米手机会提示 cannot resolve com.mwr.jdiesel.util.Strings,三星 s6 直接 agent 崩溃了,有人遇到这个问题吗?

执行 dz> run scanner.provider.injection -a com.xxxxx.sample 命令时,总是提示 javac:无效的标记。
已经在 C:\Users\MyName 里面新建了.zrozer_confile 文件了:
[executables]
java=C:\Program Files (x86)\Java\jdk1.7.0_10\bin\java.exe
[executables]
javac=C:\Program Files (x86)\Java\jdk1.7.0_10\bin\javac.exe

#33 楼 @mindysz 把安装路径改下,路径中不能有空格。。。亲测


提示这个问题如何解决,jdk 已经是 1.8 了,单独在 cmd 中运行提示找不到 Ziputil.java

运行 scanner 命令,drozer_agent 会闪退。这是什么情况?

@zgxlz 我也出现跟你一样的情况,将.drozer_config 文件放到指定目录后,运行仍然报错。

检查是否有 sql 注入;
检查是否存在遍历文件的漏洞;
@emily

运行上述两个命令,在不同 apk 上面返回的结果都一样,该怎么分析?

@chenhengjie123
官网最新版是 V2.3.4 吧,我使用 V2.3.4 仍然报错,求教。

被挖坟才看到这篇文章,挺不错的说!支持一个

#34 楼 @aileen 非常感谢 原来我的安装路径是 C:\Program Files\Java\jdk1.8.0_60 一直报 javac:无效的标记 折腾了好多方法都么有用 今天看到你的提示重装了下 路径改成 D:\Java\jdk1.8.0_60 已经可以用了 非常感谢!!!!

#39 楼 @erick 我用官网(V2.3.4)也是老提示这个错误 drozer could not find or complie a required extension library. 然后卸了装了个这个链接下的:http://download.csdn.net/detail/behappy1987/7122875 装完后版本为 V2.3.3,可以用了。要不你也试试看?

#39 楼 @erick 我发现了 官网下载下来的安装包显示是为(V2.3.4):
https://labs.mwrinfosecurity.com/tools/drozer/
drozer (Windows Installer) – Updated 2015-08-24
58.0 MB
MD5: 2052f6d7271bbd524f27867d8834c17b

安装完后实际显示的版本为 V2.3.0,真是害死人呐。

在尝试用,好多坑啊啊啊啊啊啊啊啊啊

45楼 已删除

@emily 楼主 用的是什么系统?安装的 drozer 是什么版本的?

run scanner.provider.injection -a com.xxxxx.sample 提示 drozer could not find or compile a required extension library 这个提示不正确的,是个 bug,还没有解决https://github.com/mwrlabs/drozer/issues/225

#36 楼 @jianghaibo_ps 老哥,这个问题你解决了没

@erick 我也遇到同样的问题,请问你解决了吗?

@emily 楼主,请问这个问题该怎么解决

匿名 在 学习安全工具 drozer 踩过的坑 中提及了此贴 03月30日 18:00


win10 下执行 run app.package.list 命令时一直报错,无法找到原因,大家有遇到过的吗

xinxi 初识网络安全 中提及了此贴 08月07日 23:50

有没有大佬,来点更深层次的

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册