【技术分享】另外一种静默安装APP“黑科技”分析

admin 2023-12-08 02:52:04 AnQuanKeInfo 来源:ZONE.CI 全球网 0 阅读模式

http://p7.qhimg.com/t01f30b71772e96cd58.png

作者:ssssssshg

预估稿费:500RMB(不服你也来投稿啊!)

投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿

0x01 引子

我们知道,具有静默安装应用能力的APP,一般默认是手机厂商的系统应用,这类应用天生就拥有system权限,而第三方应用想要拥有静默安装app能力,只能在root后的手机上向su申请root权限,那么是否有非root权限下静默安装app的方法呢?

第三方应用中,有静默安装APP需求的一般是市场类应用,如360手机助手、百度手机助手和腾讯应用宝等,市场类应用为了让用户节约频繁点击操作的时间,提高用户体验,在安装和升级大量app不太希望有太多的弹框确认操作影响用户,而各家都独避蹊径实现了非root权限静默安装app,目前的方法都是使用AccessibilityService辅助服务进行自动点击,根据app的安装步骤来一步步实现app的静默安装。

AccessibilityService辅助服务是google为使用手机有障碍的用户提供的服务,第三方APP必须通过开启这个服务,才能让手机模拟用户点击,app使用这个功能会明确提示用户,如某流行的第三方市场应用。

http://p9.qhimg.com/t013187573f3b77be83.png

 另外还可以通过adb shell命令

”settings put secure enabled_accessibility_services <PACKAGE_NAME>/< ACCESSIBILITY_SERVICES_NAME>”和”settings put secure accessibility_enabled 1”

直接开启辅助服务,因为adb shell是具有”settings”的执行权限的:

 http://p4.qhimg.com/t01939517a671834ff0.png


0x02 另一种静默安装APP的方法

那既然拥有了adb shell的权限,除了开启辅助服务实现静默安装,我们还能不能使用一种更简单的方法呢?

大家知道,adb是能远程连接的,以前各种手机和智能设备都默认开启了adb的远程连接造成各种安全漏洞,如果安卓开启了调试模式,我们也可以事先通过USB调试使用tcpip命令开启这个远程调试功能,如“adb tcpip 5555”,开启5555端口的远程调试绑定,这时候不管是什么终端只要能使用合法的调试协议都是能使用adb的,所以手机上的app也能使用远程调试功能,这里我们不需要重复造轮子,直接使用Adblib这个开源库就能让app拥有adb远程调试的能力。无代码,不信服:

Socket socket = new Socket("127.0.0.1", 5555);
AdbCrypto crypto = AdbCrypto.loadAdbKeyPair(new AdbBase64() {
    @Override
    public String encodeToString(byte[] data) {
        return Base64.encodeToString(data, Base64.DEFAULT);
    }
}, keyPair);
connection = AdbConnection.create(socket, crypto);
connection.connect();
AdbStream stream = connection.open("shell:pm install -r /storage/emulated/0/ HookVulnerable.apk");

http://p1.qhimg.com/t014e86cf4cfb865d4b.png

如图,APP在本地就具备了静默安装的能力

0x03 adb协议简要分析

目前安卓的adb调试协议启用了设备认证,并使用了RSA非对称加密!我来简单描叙下ADB协议的流程:

1.调试设备连接手机,手机向调试设备发送AUTH TOKEN报文,这里会包含源自/dev/urandom的20字节的随机token。

2.调试设备用自己的私钥对该随机token进行签名(SHA1+RSA),放在发往手机的SIGNATURE报文中。

3.手机检查签名,如果正确,响应以CONNECT报文,否则向主机发送新的AUTH TOKEN报文,提供新的随机token。

4.如果调试设备已经确认了所有公私钥对,则向手机发送AUTH RSAPUBLICKEY报文,包含一个调试设备公钥。

5.手机接收到调试设备公钥后弹出信息框,询问是否允许(或永久允许),该信息框中一般会显示调试设备公钥的指纹(MD5) 

6. 调试设备的公钥最后保存在手机端的/data/misc/adb/adb_keys

http://p7.qhimg.com/t016387a542b8d733a9.png

看到这里我再把Adblib简要分析下,作者将adb源码里的几个重要的结构用JAVA实现,主要是

1.adb协议的标志头(OKAY,CLSE,OPEN,AUTH等)

2.adb消息的结构(命令、参数、payload长度,payload的checksum、magic以及payload)

3.adb加密方式(RSA加密消息)

大致通信过程如下:

http://p2.qhimg.com/t01cd2a7bbe0eb4a525.png

因此,Adblib只是在APP端把adb协议调试设备端的流程重新实现了而已。


0X04安全思考

文章写到这里,我就不再做更深入的分析了。关于安全问题,每个人都会有自己的思考,也许产品人员想到的是用户体验,而安全人员希望寻找里面的漏洞,黑产木马病毒制造者想到的则是会是怎么作恶,


0x05 参考

https://github.com/cgutman/AdbLib

https://nelenkov.blogspot.com/2013/02/secure-usb-debugging-in-android-422.html

weinxin
版权声明
本站原创文章转载请注明文章出处及链接,谢谢合作!
评论:0   参与:  0