背景
drozer 是个很不错的渗透测试工具,主要用来发现Android组件可能存在的一些安全问题。
它使用起来比较简单,掌握了几个常用的命令就能够对apk进行简单的安全测试。网上有不少介绍drozer的文章,我这里就做个搬运工,将drozer的使用做个小结。
安装
首先要保证自己电脑上已经安装了 Android开发环境 和 java环境。没有安装的可自行查询,这里不再介绍。
接下来是从官网下载drozer:官网地址。
下载之后解压到某个目录,然后你会看到如下图的结构:
setup.exe就是PC端的工具,直接下一步完成安装。agent.apk是手机端的代理app,通过 adb install 命令进行安装。
打开手机端apk,然后点击右下角的开启server,然后点击Embedded server,会看到如下图所示页面:
可以看到它尝试去bind port 31415,我们应该在pc端的命令行对端口进行转发,在pc端执行:
adb forward tcp:31415 tcp:31415
可以看到手机端一直在等待链接,我们再在pc端执行:
drozer console connect
这样就创建了连接了,如下图所示:
如果碰到【Error 10054】之类的错误,检查下手机端的服务是否开启成功。
开始测试
我们先将待测试的apk安装到手机上,然后开始测试。
如果不知道应用的包名,有很多种办法可以知道,用drozer也可以。
run app.package.list -f [app关键字]
我们先确定我们的apk有哪些潜在的风险,在pc端执行,执行之后的结果如下图所示:
run app.package.attacksurface packageName
从上面的结果我们可以看到它总共检测了5个方面:4种组件有多少是被导出的、另外app是否是可debug的。下面我们就逐个的讲解下测试思路
Activity
我们首先查看详细的被攻击的Activity,执行如下命令:
run app.activity.info -a packageName
以上面com.xdja.eoa为例,执行之后的结果如下图所示:
我们可以看到这里每个导出的Activity都是没有权限限制的,一定程度上可能是存在问题的。不过需要注意的是每个app的LaunchActivity是导出的。
接下来我们就可以对每个有风险的Activity展开攻击了:
run app.activity.start –component packageName ActivityName
如果能直接打开页面,且出现了app crash或者页面异常,我们就认为这个页面是有问题的。
Service
和Activity的思路一样,我们先来查看具体的哪个Service被导出了:
run app.service.info -a packageName
上面以OA为例时并没有service导出,所以我用安通+作为例子,如下所示
接下来对Service进行攻击
dz> run app.service.send packageName serviceName –msg xxx
BroadcastReceiver
同样,先去查找broadcastReceiver的攻击面。执行如下命令:
run app.broadcast.info -a packageName
还是以安通+为例,安通+竟然有十几个导出的broadcastReceiver,如下:
接下来是攻击receiver,平时测试过程中,receiver的问题比较多,所以应该多留个心。
run app.broadcast.send –component 包名 ReceiverName –action actionName // 发送一个不带extras的广播
run app.broadcast.send –component 包名 ReceiverName // 发送空action的广播。
// 一般用于检测是否有拒绝服务漏洞
Content Providers
ContentProvider主要是可能存在数据泄露风险,对它进行检测的命令会多一些。
首先我们执行命令查看App中存在的ContentProvider以及权限问题(权限问题我们需要结合源码看权限的级别以及权限的定义是否有问题),不过需要说明的是,ContentProvider相对其他组件可能用的比较少:
run app.provider.info -a packageName
接着我们可以获取所有可以访问的URi,如果有uri可以被读写,表示可能存在数据泄露风险。
run scanner.provider.finduris -a packageName
我们看到这里安通+是没有uri可以访问的,我试了好几个app都没有找到能读的uri,我们这里假设有可读的uri,再执行命令:
run app.provider.query content://xxxx/xx –vertical
// 如果这里能查询到数据,说明存在数据泄露,如果不存在会报权限不足之类的错误
接下来检测是否存在SQL注入
run app.provider.query content://xxx –projection “’”
run app.provider.query content://xxx –selection “’”
// 这里如果报错了,说明存在SQL注入
还可以用来查询所有的表,及表中的数据。这里的查询条件可以根据自己的需要定制
列出所有表:
run app.provider.query content://XXX –projection “* FROM SQLITE_MASTER WHERE type=’table’;–”
获取某个表(如Key)中的数据:
run app.provider.query content://XXXXX –projection “* FROM Key;–”
// 如果能获取到数据,说明存在SQL注入
最后我们还可以同时检测SQL注入和目录遍历
run scanner.provider.injection -a packageName
run scanner.provider.traversal -a packageName