毕业后参加工作,做的第一件事就是这个,目前算是告一段落。回想起来感觉还是挺有纪念意义的。学校期间因为做的模糊测试,纯软件方面,所以一开始搞硬件走了很多弯路,陆陆续续搞了近一年,虽然是事后,其实想了想当时的过程,感觉要是再做类似于的估计能省很多时间,当时的经历还是挺有意思的。加上最近看脱口秀有点上头,老是想写点东西. 正好可以自己总结一下,要是有幸有人看到,并且觉得有些用的话那是极好的。
话说当年刚毕业,加入玄武。做点什么呢??
xxx: 这有个快充安全研究可以做
我:快充安全?(说实话,平时背着ThinkPad那坨大电源,用着5V/1A的手机充电器,还真不知道快充是啥…..)
xxx: 就是xxxxx
我:哦哦 就是搞充电器啊(其实当时内心贼迷惑,充电器也能搞,真的特佩服tk的脑洞,第一意识就是难道是用锤子。。。本着初出牛犊不怕虎,顶着好奇心~,然后就是…)可以可以,有意思
然后我就认领了 www.chongdiantou.com 兴冲冲的回到工位。”上充电头网,掌握一手充电设备评测拆解信息,无论您是想买充电器还是想做充电器,充电头网都是您的不二选择。充电头网,实在居家旅行,直播带货,必备良站“(最近真的是被脱口秀大会的蓝河绵羊奶给洗脑了…… 一度有想转行写段子的念想……)。回归正传,这不是打广告,的确是充电头网在整个研究过程中帮助很大。
划水阶段
其实比较专业的术语应该叫做”研究目标与攻击面分析“。买了个某果的充电器开始”研究“,当然除了感觉真贵,手感不错,质量很好,很重很结实外,还是发现了有那么一个充电口的。所以说在不锤掉它的前提下,唯一的攻击入口就是这个小小的typec口,然后开始了很常规的调研流程了。
嗯,充电器里面有个芯片,里面有固件。
嗯,快充是协议的,快充协议有QC,VOOC…… 然后就是主流的USB PD
嗯,只有USB PD是包含数据协议的,有数据包的,协议标准是开源的,通过typec接口传输
方向确定了,usb pd协议是入口。开始啃USB PD协议文档,第一阶段先弄清楚都是咋回事。当看了协议文档之后,其实就很好奇人家充电器到底有没有实现这个,或者是不是按照这个标准实现的,其实都不好说,就一股脑想看看能不能抓到包看看到底是什么个情况。
然后就在充电头网上扒拉,发现他们开了个淘宝店,在卖一个测试设备Power-Z,其中有一款Power-Z KM001 Pro还带一个客户端软件,能够看到一些信息。当时还有个小插曲,买了之后,给发错货了,发了一个更贵的过来了,不知道咋用,其实当时也没想这么多,毕竟一个便宜的都支持,贵的就不用说了,然后在他们的测试群里问,结果不支持客户端软件。。。。客户端软件是这样的。有专门的USB PD协议包显示,但有限,只是一些比较基本的,也支持发一些比较特定的包出去。初期基本够用了,好歹是看到了实际的包长啥样了,一些也和协议对上来了。
Fuzz一下?
开启第二阶段模式,他这个power-z是有个sniffer模式和一个monitor模式。一开始我是想看看某果的充电器和笔记本之间都有啥消息,所以采用monitor模式,然后相当尴尬,因为USB PD数据传输速度很快,我猜这个设备设计上是先把数据存在硬件设备的RAM里面,然后再通过USB端口发给电脑软件,但是由于太快,发现连续的几次通信之后直接崩了。相当尴尬。
然后想着还是盲测一下吧。毕竟USB PD协议并不是很复杂。就回到了上一个问题了,软件所支持发送的包就特定的那么几个,其实一开始是比较复杂的,所以就去找开发者,问问能不能给添加一个这么类似自定义任意包的功能。然后开发者说“你这个想法很好,我考虑后续添加”。 这一听就知道是没戏了,反正我也没拉下脸要一下源码,虽然知道结果也很明显。。。
只能自给自足了,使用ida+windbg“学习”了一下这个软件,软件上位机和下位机power-z的通信也就很清晰了。那么我就可以发任意包了,只要测试控制一下速度,power-z还是可以用的。发包-回复。 只剩下一个问题了,怎么知道有没有崩?
我发现USB PD受电端是可以发送get source cap来获取充电器的供电能力的,当然崩了之后,我发送就肯定是没有回应了,所以每次发送一个测试包后,再发一个get source cap来判断是不是崩了,然后把所有的包都记录下来。因为协议规定有部分是可以厂商自定义的,所以fuzz空间是很大的,我自己设置了一些比较特殊的,比如全0,全F类似这种,然后部分随机,反正是很常规的套路。让他在那跑着,然后我就默默啃文档。下面也不记得是哪个阶段的截图了,大概样子是这样的。
结果嘛….. 无论我如何fuzz, 它自岿然不动. 然后分析了下回应包, 发现”这充电器有东西”. 就分析捣鼓,猜测,测试,把部分自定义的包的结构理清楚了,猜测哪几位干啥用的, 然后是怎么处理,怎么回. 最后得出结论…… 搞不了啊…… 过滤得太狠了, 连个信息泄露都没法弄. (后话, 后面把固件弄出来了,那部分的确和我猜测的一致).
然后怎么弄?
其实前面fuzz都是啃老本,因为以前做过fuzz,比较熟悉一点. 但其实缺陷也很明显, 首先是fuzz空间太大,基本是没法所有试一试的,就算跑很长一段时间,总之枚举不靠谱(主要还有个问题,power-z跑久了有时候就没法用了……) . 其次就是我这是一个个包fuzz,充电器协议内一般都有个状态机的,要是包之间关联,基本上就gg了.
然后回到以前的问题,power-z的monitor是可以监听的,只是跑着崩了,我并不是很清楚某果自己到底干了些啥. 但目前也没啥其他好用的设备了…… 所以目前最省事的就是先看看它自己和自己设备交互到底干了些啥事情.
在偶然的机会知道了逻辑分析仪,其实搞硬件的是很清楚这个东西. 当时我一听这个东西,感觉很高级的感觉,主要是被它的名字给唬住了. 逻辑, 分析仪. 一听很高大上的样子.想着会相当复杂. 当时正好实验室的某个角落有个古老的逻辑分析仪(真的是被这个东西给坑惨了…… 其实还是自己没弄清楚……) , 为了实验一下这个神奇的玩意,买了个全套的金沙滩51单片机开发板,主要是因为代码,视频之类的都有. 然后烧了个串口通信的程序进去,用逻辑分析仪一抓, 嗯, 真香……
下一步就是抓某果充电器和某果笔记本之间的通讯了, 想着先抓抓看看,至少得看到点东西, 然后就调阈值电压, 反正它那个就那么几个选项,不管了,一个个试一下, 然后就是 ——————————————-, 一条特别平滑的直线……. 然后就有点懵了…… 这只能说明阈值电压有问题了, 开始继续啃USB PD文档,以前都是跳过物理传输那块看的…..
嗯, BMC, 4B5B编码, 然后比较曲折的买了个LA5016, 调节阈值电压到0.45V, 可以了… 一开始图简单,把数据导出到txt,然后写了个python脚本来解析协议,看起来是这个样子的.
这个的后续话,为了方便 单独写了一个解析插件. 对后面一些分析帮助还是很大的. 长这么个样子……
然后回归正题,抓到了一些交互, 发现其实也没啥用….. 就是获取个序列号,版本信息啥的. 基于这个也fuzz了一下,也没啥好的效果.
主要还是因为power-z的确不太好用, 后面找空基于stm32g0开发了一款, 封装了一层python接口,用起来”真香”.
长这个样子…..
用起来这个样子…..
硬件玩法?
中途因为一些事情耽误了,同时也学习了硬件相关知识. 然后回过头来,可以拆了来弄了. 其实早之前已经拆了一个,当时我去试试看看还能不能正常用的时候,因为电还没放完,用手摸了一下,电得我一激灵.有点慌了…… 再加上当时对硬件还完全不了解,所以搁置了.
开始直接拆了弄,主要是还是因为在充电头网上看到了很多的拆解,然后对相关芯片也了解了很多,加上在一些开发者论坛一直混着,感觉也比较有底了.
然后是一套硬件相关搞法,其实也是比较常规的方法,只是有一些坑. 最后也弄出来了固件. 逆向分析,更新协议,漏洞,固件修改等等这一套了.
后续
能控制了,能干什么? 这是个脑洞大开的过程…… 各种尝试吧,虽然最后是以”BadPower”的方式呈现. 但中间还是有很多小插曲.
一开始我测试的时候, 当时还没想太多, 只是想验证一下我修改的有没有效果, 而当时周围也没啥东西,然后就很悲剧了,把刚给发了一个智能音箱给烧了……
然后就是……
把MacBook的主板烧了……
把pixel手机充电电路给弄坏了,充不了电了……
……
“那些设备没有意识到的是… 危险正在一步 一步地向它靠近……”