Android Android Advanced: un artículo lo lleva a comprender la captura de paquetes y la anticaptura

Hoy, presentaré principalmente la captura de paquetes de Android y la prevención de la captura de paquetes.

Presentar dos herramientas de captura de paquetes, Profiter y Charles.

Entorno de la herramienta:

Estudio Android 4.2.2

TeléfonoGoogle Pixel 3XL Android 11

Use la herramienta Profiler para capturar paquetes

Conecte su teléfono a su computadora y abra el Perfilador de Android Studio

NetWork Inspector para Android Studio White Fox e inferior está en Profler, y NetWork Inspector para Bumblebee está en App Inspection.

Luego, cuando la aplicación acceda a la red, aparecerá un mensaje como este:

Seleccionamos la fluctuación y podremos ver la información solicitada:

Luego, después de hacer clic en la información de la interfaz, podemos ver los detalles de la solicitud:

De esta forma, podemos capturar fácilmente la información de red de nuestra aplicación a través del Profiler de AndroidStudio.

Use la herramienta Charles para capturar paquetes

1. Instalar el certificado

Primero descargue Charles, ábralo y haga clic en Ayuda->Proxy SSL -> Instalar certificado raíz de Charles para instalar el certificado raíz

Luego haga doble clic en el certificado para confiar

La configuración en la computadora se completa y luego configura el cliente

Forma 1:

El terminal móvil descarga el certificado a través del navegador.

En el teléfono móvil, configure el proxy para conectarse a wifi, configure un proxy manual, configure la dirección del proxy solicitada por charles, y luego charles tendrá un aviso:

Entonces estamos de acuerdo.

Luego ingrese chls.pro/ssl en el navegador para descargar el certificado y, una vez completada la descarga, instálelo; pero a veces este método no se puede instalar y puede instalarlo a través del método 2 .

Forma 2:

Guarde el certificado en su computadora a través de Ayuda-> Proxy SSL -> Guardar certificado raíz de Charles

Luego cárguelo en el teléfono móvil, haga clic en Configuración - Seguridad - Cifrado y Credenciales - Instalar certificado - Certificado CA, y seleccione el certificado que acabamos de instalar para instalarlo.

En este punto, hemos completado los pasos para instalar el certificado.

2.抓包

此时,当我们进行网络访问 的时候,可以在charles上面看到我们访问的数据了

我们可以通过左下角的Filter 进行地址过滤,找到我们想看的网络数据。

防止抓包

前面讲到,默认的 Android Https 配置下,只要使用 Android7.0 以下的手机、或者找个 Root 设备安装把用户证书(比如charles证书)想办法搞进系统证书那部分,就可以抓包了。这对于黑产来说也忒忒忒简单了。那么怎么防止呢?

答案是配置你信任的网站证书或者配置信任的认证链。

1.Android 官方配置信息证书 (声明:这种方法只能防篡改设备的根证书,防不了使用 Android7.0 以下的手机。)

比如你可以像这样把你信任的网站的证书给搞下来

步骤①:点击域名旁边锁的图标,弹出框里面点「证书」

mac系统,对着证书那个图标拖动到某个文件夹里。这样你就能得到一个HTTPS的里面的SSL里面的非对称加密算法的公钥。

步骤②:放进 res/raw 文件夹里,在network_security_config.xml 里写上相关配置

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>

    <!-- 这个是全局的基础的配置 -->
    <base-config>
        <trust-anchors>
            <!-- 如果整个base-config都不写,就等于是<certificates src="system" /> -->
            <!-- 这里写全局基础配置,只信任下面某几个证书 -->
            <certificates src="@raw/zhihu" />
            <certificates src="@raw/baidu" />
        </trust-anchors>
    </base-config>

    <!-- 如果只对某些涉及数据安全的私密域名进行保护,可以针对某个域名,只信任某几个证书 -->
    <domain-config>
        <domain includeSubdomains="true">zhihu.com</domain>
        <trust-anchors>
            <certificates src="@raw/zhihu" />
            <certificates src="@raw/tencent" />
        </trust-anchors>
    </domain-config>

    <debug-overrides>
        <trust-anchors>
            <certificates src="user" />
        </trust-anchors>
    </debug-overrides>

