专栏首页渗透云笔记使用Drozer利器对APP代码层面进行渗透分析

使用Drozer利器对APP代码层面进行渗透分析

作者;小仙人

介绍;安全武器库运营团队核心成员

享受星球原创文章待遇

声明;本篇文章为星球团队成员原创文章,但并未申请公众号原创权限,如其他公众号有需要转文,即可自取,或者联系渗透云笔记运营人员

APP面临的主要风险存在哪几点?

APP面临的主要风险可以分为客户端风险和服务端风险。

客户端风险:逆向分析和已被入侵类用户(输入记录、导出组件、进程注入等)

服务端风险:系统组件类(系统漏洞,如提权、心血、ShellShock、MS12-020)和业务应用类(注入、XSS、越权、文件上传、弱口令、任意用户注册等)

在开始之前,我觉得很有必要聊聊APP目前的安全现状。因为手机应用的快速增长,企业为了快速占领市场,忽略了很多安全问题,这就让黑客有可乘之机。而且由于安全是门系统学科,涉及知识范围广,大部分Android开发人员缺乏安全技术的积累,措施相对有限。其实市场上一些主流的APP都做了一定安全防范,比如加壳、代码混淆、so库加密保护、资源文件加密、DEX安全保护等等。但是这些加固手段都需要不少的成本,如果单是请一个能独立做这些加固的APP安全专家,那价格少说也5万起步,这都不好说,对于大企业来说,这没什么,所以大企业的安全防护措施都做得不错,但是小企业就不是这样了,小企业因为成本问题,产品的安全性常常被忽略,导致大部分小众APP产品常常遭受黑客的攻击,从而大大影响项目的正常运行。

APP有两种,一种Android,一种IOS,Android应用市场对APP的审核相对IOS来说也比较宽泛,审核上宽松很多。这里对IOS安全不做过多描述,因为自身没有亲测过,没有话语权。Android的安全问题有一大部分原因都是因为Android的组件暴露、权限使用不当导致的。这就涉及到Android的四大组件问题了,接下来进行总结。

Android系统的四大组件

Activity:呈现可供用户交互的界面

Service:长时间执行后台服务进程

Content Provider:在多个APP间共享数据

Broadcast Receivers:注册特定事件,并在其发生时被激活

Drozer是一款综合的安全评估和攻击的Android框架,Drozer可以全面评估APP的安全性,并帮助团队把APP的安全风险保持在可控范围内。

Drozer的安装教程:https://www.cnblogs.com/lsdb/p/9441813.html

这里我准备了一台手机(已root、已开启调试模式、已开启开发者模式),不用安卓模拟器,drozer已经安装完成。

检测手机是否成功连接电脑

adb devices

启动drozer只需要两条命令

adb forward tcp:31415 tcp:31415

drozer.bat console connect

【查看drozer支持哪些模块】

这里涉及到每一个组件测试所对应的模块,为了更好的了解drozer,必须深入了解这些模块,这里我总结每一个组件对应的模块。(下次测试的时候直接对应去复制粘贴出来就行)

Activity

app.activity.forintent -- 找到可以处理已指定的包app.activity.info -- 获取activity组件信息app.activity.start -- 开启activity组件scanner.activity.browsable -- 获取可从web浏览器调用的所有可浏览的activity组件

Service

app.service.info -- 获取service组件信息app.service.send -- 向服务组件发送消息并显示答复app.service.start -- 开启service组件app.service.stop -- 停止service组件

Content Provider

app.provider.columns -- 在内容提供程序中列出列app.provider.delete -- 在内容提供程序中删除app.provider.download -- 在内容提供程序中下载支持文件app.provider.finduri -- 在包中查找引用的内容URISapp.provider.info -- 获取Content Provider组件信息app.provider.insert -- 插入到Content Provider组件中app.provider.query -- 查询Content Provider组件app.provider.read -- 从支持文件的Content Provider读取app.provider.update -- 更新Content Provider的记录scanner.provider.finduris -- 搜索可从上下文中查询的Content Providerscanner.provider.injection -- 测试Content Provider的注入漏洞scanner.provider.sqltables -- 查找可通过SQL注入漏洞访问的表scanner.provider.traversal -- 测试Content Provider的基本目录遍历漏洞

Broadcast Receivers

app.broadcast.info -- 获取有关广播接收器的信息app.broadcast.send -- 带目的发送广播app.broadcast.sniff -- 注册一个能嗅出特定意图的广播接收器

