移动端抓取\解密SSL流量

最近一段时间有需求要抓取移动端通过SSL加密的HTTPS和WebSocket流量,使用WireShark中Lua插件进行私有协议的解包和统计.网上找到的大多是解密浏览器SSL流量的教程,通过设置环境变量的方式导出浏览器握手过程中产生的ClientRandom和(Pre)MasterKey到Wireshark来解密,针对移动端的SSL流量解密少有涉及,通过对一些工具及OpenSSL的了解,有几种方法可以做到在移动端解密通过SSL传输的流量,在这里记录下来。

  1. 搭建代理服务器,在移动端信任伪服务器即代理的证书。代理作为伪客户端与服务器握手,作为伪服务器与客户端握手,同时需要解决Sni等问题,其中原理在MitmProxy的文档中有详细的说明,见https://docs.mitmproxy.org/stable/concepts-howmitmproxyworks/,其实大多移动端可用的抓包工具例如Fiddler、Charles等都是采用这种方式实现的。这种方式可用的工具有SSLsplit、MitmProxy。这两个工具都可以将代理与真实服务器、代理与客户端握手过程中的MasteerKey导出到文件,实现与浏览器流量相同的解密方式。其中MitmProxy地址:https://mitmproxy.org/,SSLsplit地址:https://www.roe.ch/SSLsplit.

  2. 针对自己的移动端App,可以在客户端调用OpenSSL握手的过程中使用如下代码将ClientRandom和MasterKey导出:

 /*   * Generates a NSS key log format compatible string containing the client
     * random and the master key, intended to be used to decrypt externally
     * captured network traffic using tools like Wireshark.
     *
     * Only supports the CLIENT_RANDOM method (SSL 3.0 - TLS 1.2).
     *
     * https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS/Key_Log_Format
     */
    char* ssl_ssl_masterkey_to_str(SSL *ssl)
    {
        char *str = NULL;
        int rv;
        unsigned char *k, *r;
#if OPENSSL_VERSION_NUMBER >= 0x10100000L
        unsigned char kbuf[48], rbuf[32];
        k = &kbuf[0];
        r = &rbuf[0];
        SSL_SESSION_get_master_key(SSL_get0_session(ssl), k, sizeof(kbuf));
        SSL_get_client_random(ssl, r, sizeof(rbuf));
#else /* OPENSSL_VERSION_NUMBER < 0x10100000L */
        k = ssl->session->master_key;
        r = ssl->s3->client_random;
#endif /* OPENSSL_VERSION_NUMBER < 0x10100000L */
        rv = asprintf(&str,
                      "CLIENT_RANDOM "
                      "%02X%02X%02X%02X%02X%02X%02X%02X"
                      "%02X%02X%02X%02X%02X%02X%02X%02X"
                      "%02X%02X%02X%02X%02X%02X%02X%02X"
                      "%02X%02X%02X%02X%02X%02X%02X%02X"
                      " "
                      "%02X%02X%02X%02X%02X%02X%02X%02X"
                      "%02X%02X%02X%02X%02X%02X%02X%02X"
                      "%02X%02X%02X%02X%02X%02X%02X%02X"
                      "%02X%02X%02X%02X%02X%02X%02X%02X"
                      "%02X%02X%02X%02X%02X%02X%02X%02X"
                      "%02X%02X%02X%02X%02X%02X%02X%02X"
                      "\n",
                      r[ 0], r[ 1], r[ 2], r[ 3], r[ 4], r[ 5], r[ 6], r[ 7],
                      r[ 8], r[ 9], r[10], r[11], r[12], r[13], r[14], r[15],
                      r[16], r[17], r[18], r[19], r[20], r[21], r[22], r[23],
                      r[24], r[25], r[26], r[27], r[28], r[29], r[30], r[31],
                      k[ 0], k[ 1], k[ 2], k[ 3], k[ 4], k[ 5], k[ 6], k[ 7],
                      k[ 8], k[ 9], k[10], k[11], k[12], k[13], k[14], k[15],
                      k[16], k[17], k[18], k[19], k[20], k[21], k[22], k[23],
                      k[24], k[25], k[26], k[27], k[28], k[29], k[30], k[31],
                      k[32], k[33], k[34], k[35], k[36], k[37], k[38], k[39],
                      k[40], k[41], k[42], k[43], k[44], k[45], k[46], k[47]);

        return (rv < 0) ? NULL : str;
    }

保存为文件在WireShark设置SSLKEYLOGFILE即可。

### 配置Charles仅捕获移动端流量 为了确保Charles只捕获移动设备的流量而不记录其他设备或计算机本身的流量,可以采取特定设置来实现这一目标。 #### 设置Charles监听指定IP地址 默认情况下,Charles会监听所有网络接口上的流量。通过修改Charles的代理服务器设置,可以选择性地让其仅监听来自移动设备的流量。进入`Proxy`菜单下的`Proxy Settings...`选项,在这里可设定本地代理服务器使用的IP地址和端口。对于只想捕捉移动设备的数据流而言,应该取消勾选`Enable transparent HTTP proxying`透明代理功能[^1]。 #### 移动设备配置 接着按照常规流程完成移动设备与电脑之间的Wi-Fi共享连接,并确认两者处于同一局域网内。随后在手机浏览器里输入`chls.pro/ssl`下载安装SSL证书以便能够解密HTTPS加密通信内容;同时也要保证手机系统的HTTP(S)代理指向运行着Charles软件那台主机对应的内部IP以及8888这个标准端口号[^3]。 #### 过滤不必要的流量 回到Charles界面之后,利用工具栏中的`Recording Settings`按钮打开录制条件对话框。在此处可以通过定义访问范围(如限定域名)、排除某些类型的资源加载等方式进一步精确控制哪些请求会被截取下来分析处理。比如添加一个包含localhost或者127.0.0.1模式到忽略列表中就可以防止本机发出的任何http(s)调用被误录进去。 ```bash # 假设你的电脑 IP 地址为 192.168.1.100, 则需确保手机 Wi-Fi 的代理设置如下: HTTP Proxy Host: 192.168.1.100 Port: 8888 ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值