</network-security-config>
复制代码

以上就是 Android 官方推荐的做法。

——————————————— 分割线 ———————————————

2. OkHttp 配置信任认证链 (声明:这种方法是全方面防御,在 Android7.0 以下设备也能起作用)

步骤①:写一个 CertificatePinner 的配置

其中的 add方法两个参数。第一个参数是网址的域名host,第二个是sha256的证书。证书我们目前不清楚,先输入这么一段字符串。使用这么一段错误的配置运行后将会报错,然后在日志里得到正确的配置信息。

注意第一个参数不要包含协议,也不要省略部分域名,错误示例 「news-at.zhihu.com」、「zhihu.com」。

第二个参数是个假证书识别串,但是有效的,我测试时候乱输入了一串「sha256/wrong」没有触发到搜想要的结果。

public class ZhihuHttp {

    public static final String ZHIHU_BASE_URL = "https://news-at.zhihu.com/api/";
    private static final ZhihuHttp zhihuHttp = new ZhihuHttp();
    private OkHttpClient okHttpClient;

    private ZhihuHttp() {
        OkHttpClient.Builder builder = new OkHttpClient.Builder();
        builder.connectTimeout(10, TimeUnit.SECONDS);
        // 只信任网站对应的证书
        CertificatePinner certificatePinner = new CertificatePinner.Builder()
                .add("news-at.zhihu.com", "sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=")
                .build();
        builder.certificatePinner(certificatePinner);
        okHttpClient = builder.build();
    }
    public static ZhihuHttp getZhihuHttp() {
        return zhihuHttp;
    }
    public void getDailiesWithCallback() {
        Request request = new Request.Builder()
                .url(ZHIHU_BASE_URL + "4/news/latest")
                .build();
        okHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(@NotNull Call call, @NotNull IOException e) {
                Log.e("YAO", "ZhihuHttp.java - onFailure() ----- e:" + e.toString());
                e.printStackTrace();
            }
            @Override
            public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
                Log.e("YAO", "ZhihuHttp.java - onResponse() ----- :" + response.toString());
            }
        });
    }
}
复制代码

步骤②:执行代码后报错。搜索关键字,我们能得到这么一串报错

Subscriber onError() : javax.net.ssl.SSLPeerUnverifiedException: Certificate pinning failure!
  Peer certificate chain:
    sha256/f5fNYvDJUKFsO51UowKkyKAlWXZXpaGK6Bah4yX9zmI=: CN=*.zhihu.com,OU=IT,O=智者四海(北京)技术有限公司,L=北京市,C=CN
    sha256/zUIraRNo+4JoAYA7ROeWjARtIoN4rIEbCpfCRQT6N6A=: CN=GeoTrust RSA CA 2018,OU=www.digicert.com,O=DigiCert Inc,C=US
    sha256/r/mIkG3eEpVdm+u/ko/cwxzOMo1bk4TyHIlByibiA5E=: CN=DigiCert Global Root CA,OU=www.digicert.com,O=DigiCert Inc,C=US
  Pinned certificates for news-at.zhihu.com:
    sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
复制代码

这报错的意思是。现在访问这个链接的认证链是 Peer certificate chain 下面的3个sha256。

「sha256/f5fNYvDJUKFsO51UowKkyKAlWXZXpaGK6Bah4yX9zmI=」 「sha256/zUIraRNo+4JoAYA7ROeWjARtIoN4rIEbCpfCRQT6N6A=」 「sha256/r/mIkG3eEpVdm+u/ko/cwxzOMo1bk4TyHIlByibiA5E=」 链的含义是,第一个sha256对应的证书由第二个sha256对应的证书认证,第二个sha256对应的证书又第三个sha256对应的证书认证。

在代码里配置的用于「news-at.zhihu.com」域名的认证 sha256 期望是 「sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=」