这只是对应四大组件的模块,还有剩余一些模块这里不做总结,具体用 list 命令查看。

如果想要获取APP包信息,那使用 app.package.* 模块。

app.package.attacksurface

获取包攻击面

app.package.backup

列出使用备份API的包(在标记“允许备份”时返回true)

app.package.debuggable

查找可调试包

app.package.info

获取有关已安装软件包的信息

app.package.launchintent

获取包的启动意图

app.package.list

列出程序包

app.package.manifest

获取包的AndroidManifest.xml

app.package.native

查找嵌入在应用程序中的本地库

app.package.shareduid

查找具有共享uid的包

这里最常用的就是获取攻击面、找调试包、获取软件包信息、获取包的manifest(这个感觉真没必要,反编译出来放到编辑器里面看舒服多了)。以下是一些实例。

【获取APP的基本信息】

run app.package.info -a 软件包名(个人感觉没啥用)

【查找可能存在被攻击的界面】

run app.package.attacksurface 软件包名

【Activity测试】

run app.activity.info -a 软件包名 --> 查看activity组件能被利用的界面(根据上图可以知道有11个界面是可以被利用的,怎么利用呢?继续往下看)

run app.activity.start --component 软件包名 软件包名.activity.StartActivity --> 通过此命令能够打开进入登录界面

接下来就是一个个测试剩下的界面,亲测之后,手机并没有任何显示其它东西,没有任何利用价值,既然没有利用价值,那么对应用安全就没任何威胁,可以判定为安全。

【Service测试】

对service组件测试,我们切换进其目录,可以发现有四个模块,上面已经做了描述。Service组件,我测过,但是没有任何反应,结果也不是参考资料里所描述,我对此也感到很疑惑,没搞懂这一块,如果哪位师傅看到小弟的不才,烦请传授,我必感激不尽。

【某个服务器发送信息】

run app.service.send com.xxx.wwh com.xxxx.wwh.CryptoService --msg 1 5 3

【权限提升】

run app.service.start --action com.test.vulnerability.SEND_SMS --extra string dest 11111 --extra string text 1111 --extra string OP SEND_SMS

【Content Provider测试】

【获取Content Provider信息】

run app.provider.info -a com.xxxxx.wwh

【检测Content Provider是否存在SQL注入和目录遍历】

run scanner.provider.injection -a com.xxxxx.wwh

【获取所有可以访问的URI】

run scanner.provider.finduris -a com.xxxxx.wwh --> (有暴露的Provider就可以用drozer扫描可用的URI,根据上面的攻击面信息可以得知Content Provider exported为0,所以这里的扫描结果都是无法查询的URI)

【获取各个URI的数据】

run app.provider.query content://com.xxxx.wwh.xxxxxx --vertical --> (如果查询到数据说明存在漏洞,属于数据泄露漏洞)

【读取文件】

run app.provider.read content://com.xxxxxx.wwh.xxxxxx/etc/hosts

【检查是否存在遍历文件漏洞】

run scanner.provider.traversal -a com.xxxxx.wwh

【对某个URI进行注入】

run app.provider.query content://com.xxxxx.wwh.xxxxxx --projection "* FROM SQLITE_MASTER WHERE type='table';--"

run app.provider.query content://com.xxx.wwh.xxxxxx --selection "type='table';--"

【Broadcast Receivers测试】

【查看暴露的广播组件信息】

run app.broadcast.info -a com.xxxx.wwh

Broadcast Receivers没测过,网上大部分参考资料都是Content Provider有攻击面的,我实战测试时Content Provider都不存在攻击面

【Activity组件造成的安全危害及如何防范】

1. 恶意调用页面(页面敏感内容泄露) 2. 恶意接收数据(敏感数据泄露) 3. 恶意发送广播、启动应用服务(影响用户体验) 4. 调用组件恶意接收组件返回的数据

防范:

1. 不需要被外部程序调用的组件设置Android:exported="false"属性

2. 设置特定组件的访问权限,对于希望Activity能够被特定的外部程序访问,可以为其设置访问权限,具体做法有三种:

(1)组件添加android:permission属性;

如果希望Activity能够被特定的程序访问,就不能用android:exported属性了,可以使用android:permission属性来指定一个权限字符串,声明例子如下:

这样声明的Activity在被调用时,Android系统就会检查调用者是否具有com.test.permission.MyActivity权限, 如果不具备就会触发一个SecurityException安全异常。要想启动该Activity必须在AndroidManifest.xml文件中加入以下声明:

<uses-permission android:name="com.test.permission.MyActivity">

