这篇文章上次修改于 977 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

背景:

随着主机厂安全意识的提高,车联网设备安全性也在不断提升。本篇的车机系统是Android,许多车机都增加了禁止未授权应用安装策略,意味着我们无法安装各种VPN抓包工具了;裁剪了原生Launcher,没有办法直接设置WiFi代理;由于使用较高版本的安卓没办法将自己证书加入证书库;种种原因导致车机流量越来越难抓了。

在这种情况下我们该如何获取车机的流量呢?

思路

手机上常规的抓包是先把burpsuite或者Charles的证书装入系统,再把证书从/data/misc/user/0/cacerts-added拷贝到/etc/security/cacerts/目录,然后使用postern类工具进行代理抓包,亦或再加上使用Xposed、frida绕过证书验证.

仿照手机侧抓包,Android车机侧抓取流量方法如下:

  1. 命令行设置代理
  2. 使用工具替换应用原有证书
  3. 分析应用运行日志,运气好的话能看到完整请求响应日志
  4. 使用肉丝姐的r0capture
  5. 在车机上使用tcpdump或者让车机连接自定义的设备,无差别抓取流量,想方设法拿到会话秘钥或者私钥利用wireshark分析
  6. 分析车机系统的历史日志

验证过程

先定位发包的应用。比如我们想要分析用户中心APP的数据,一顿操作猛如虎,到头来会发现,应用没有发送任何请求或者没有我们想要的请求包。这里需要我们了解Android进程间通信知识点才能比较轻松分析(定位具这里不展开说了)。

分析目标应用,首先确定APP使用了哪种方式验证服务器证书,是采用了严格证书校验,还是证书绑定,还是双向验证。

image-20220518102503703

此处应用使用了程序员最常用的方式,未对证书做任何验证。

验证结果:

  1. 使用objection ssl unpining,命令行设置代理,再抓包,发现找不到我们的目标网段网卡(卒)
  2. 感觉1设置代理都凉了,在用frida把证书加入系统证书路径也没用,没试。
  3. 查看应用运行时日志, 打印了部分请求数据
  4. 使用肉丝姐的r0capture工具进行hook抓取数据,工具能用但抓取的数据不全,没有我们的目标数据,不知道什么原因,可以抓取到会话秘钥,后续有环境了继续debug下看看啥原因。
  5. 没做
  6. 没做

使用思路3查看应用运行时日志,发现了我们想要的数据,虽然能够查看每个接口,但是缺少了完整的headers信息,离我们想要达到burp抓包那种查看请求数据的效果还有不小的差距。

经过逆向分析发现APP通信使用了时下非常流行的RxJava+Retrofit+Okhttp组合,熟悉Android开发的同学应该都知道OKhttp官方提供了LoggingInterceptor 拦截器,在合适的时机我们可以通过该拦截器打印APP所有的请求和响应数据。

使用Retrofit+Okhttp组合模仿目标APP使用方式实现了一个demo,在demo中加入了LoggingInterceptor 拦截器,结果正是我们的预期。 image-20220518102533562

经过对demo验证我们思路是可行的,而且该方案通杀所有证书验证方式

最终抓包方案

我们只要按照开发的思路实现一个LoggingInterceptor 拦截器并加入到retrofit的builder中就行了。

日志拦截器代码:

MyHttpLoggingInterceptor.dex 里有我自定义日志拦截器的代码。

日志拦截器的代码核心是修改了拦截器中日志级别,直接将成员变量level的值修改为设置为Level.BODY

image-20220518102837693

因为直接将成员变量level值改为Leve.BODY,所以在使用MyHttpLoggingInterceptor时就不用调用setLevel方法了,直接new一个MyHttpLoggingInterceptor即可 .image-20220518102853732

Fridahook代码

此处当然选择frida这个神器来完成我们hook动作, frida代码如下:

function hook_okhttp3() {
    Java.perform(function () {

        Java.openClassFile("/data/local/tmp/MyHttpLoggingInterceptor.dex").load();
        var MyInterceptor = Java.use("cool.findme.okhttpdemo.MyHttpLoggingInterceptor");

        var MyInterceptorObj = MyInterceptor.$new();
        var Builder = Java.use("okhttp3.OkHttpClient$Builder");
        console.log(Builder);
        Builder.build.implementation = function () {
            this.addNetworkInterceptor(MyInterceptorObj);
            return this.build();
        };
        console.log("hook_okhttp3...");
    });
}

function main(){
  hook_okhttp3();
}
setImmediate(main);

使用脚本之前:

image-20220518140019753

执行下面命令

frida -U -f cool.findme.okhttpdemo -l /Users/groot/PycharmProjects/frida-agent-example/EvaluationScript/okhttp3/hook_okhttp3.js --no-pause

效果:

image-20220518140128392

总结

总结下车机抓包思路:

  1. 查看应用运行日志,运气好的话能看到完整请求响应日志,也是最省事的
  2. 使用肉丝姐的r0capture看看能不能一把梭或者提取会话秘钥
  3. 使用objection ssl unpining并结合命令行设置代理,再抓包
  4. 使用frida替换应用原有证书并结合命令行设置代理进行抓包,
  5. 分析应用通信依赖库,尝试以开发的视角,逆向开发实现抓取流量,无视单双向的证书验证
  6. 在车机上使用tcpdump或者让车机连接自定义的设备,无差别抓取流量,想方设法拿到会话秘钥或者私钥, 再用wireshark分析
  7. 分析车机系统的残留的历史日志