因为两者对应不上,所以请求失败。然而通过这个方法,我们得到正确的sha256,下面就拿这几个正确的sha256来配置。

步骤③:配置正确 sha256

CertificatePinner certificatePinner = new CertificatePinner.Builder()
        //正常请求下的证书验证链路
        .add("news-at.zhihu.com", "sha256/f5fNYvDJUKFsO51UowKkyKAlWXZXpaGK6Bah4yX9zmI=")//CN=*.zhihu.com,OU=IT,O=智者四海(北京)技术有限公司,L=北京市,C=CN
        .add("news-at.zhihu.com", "sha256/zUIraRNo+4JoAYA7ROeWjARtIoN4rIEbCpfCRQT6N6A=")//CN=GeoTrust RSA CA 2018,OU=www.digicert.com,O=DigiCert Inc,C=US
        .add("news-at.zhihu.com", "sha256/r/mIkG3eEpVdm+u/ko/cwxzOMo1bk4TyHIlByibiA5E=")//CN=DigiCert Global Root CA,OU=www.digicert.com,O=DigiCert Inc,C=US
        .build();
复制代码

配置后,这个域名的请求就不能被抓包了。因为开启抓包后,根证书是 charles 的公钥,跟期望的 sha256 匹配不上。 一个很重要的点是,其实我们可以不用把3个 sha256 都加上。匹配逻辑是任意一个 sha256 匹配上请求就可以通过了。所以其实可以这么写。

CertificatePinner certificatePinner = new CertificatePinner.Builder()
        //正常请求下的证书验证链路
        .add("news-at.zhihu.com", "sha256/f5fNYvDJUKFsO51UowKkyKAlWXZXpaGK6Bah4yX9zmI=")//CN=*.zhihu.com,OU=IT,O=智者四海(北京)技术有限公司,L=北京市,C=CN
        .build();
复制代码

域名hostname 支持通配符,可以参考OkHttp CertificatePinner部分

验证结果 按照 OkHttp 官方指导配置完后,使用 charles 抓包看看还能不能在 Android 7.0 以下系统抓到包。 验证结果,不能抓包,会出现一个报错:

Subscriber onError() : javax.net.ssl.SSLPeerUnverifiedException: Certificate pinning failure!
  Peer certificate chain:
    sha256/dVUJFtUhQtJki5t0/j+hMYzTgtVkETqjsogUuyquPPo=: CN=*.zhihu.com,OU=IT,O=智者四海(北京)技术有限公司,L=北京市,C=CN
    sha256/54ZQa+M6vq6DhdR7DLkc1X6fWmVEZ6wLZaaYwoR4Uvw=: C=NZ,ST=Auckland,L=Auckland,O=XK72 Ltd,OU=https://charlesproxy.com/ssl,CN=Charles Proxy CA (2 十月 2017\, YaodeMacBook-Pro.local)
  Pinned certificates for news-at.zhihu.com:
    sha256/f5fNYvDJUKFsO51UowKkyKAlWXZXpaGK6Bah4yX9zmI=
    sha256/zUIraRNo+4JoAYA7ROeWjARtIoN4rIEbCpfCRQT6N6A=
    sha256/r/mIkG3eEpVdm+u/ko/cwxzOMo1bk4TyHIlByibiA5E=
复制代码

可以看到现在访问这个链接的认证链是 Peer certificate chain 下面的两个sha256。 「sha256/dVUJFtUhQtJki5t0/j+hMYzTgtVkETqjsogUuyquPPo=」 「sha256/54ZQa+M6vq6DhdR7DLkc1X6fWmVEZ6wLZaaYwoR4Uvw=」 报错的信息里,第二个 sha256 冒号后面,显示这串字符来自我的 charles 公钥。

对比 未使用 和 使用 抓包的报错信息,发现第一个 sha256 都是来自于知乎的公钥,但两个的 sha256 是不一样的。

