目录
-
发现导出Service -
消息伪造 -
越权 -
命令执行 -
本地拒绝服务 -
案例下载
Service是android四大组件之一,可以长时间的运行在后台。一个组件可以绑定到一个service来进行交互,即使这个交互是进程间通讯也没问题。Service不是分离开的进程,除非其他特殊情况,它不会运行在自己的进程,而是作为运行它的进程的一部分。Service不是线程,意味着它将在主线程里劳作。如果一个「导出的Service」没有做严格的限制,任何应用都可以去启动并绑定到这个Service上,「取决于被暴露的功能」, 这可以是一个应用去执行未授权的行为,获取敏感信息或污染修改内部应用的状态造成威胁。
发现导出Service
Service 做为 Android 的组件,必须要在 AndroidManifest.xml 中进行声明,同样也会分为导出与非导出的状态。
当满足以下条件之一的时候,Service 组件将是导出状态,可以被其他 APP 调用:
-
显式设置了 android:exported="true" (当 SDK 小于等于16的时候,默认为 true) -
设置了 <intent-filter> 的 action 标签,且未设置 android:exported="false"
使用drozer发现导出的service组件
❝
run app.service.info -a <Package_Name>
❞
消息伪造
越权
使用某个安卓APP的时候,比如我们拨打电话,发送短信,打开摄像头,读取本地的存储,都是需要获取相应的权限,得到用户和系统的授权才能去完成相应的敏感功能。
这里的越权,某些受信任的APP,获取到了一些敏感操作的权限,但是了没有做好权限控制,将对应的权限暴露出去,从而导致一些恶意的APP可以不去申请敏感,但是可以直接去越权调用其他APP导出的组件越权完成一些敏感操作,比如发送短信,打开摄像头。
这段代码定义了一个名为SMSService的Android服务,其主要功能是发送短信。以下是对代码的详细解释:
基础结构:
SMSService继承自android.app.Service,这意味着它是一个Android服务,可以在后台长时间运行,而不需要用户交互。
onBind方法:
这是Service类的一个回调方法,当其他组件(如活动)想要与服务绑定时,它会被调用。
在这个方法中,抛出了一个UnsupportedOperationException异常,表示这个服务不支持绑定操作。这意味着其他组件不能与这个服务绑定并进行通信。
onCreate方法:
这是Service类的一个回调方法,当服务首次创建时,它会被调用。
在这里,它只是调用了父类的onCreate方法,没有进行任何其他操作。
onStartCommand方法:
这是Service类的一个回调方法,当服务通过startService方法启动时,它会被调用。
在这个方法中,首先获取了系统的SmsManager,这是一个用于发送短信的管理器。
从传入的Intent中,提取了电话号码(phone)和消息内容(content)。
使用smsManager.divideMessage(message)将消息内容分割成多个部分,以确保消息可以适应短信的大小限制。
使用迭代器遍历这些消息部分,并使用smsManager.sendTextMessage方法发送每个部分。
在日志中记录了发送的消息内容。
SmsManager:
SmsManager是Android提供的一个类,用于发送短信。
getDefault方法返回系统默认的SmsManager实例。
divideMessage方法用于将长消息分割成多个部分,以确保它们可以适应短信的大小限制。
sendTextMessage方法用于发送短信。
日志记录:
使用了Log.e方法,这是Android的日志工具,用于记录错误消息。在这里,它被用来记录发送的短信内容。
总结:
这个服务的主要功能是发送短信。当服务启动时,它会从传入的Intent中提取电话号码和消息内容,然后使用SmsManager发送短信。如果消息内容太长,它会被分割成多个部分,并分别发送。
命令执行
这段代码是一个Android的Service
,名为NetService
,它提供了一个功能:检查指定的主机是否可以通过网络访问。以下是对代码的详细解释:
-
「基础结构」: -
NetService
继承自android.app.Service
,这意味着它是一个Android服务,可以在后台长时间运行,而不需要用户交互。 -
「AIDL接口」: -
IGetNetStatusInterface.Stub
是一个AIDL(Android Interface Definition Language)接口的实现。AIDL用于允许不同的应用程序或应用程序的不同部分(例如服务和活动)在同一个设备上进行进程间通信(IPC)。 -
netStub
是这个接口的一个实例,它提供了一个getNetStatus
方法,该方法接受一个host
参数。 -
「getNetStatus方法」: -
这个方法的目的是检查指定的主机是否可以通过网络访问。 -
它使用 ping
命令来实现这个功能。ping
是一个网络诊断工具,用于检查主机是否可达。 -
Utils.exec(cmd)
似乎是一个工具方法,用于执行给定的命令并返回结果。 -
根据 ping
命令的结果,方法将判断网络是否可用,并在日志中记录相应的消息。 -
「onBind方法」: -
这是 Service
类的一个回调方法,当其他组件(如活动)想要与服务绑定时,它会被调用。 -
在这个方法中,返回了 netStub
,这意味着其他组件可以通过这个接口与服务通信。 -
「日志记录」: -
代码中多次使用了 Log.e
方法,这是Android的日志工具,用于记录错误消息。在这里,它被用来记录执行的命令、命令的结果以及网络是否可用。
「总结」:这个服务提供了一个方法,允许其他组件检查指定的主机是否可以通过网络访问。它使用ping
命令来实现这个功能,并将结果记录在日志中。其他组件可以通过AIDL接口与这个服务绑定并调用它的方法。
本地拒绝服务
Service的拒绝服务主要来源于Service启动时对接收的Intent等没有做异常情况下的处理,导致程序崩溃。主要体现在给Service传输的intent或者传输序列化对象导致接收时候的类型传化异常。
adb shell am startservice -n <package_name>/service组件名字
案例下载
vuls_v4.4.apk
TestVuls.apk
youku-v4.5_killer.apk
youku-poc.apk
参考
https://mp.weixin.qq.com/s/E0a3NbOoImyM7pxiCF6jgw
https://bbs.kanxue.com/thread-269255.htm
原文始发于微信公众号(闻鸡习武):Android APP Service组件常见漏洞
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论