【问题标题】:How to execute MITM attack on an android phone when there are some unknown protection?当有一些未知的保护时,如何在安卓手机上执行 MITM 攻击?
【发布时间】:2022-08-02 16:37:41
【问题描述】:

我在尝试对我的实验对象执行“中间人”攻击时遇到了一些困难:https://tiktok.en.uptodown.com/android

我在我的电脑上设置了代理,我通过它传递我的手机的流量。当然,我已经在我的根手机上安装了这个代理的证书作为系统一,我已经解密了 ssl 流量,但不是来自我的应用程序。

我认为有 SSL-pinning,或者这个应用程序使用了一个特定的内置证书。我尝试使用 frida 并使用这些脚本运行应用程序,这些脚本应该禁用 ssl-pinning 和 root 检查(不成功):

https://codeshare.frida.re/@pcipolloni/universal-android-ssl-pinning-bypass-with-frida/ https://codeshare.frida.re/@akabe1/frida-multiple-unpinning/ https://codeshare.frida.re/@dzonerzy/fridantiroot/

还有一些我现在找不到的。

在此应用程序的互联网安全配置中,我没有看到任何我需要的东西(见下文)。我认为,当不在可调试模式下(在生产中)时,这应该使用系统证书传递流量

<?xml version=\"1.0\" encoding=\"utf-8\"?>
<network-security-config>
    <base-config cleartextTrafficPermitted=\"true\">
        <trust-anchors>
            <certificates overridePins=\"true\" src=\"system\" />
        </trust-anchors>
    </base-config>
    <debug-overrides>
        <trust-anchors>
            <certificates src=\"user\" />
        </trust-anchors>
    </debug-overrides>
</network-security-config>

我还尝试使用 apktool 反编译应用程序并将我的证书添加到此配置中,但无法将其重新构建(即使没有更改,它也无法编译,可能是 apktool 错误)。

最有趣的是在模拟器上运行应用程序时,我可以看到 SSL 流量被解密。但是这个解决方案对我不起作用,因为这个应用程序的工作方式不同(例如,我在设置中没有“内容偏好”按钮)。

我的问题是,我只想知道我也可以深入研究的任何事情,也许是一些有做过类似事情经验的人(逆向工程师或安卓开发人员)的案例。或者他们只是有一些想法可能会帮助我找到解决方案。也许还有其他一些我不知道也没有在互联网上找到的防止 MITM 攻击的方法。谢谢。

  • 所以取消固定脚本只有在应用程序没有被混淆的情况下才有效。例如,如果使用 OkHttp 库并且它是 cert pinner,则在混淆后很难识别 pinning。我是你我会在 Jadx 中反编译应用程序并尝试识别与网络相关的方法并使用frida-trace 挂钩它们。比较使用和不使用活动 mitm 代理的跟踪以查看差异,然后逐步了解类和方法。
  • 在 Jadx 中,我会检查以 java.security.cert.Certificatejavax.security.cert.X509Certificate 作为参数的方法。希望这将限制要查看的方法的数量。
  • 您是看到加密流量还是根本看不到流量?

标签: android ssl proxy reverse-engineering frida


【解决方案1】:

由于我找到了解决方案,我正在回答我自己的问题并总结我发现的所有内容。

为了成功获取具有证书固定的应用程序的 API 调用,您需要首先检查它是否真的具有证书固定:

  1. 在网络安全配置中搜索 Pin Digest:https://developer.android.com/training/articles/security-config#CertificatePinning 你也可以grep所有反编译的文件,搜索&lt;pin digest=""&gt;标签。如果你发现了什么,你可以删除这些设置并重新编译你的应用程序。就我而言,我什么也没找到。

  2. 您还可以检查 logcat 日志 (adb logcat) 以查找显示“证书验证失败”或“证书固定失败”或类似内容的内容,这只是示例。

  3. 如果您看到您的应用程序的请求没有被解码但其他请求被解码,这意味着您的环境是好的,并且应用程序确实有一些验证,这使得它不信任您的代理证书。

    绕过这种保护的方法怎么样:

    1. 有时,较低版本的应用程序不支持 SSL pinning,因此您可以尝试查找旧版本。不是我的情况。我需要最新的

    2. 如果网络安全配置文件有 pin 摘要,则修改它。您可以尝试删除所有这些并使用apktool 重新编译应用程序。也不是我的情况。

    3. 使用弗里达。我在我的问题中固定了一些脚本。他们可以帮助您绕过 SSL pinning。正如罗伯特在我的问题下所说,您还可以尝试寻找负责发送请求和获取响应的方法。您可以编写脚本来侦听函数并打印参数或返回值。这不是太难。它帮助了我,但我只设法得到请求,而不是响应。我认为,如果我找到一种方法来获得回应,这对我来说是最好的方法

    4. 如果您的应用程序具有本机功能,请尝试查找库。你可能会注意到一些奇怪的事情。在我的例子中,有一个自定义的 cronet 库,它有自己的 SSL 验证实现。您可以使用radare2(或 IDA Pro,但它不是免费的)来修补 .so 库。这是一个非常简单和有用的工具。这就是我的情况。我花了几天时间更改我发现的奇怪函数的返回值,它完成了它的工作,但我仍然无法查看某些请求的内容,但它们很少,所以这对我来说不是一个大问题。

【讨论】:

    最近更新 更多