//未开启抓包
sha256/f5fNYvDJUKFsO51UowKkyKAlWXZXpaGK6Bah4yX9zmI=: CN=*.zhihu.com,OU=IT,O=智者四海(北京)技术有限公司,L=北京市,C=CN
//开启抓包
sha256/dVUJFtUhQtJki5t0/j+hMYzTgtVkETqjsogUuyquPPo=: CN=*.zhihu.com,OU=IT,O=智者四海(北京)技术有限公司,L=北京市,C=CN
复制代码

一开始我一直以为这一串东西是SSL公钥进行一次hash算法得到的字符串。后面观察后发现不是。 这是两个公钥在不同 「中间证书认证」-「中间证书认证」……「根证书认证」这种认证体系下的一个hash串。

所以如果开启抓包,那么他对应的根证书是 charles 的公钥,得出的第一个来自知乎证书的 sha256 就会有所不同。

warning: 配置信任某个具体证书一定要与服务器开发或运维沟通好,因为如果服务器进行了证书替换而App没有更新到最新证书,App的请求将会失效。如果开启的是全部域名的证书配置,意味着你连应用内升级或者热更新都用不了,绝对是重大事故。

还有什么骚操作

上面讲到我们配置到工程代码里的是 网站的公钥(任何人都可以随意下载)

根据HTTPS的原理,公钥和私钥的原理,其实完全可以在代码里配置上开发者的 charles 公钥(只针对某台具体的笔记本,charles 为它生成的一对公钥私钥)。因为没人能根据公钥能破解出对应的私钥。 所以如果在在 app 里配上我们某部电脑 charles 公钥,以后就可以用那个电脑抓正式环境正式域名的请求了。比如工程加上公司的公用开发机的 charles 公钥,或者核心App测试大佬的 charles 公钥。

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>

    <!-- 这个是全局的基础的配置 -->
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <!-- 如果整个base-config都不写,就等于是<certificates src="system" /> -->
            <!-- 这里写全局基础配置,只信任下面某几个证书 -->
            <certificates src="@raw/zhihu" />
            <certificates src="@raw/yao_charles" />
        </trust-anchors>
    </base-config>

    <debug-overrides>
        <trust-anchors>
            <certificates src="user" />
        </trust-anchors>
    </debug-overrides>

</network-security-config>
复制代码

使用OkHttp的配置的方法,这么写:

// 只信任网站对应的证书
CertificatePinner certificatePinner = new CertificatePinner.Builder()
        //正常请求下的证书验证链路
        .add("news-at.zhihu.com", "sha256/f5fNYvDJUKFsO51UowKkyKAlWXZXpaGK6Bah4yX9zmI=")//CN=*.zhihu.com,OU=IT,O=智者四海(北京)技术有限公司,L=北京市,C=CN
        .add("news-at.zhihu.com", "sha256/zUIraRNo+4JoAYA7ROeWjARtIoN4rIEbCpfCRQT6N6A=")//CN=GeoTrust RSA CA 2018,OU=www.digicert.com,O=DigiCert Inc,C=US
        .add("news-at.zhihu.com", "sha256/r/mIkG3eEpVdm+u/ko/cwxzOMo1bk4TyHIlByibiA5E=")//CN=DigiCert Global Root CA,OU=www.digicert.com,O=DigiCert Inc,C=US

        //charles 抓包下的配置
        .add("news-at.zhihu.com", "sha256/dVUJFtUhQtJki5t0/j+hMYzTgtVkETqjsogUuyquPPo=")//CN=*.zhihu.com,OU=IT,O=智者四海(北京)技术有限公司,L=北京市,C=CN
        .add("news-at.zhihu.com", "sha256/54ZQa+M6vq6DhdR7DLkc1X6fWmVEZ6wLZaaYwoR4Uvw=")//C=NZ,ST=Auckland,L=Auckland,O=XK72 Ltd,OU=https://charlesproxy.com/ssl,CN=Charles Proxy CA (2 十月 2017\, YaodeMacBook-Pro.local)
        .build();
复制代码

Supongo que te gusta

Origin juejin.im/post/7076410706488197151
Recomendado
Clasificación