大家好,我是海盗,欢迎来到海盗茶馆。今天跟大家聊一下车机的渗透思路以及实例。
基础知识:什么是车机
车机,通俗理解就是车内的那块大屏。在看各种paper、文档的时候你会发现有各种叫法。IVI、AVN、HMI、HU等等,不要疑惑,指的都是同一个东西。
-
IVI:In-Vehicle Infotainment,车载信息娱乐系统。
-
AVN:指的是audio、video、navigation。最初的几个车内的功能。后来代指车机。
-
HMI: 人机接口。这个前面也讲过了。
-
HU: headunit,老外喜欢这么叫。
攻击面分析方法论
攻击面的本质是什么?不知道大家有没有想过这个问题。其实就是IO。Input和Output。
只有在你能与目标进行IO交互的时候,才可能、才可以进行测试以及安全测试。理解这个本质,再去分析任何目标的攻击面就好理解的多了。
我们输入数据(In),根据反馈(Out)判断是否存在问题、数据中的poc是否正确执行等。理解这个本质,那么所有的攻击面,其实都可以归纳为寻找In的过程,从所有的In的路径,筛选出具备攻击可能的那一条,然后展开测试。
不过这里还要说明一下,攻击面的寻找,跟漏洞的确认,是两个不同的环节。一个是开始,一个是结尾。
车机的攻击面
有了上面的方法论做基础,再去分析车机的攻击面,其实思路就很清楚了。就是寻找能与车机进行数据交互的方法。根据交互距离,我习惯分成如下几个类别:
- 接触攻击面HMI/触摸屏:你使用触摸屏,其实也是一种IO的过程。硬件设备及接口:如usb、OBD等。
- 近场攻击面车机系统以及车机应用的使用方式,如wifi、蓝牙。
- 远程攻击面,车机的远程攻击面不常见,移动App大多情况下都是与Tbox做交互。这里就暂时不多说了。
C车机破解过程
关于如何获取实验室设备等等,不再赘述了。简言之就是实验室环境下我们拥有C车机、配套的显示屏、C车机线束引出来的usb接口。
识别系统
车机点亮之后,看起来很酷炫的界面。只看界面其实是比较难判断到底是什么系统的。不过,常见的车机系统无非就是安卓、QNX以及inux。
不过黑盒状态下如何具体判断系统版本呢?我个人比较喜欢使用网络抓包分析的方法。
-
搞一个可以抓包的wifi,也可以使用你的手机热点,前提是能抓包。
-
打开车机内可以联网使用的app。
-
寻找需要联网的功能,触发网络请求,最好是http的请求,如图片等。我一般喜欢选版本检测更新,登录,注册,图片等。
-
打开捕获的数据包,寻找http请求,检查User-Agent。
如下就是我们捕获到的一个http的UA:
Dalvik/1.6.0 (Linux;U;Android 4.4.2;X4xxAUTO-MX6Q Build/A3.02.09208)
这个UA可以得出以下结论:
-
使用的Android 4.4.2。
-
X4xx AUTO 是车型信息。
-
MX6Q是硬件设备相关的信息。
-
Build/A3.02.09208 应该是这个请求发起的软件的版本编号。
4.4.2 的安卓漏洞应该挺多的,但是前提是你需要有数据输入的通道,得有个入口。这也就是审计与渗透所不同的地方。审计是把所有的问题都找出来告诉你,很可能大部分都不能被直接利用。而渗透,是找出来能被利用的漏洞并验证可用。
不抬杠,这个UA判断不一定完全准确,所以可以多找几个app的请求多看一下,毕竟所有的http头都是可以被定制的。
安卓车机的渗透思路
国内很多车厂负责车机的Tier1,使用的系统都比较老旧,4.4的比较多,一直不太明白这个原因。使用这个系统对我们来说基本只要找到进入点,提权啥的都比较容易,因为可用的漏洞还是比较多的。但是如何寻找进入点呢?
-
系统升级/app升级漏洞
-
webview漏洞
-
系统内置应用漏洞
-
车机系统自身的bug
我前面的文章里大概讲过一下Tier1 跟Tier2,如果没有看过之前的文章也没关系,大家可以这么车机:缝合怪。
攒一个车机可能有三拨人:攒系统的,通用软件厂商,车厂自己的软件外包。这么一个缝缝补补的怪物,出现3不管地带很常见。千万别把车厂的软件品控想的太牛逼,尤其是国内车厂,外包的质量更不用说了。
系统升级
C这台车机,做的相对还算不错的。系统升级可以本地以及网络,本地升级的话需要去下载升级包。网络升级的话联网后直接通过网络匹配版本,然后下载升级包。不过可惜的是,人家的升级包都是加密的。嗯嗯,搞不清楚解密方法之前,这个地方无从下嘴。
app个体的的升级呢,直接砍掉了。只能通过大版本的升级来升级单个app。
此路不通。我们看下一个。
webview
通过前面的抓包分析,http请求不少,但是触发webview解析的不多,不少都是json数据。序列化漏洞?嗯嗯,想法不错。
在一个隐私资料里面,发现一个url可以点击,看起来点击就打开一个类似浏览器的东西。只不过域名写死的。这个肯定也难不倒我们。dns劫持就可以了。随便写个alert的页面测试下是不是可以执行js,失望了,并没有弹框。我们浏览器的大牛研究了端时间发现没有可利用的漏洞,放弃了。
不过到这一步,并不全是没有收获,我们自己改造了一个黑盒流量分析的工具出来,实现http的自动保存、dns的劫持以及泛域名的劫持、路由劫持等。
这条路也不通啊,再往下看呗。
内置应用
C车机主界面可拉起的内置应用很少,除了地图、音乐这些常规的并没有太多可发挥的空间。
系统bug
在有些沮丧的时候,有一个好玩的发现。当把无线键鼠的usb接收器插到车机的usb接口时,系统会对键盘的部分按键做出反应。
在某一个特定的系统主题下面,系统会对键盘的属性键做出反应,右下角弹出一个菜单,包括壁纸、管理应用以及系统设置。看到这里我有种预感,这里应该可以搞定。
你想起来什么了?windows 3389的输入法绕过登录界面拉起cmd的利用?还是早期安卓电视可以调出系统设置菜单?
经过省略1w字的坚持不懈的人肉测试之后,终于发现,管理应用中可以调出某一个输入法的配置界面,
注:配图非原图,保密性的关系,原图没办法放出来,帮助大家理解下这个流程。
到这里却被卡住了,应用程序界面并没有安装的按钮。
肯定不能在这里放弃啊,搞来搞去,发现在设置界面有个主屏幕的选项,进去之后,看到几个启动器,选择名字是“启动器”的那个启动器,回到主界面,哈哈,主界面变空白了,右边出现了那个久违的代表应用程序的按钮。
想象下,空也没只有红框里的程序按钮。点击,桃花源出来了。
系统所有的安装的应用程序都在这里了。
接触式getshell
应用程序里面有三个引起了我们的注意,一个叫“工程模式”,一个是ES文件管理器,还有一个叫“安装”。
ES文件管理器版本不高,存在漏洞,但是权限不够,无法安装应用。
工程模式,拉起一看,像是内部测试用的应用。在其中一个菜单中发现连接ADB,点击,接上USB,果然adb出来了。更要命的是,居然是root。
通过adb,我们拉下来车机内的所有的app进行分析,幸运的还找到了一个解密后的升级包。这下就可以进行静态分析了。
到这里,已经差不多了,还有一个“安装”没有看。
负责移动安全的同学看了下逆向的的“安装”app,发现只要在u盘特定目录下的应用程序就可以进行安装。安装应用也搞定了。
近场攻击
近场的攻击思路比较明确,车机没有蓝牙只有wifi。接入车机的WIIF热点或者让车机接入我的可控的WIFI。然后进行端口扫描。端口扫描只有有限的两个端口在开放。
接触式getshell以后,才对开放了这两个端口的jar进行分析,发现这个socket协议可以写文件,并且没有检查文件名。剩下的套路就比较简单了:
-
还原socket协议格式。
-
编写poc。
不过,只能写文件其实是不够的,非接触式的情况下,我们希望写入的后门能被自动拉起运行。
疑似0day
我们分析了安卓4.4 的开机流程,PMS负责应用程序的安装卸载包管理等。其中:
/data/system/users/userId/Package-restrictions.xml
这个文件记录了应用的enable或者disable的信息。
然后经过分析相关的安卓源代码,发现了一个疑似0day的漏洞,通过写入/修改特定目录的文件,就可以实现写入的应用在系统重启后被拉起的目的。
这里真的不能多说了。
结尾
其实C这台车机的安全在我们看过的车机里面还算一般的,跟国外的比起来差距还不是一点的大。不过比起那些可以远程ssh的车机来说,已经算很好了。
不过关于“缝合怪”这个称呼也一点都没有叫错。系统这块安卓4.4 并不能算是很大的问题,问题在于做二次开发以及车厂自己的debug软件上存在很多的安全隐患。上层的负责导航等软件的厂商的安全水位明显比系统的高出不少,但是沙地起高楼也没什么用处。
所以还是那句话,千里之堤毁于蚁穴。永远不要小看任何一个bug,因为这个bug可能会导致你最后全军覆没。