(1)protectionLevel权限声明,exported属性只是用于限制Activity是否暴露给其他app,通过配置文件中的权限申明也可以限制外部启动activity;

(2)声明,如下

<code class="hljs xml has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span style="box-sizing: border-box; color: rgb(0, 0, 136);">uses-permission</span> <span style="box-sizing: border-box; color: rgb(102, 0, 102);">android:name</span>=<span style="box-sizing: border-box; color: rgb(0, 136, 0);">"com.wooyun.custempermission"</span> /></span></code><ul style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

这样声明的Activity在被调用时,Android就会检查调用者是否具有com.wooyun.custempermission权限,如果没有就会触发SecurityException异常。

https://blog.csdn.net/chenjiang2936/article/details/53063406

https://blog.csdn.net/u013309870/article/details/69228125

总的来说

1. 当Activity组件为私有组件时,最好将exported的值为false;

2. 当Activity组件为公有组件时,建议对其进行权限控制。

【Service组件造成的安全危害及如何防范】

1. 敏感信息泄露 2.权限提升、拒绝服务等风险 3.第三方APP任意调用

防范:

1. 不必要的service组件不必要导出,设置组件"android:exported"属性为false;

2. 如果必须要提供给外部应用使用,就对组件进行权限控制;

https://blog.csdn.net/weixin_34128411/article/details/92272150

http://www.droidsec.cn/android-service-security/

参考资料

https://blog.csdn.net/jianglianye21/article/details/80667346 -- Drozer-Android安全测试基本使用教程-CSDN

http://www.sohu.com/a/316907526_698291 -- 安全小课堂第139期【APP安全之四大组件漏洞】

https://www.cnblogs.com/lsdb/p/9441813.html -- drozer安装使用教程

https://www.freebuf.com/sectool/26503.html -- FreeBuf测试案例

https://blog.csdn.net/GCF123123/article/details/82896828 -- 安全测试|移动端安全测试drozer

https://www.jianshu.com/p/1ac864473c7c -- 利用Drozer对Android app进行安全测试 | 简书

https://blog.csdn.net/chenjiang2936/article/details/53063406 -- Android研发安全-Activity组件安全(上)

https://blog.csdn.net/u013309870/article/details/69228125 -- Android组件安全详解

https://blog.csdn.net/JiaoMaGe/article/details/103024097 -- Drozer之组件安全

https://blog.csdn.net/xianKOG/article/details/81702119 -- Android四大组件、五大存储、六大布局

https://blog.csdn.net/websinesafe/article/details/99714668 -- 全方位对APP进行安全检测

本文分享自微信公众号 - 渗透云笔记(shentouyun),作者:小仙人

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-02-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 微软MS10-087漏洞的复现+明天咱抽奖预告

    天钧
  • Docker学习笔记(1)

    最近学习了Docker,深感Docker的强大,对Docker常用的子命令做了一下整理,共涉及6类,32个子命令。当然我整理的并不全面,有什么疏漏和错误还请大家...

    天钧
  • Docker学习笔记(3)

    如果没什么意外,这应该是基础命令的最后一篇了… 总结到了一张脑图上,可以做个参考,查看高清版请点我

    天钧
  • Kubernetes Ingress入门指南和实践练习

    Ingress也是Kubernetes项目里的一种 API 对象,它公开了从集群外部到集群内Service的 HTTP 和 HTTPS 路由,这些路由由 Ing...

    KevinYan
  • 前端 3d开发怎么操作,什么流程?

    我们都知道现今社会复合型人才是企业刚需,只会一项本领难以在企业中立足,即便是前端工程师,如果你只会敲代码改网页也是不行了,要多方面拓展自己的才能。比如研究可视化...

    要不要吃火锅
  • Human Interface Guidelines — Requesting Permission

    霖酱
  • Sass-学习笔记【基础篇】

    xing.org1^
  • js验证码倒计时

    IT故事会
  • 如何用 1 张图说 100 次我爱你?这个小程序帮你搞定

    本期,知晓程序推荐的「字云」小程序,就能帮你用文字一键生成「图文并茂」的个性图片。

    知晓君
  • 【DB笔试面试636】在Oracle中,如何收集直方图信息?在收集直方图时有哪些注意事项?

    默认情况下,数据库会为列收集基本统计信息,但不会收集直方图信息。Oracle通过指定DBMS_STATS的METHOD_OPT参数来创建直方图。METHOD_O...

    小麦苗DBA宝典

扫码关注云+社区

领取腾讯云代金券