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

叶子 · March 18, 2015 · Last by replied at June 08, 2020 · 7346 hits
本帖已被设为精华帖!

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 · March 19, 2015 作者

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

叶子 #11 · March 19, 2015 作者

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

叶子 #12 · March 19, 2015 作者

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

叶子 #13 · March 19, 2015 作者

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

叶子 #14 · March 19, 2015 作者

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

叶子 #15 · March 19, 2015 作者

#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 · April 07, 2015 作者

#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,真是害死人呐。

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

45Floor has been deleted

@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 踩过的坑 中提及了此贴 30 Mar 18:00


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

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

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

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up