移动安全:安卓应用 SSL Pinning 绕过技术

1,434 阅读4分钟

什么是 SSL Pinning?

SSL Pinning 是一种安全措施,用于防止应用程序的网络流量被拦截,从而避免中间人攻击(MITM)。简单来说,就是 App 会验证服务器的证书是否是它信任的。如果不是,App 就拒绝连接,这样可以防止有人冒充服务器来窃取数据.

简而言之:只有绕过SSL Pinning,你才能更好地抓包调试。

为什么要绕过 SSL Pinning?

在安全测试中,我们有时需要抓取 App 的网络数据包,分析 App 的行为或者查找漏洞。但是,如果 App 启用了 SSL Pinning,抓包工具就无法正常工作,因为 App 不信任抓包工具的证书. 这时候,我们就需要绕过 SSL Pinning,让抓包工具能够拦截和分析 App 的网络流量.

绕过 SSL Pinning 的方法

绕过 SSL Pinning 的方法有很多,本文介绍一种简单的方法,通过修改 App 的网络安全配置来实现。这种方法不需要 root 权限,也比较容易操作.

实际应用例子

假设你正在测试一个电商 App,你想知道 App 在登录时发送了哪些数据。但是,这个 App 启用了 SSL Pinning,你无法使用抓包工具来查看。这时,你可以使用本文介绍的方法绕过 SSL Pinning,然后使用抓包工具来分析 App 的登录过程,看看是否存在安全问题.

准备工具

  1. apktool:用于反编译和重新打包 APK 文件。
  2. uber-apk-signer:用于签名 APK 文件。

步骤

  1. 反编译 APK

    使用 apktool 反编译 App 的 APK 文件。

    apktool d appname.apk
    

    执行完这个命令后,会生成一个以 App 名称命名的文件夹。

  2. 修改网络安全配置

    打开反编译后的文件夹,找到 network_security_config.xml 文件。这个文件通常位于 /res/xml/ 目录下。如果没有这个文件,就创建一个,并添加以下内容:

    <?xml version="1.0" encoding="utf-8"?>
    <network-security-config>
        <base-config>
            <trust-anchors>
                <certificates src="system" />
                <certificates src="user" />
            </trust-anchors>
        </base-config>
    </network-security-config>
    

    这段代码的作用是告诉 App 信任系统和用户安装的证书[1].

  3. 修改 AndroidManifest.xml

    打开 AndroidManifest.xml 文件,这个文件位于反编译后的文件夹的根目录下。在 <application> 标签中添加以下属性:

    android:networkSecurityConfig="@xml/network_security_config"
    

    如果 network_security_config.xml 文件已经存在,并且 AndroidManifest.xml 文件中已经包含了 android:networkSecurityConfig 属性,可以跳过这一步。

  4. 重新打包 APK

    使用 apktool 重新打包 APK 文件。

    apktool b <application_folder_name>
    

    重新打包后的 APK 文件位于反编译后的文件夹的 /dist 目录下。

  5. 签名 APK

    使用 uber-apk-signer 签名 APK 文件。

    java -jar uber-apk-signer.jar -a /path/to/app.apk
    

    签名后的 APK 文件的名称通常为 <app-name>-aligned-debugSigned.apk

  6. 安装 APK

    将签名后的 APK 文件安装到 Android 设备上.

  7. 设置代理

    在 Android 设备上设置代理,将网络流量转发到抓包工具。

    • 打开 Burp Suite,在 "Proxy Settings" 选项卡中,点击 "Add" 按钮,添加一个新的代理监听器,选择 "All interfaces"。
    • 在电脑上打开 CMD/Terminal,输入 ipconfig (Windows) 或 ifconfig (Linux/Mac) 命令,查找 IPv4 地址。
    • 在 Android 设备上,打开 Wi-Fi 设置,找到连接的 Wi-Fi,选择 "修改网络",勾选 "显示高级选项",将代理设置为 "手动",输入电脑的 IPv4 地址和 Burp Suite 的代理端口。
    • 在 Android 设备上,打开浏览器,访问 http://burphttp://<电脑的IPv4地址>:<Burp Suite的代理端口>,如果看到 Burp Suite 的页面,说明代理设置成功.
  8. 安装证书

    将 Burp Suite 的证书安装到 Android 设备上。

    • 在 Burp Suite 中,选择 "Proxy" -> "Options",点击 "Import / Export CA Certificate" 按钮,选择 "Export Certificate in DER format",保存为 .cer 文件。
    • .cer 文件复制到 Android 设备上,打开 "设置",搜索 "证书",点击 "安装证书",选择 .cer 文件进行安装.
  9. 开始抓包

    打开修改后的 App,Burp Suite 就可以拦截和分析 App 的网络流量了.

注意事项

  • 这种方法可能无法绕过所有 App 的 SSL Pinning,因为有些 App 可能使用了更严格的 SSL Pinning 技术.
  • 修改 APK 文件可能会导致 App 无法正常运行,或者存在安全风险。