Exploiting a debuggeable application

利用可调试应用程序

支持 HackTricks

绕过 root 和可调试检查

本节内容是来自帖子 https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0 的总结。

使 Android 应用可调试并绕过检查的步骤

使应用可调试

内容基于 https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0

  1. 反编译 APK:

  • 使用 APK-GUI 工具反编译 APK。

  • android-manifest 文件中插入 android:debuggable=true 以启用调试模式。

  • 重新编译、签名并进行 zipalign 处理修改后的应用程序。

  1. 安装修改后的应用程序:

  • 使用命令: adb install <application_name>

  1. 检索包名:

  • 执行 adb shell pm list packages –3 列出第三方应用程序并找到包名。

  1. 设置应用以等待调试器连接:

  • 命令: adb shell am setup-debug-app –w <package_name>

  • 注意: 每次启动应用程序之前必须运行此命令,以确保它等待调试器。

  • 为了持久性,使用 adb shell am setup-debug-app –w -–persistent <package_name>

  • 要移除所有标志,使用 adb shell am clear-debug-app <package_name>

  1. 在 Android Studio 中准备调试:

  • 在 Android Studio 中导航到 File -> Open Profile or APK

  • 打开重新编译的 APK。

  1. 在关键 Java 文件中设置断点:

  • MainActivity.java(特别是在 onCreate 方法中)、b.javaContextWrapper.java 中设置断点。

绕过检查

应用程序在某些时刻会验证是否可调试,并检查指示设备已 root 的二进制文件。可以使用调试器修改应用信息、取消设置可调试位,并更改搜索的二进制文件名称以绕过这些检查。

对于可调试检查:

  1. 修改标志设置:

  • 在调试器控制台的变量部分,导航到: this mLoadedAPK -> mApplicationInfo -> flags = 814267974

  • 注意: flags = 814267974 的二进制表示为 11000011100111011110,表示 "Flag_debuggable" 是活动的。

这些步骤共同确保应用程序可以被调试,并且可以使用调试器绕过某些安全检查,从而便于对应用程序行为进行更深入的分析或修改。

第 2 步涉及将标志值更改为 814267972,其二进制表示为 110000101101000000100010100。

利用漏洞

演示使用了一个包含按钮和文本视图的易受攻击应用程序。最初,应用程序显示 "Crack Me"。目标是在运行时将消息从 "Try Again" 更改为 "Hacked",而不修改源代码。

检查漏洞

  • 使用 apktool 反编译应用程序以访问 AndroidManifest.xml 文件。

  • AndroidManifest.xml 中存在 android_debuggable="true" 表示该应用程序是可调试的,容易受到利用。

  • 值得注意的是,apktool 仅用于检查可调试状态,而不更改任何代码。

准备设置

  • 该过程涉及启动模拟器,安装易受攻击的应用程序,并使用 adb jdwp 识别正在监听的 Dalvik VM 端口。

  • JDWP(Java Debug Wire Protocol)允许通过暴露唯一端口来调试在 VM 中运行的应用程序。

  • 需要进行端口转发以进行远程调试,然后将 JDB 附加到目标应用程序。

在运行时注入代码

  • 通过设置断点和控制应用程序流程进行利用。

  • 使用 classesmethods <class_name> 等命令来揭示应用程序的结构。

  • onClick 方法处设置断点,并控制其执行。

  • 使用 localsnextset 命令检查和修改局部变量,特别是将 "Try Again" 消息更改为 "Hacked"。

  • 使用 run 命令执行修改后的代码,成功实时更改应用程序的输出。

这个例子演示了如何操纵可调试应用程序的行为,突显了更复杂的利用潜力,例如在应用程序上下文中获得设备的 shell 访问权限。

参考文献

支持 HackTricks

Last updated