hacktricks/mobile-pentesting/android-app-pentesting/exploiting-a-debuggeable-applciation.md
2023-08-03 19:12:22 +00:00

11 KiB
Raw Blame History

☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

https://resources.infosecinstitute.com/android-hacking-security-part-6-exploiting-debuggable-android-applications/#article 复制的信息

为了使本文更有趣,我开发了一个演示用的易受攻击的应用程序,其中包含一个“按钮”和一个“文本视图”。

填写下面的表单以下载与本文相关的代码。

如果我们启动应用程序,它会显示消息“Crack Me”。

图1

如果我们点击按钮,它会显示“Try Again”。现在我们的目标是在不修改应用程序源代码的情况下将消息“Try Again”更改为“Hacked”。准确地说我们必须在运行时进行更改。

所需工具

  • 模拟器
  • adb - Android调试桥
  • jdb - Java调试器

在我的情况下为了使安装更容易我使用的是Android Tamer因为所有上述所需的工具都已预先安装好。

涉及的主题

  • 检查漏洞。
  • 准备设置。
  • 运行时代码注入。

让我们开始游戏。

检查漏洞

实际上,这是整篇文章中最简单的部分。

  • 使用APKTOOL对应用程序进行反编译以获取AndroidManifest.xml文件使用以下命令。

apktool d <vulnerableapp>.apk

  • 检查Androidmanifest.xml文件中是否存在以下行。

android_debuggable=”true”

如果在AndroidManifest.xml文件中找到上述行则该应用程序是可调试的可以进行利用。

**注意:**我们使用APKTOOL来查看应用程序是否可调试。正如前面提到的我们不会触及或修改任何代码片段。

准备设置

在此步骤中,我们将设置所有所需的内容,以在应用程序执行期间注入代码。如前一篇文章中所述,我们将在本文中使用远程调试。

  • 启动您的模拟器
  • 安装易受攻击的应用程序
  • 打开终端并运行以下命令以查看模拟器上监听的Dalvik VM端口。

adb jdwp

上述命令显示我们可以连接和调试的所有端口,如下所示。

图2

**注意:**JDWP代表Java调试线协议。如果在其虚拟机中运行的应用程序是可调试的则它会在一个唯一的端口上公开我们可以使用JDB连接到该端口。在Dalvik虚拟机中借助JDWP的支持这是可能的。

  • 现在,启动我们的目标应用程序,并运行相同的命令,以查看与我们的目标应用程序关联的监听端口。如下所示。

图2

如果我们观察图2和图3之间的差异可以看到在图3中启动目标应用程序后有一个额外的端口543在监听。我们将使用此端口将JDB连接到应用程序因为这是我们的目标。

  • 在连接到应用程序之前我们需要使用adb进行端口转发因为我们使用的是远程调试。如图4所示。

图4

  • 现在让我们按照以下图示将JDB连接到应用程序。

图5

运行时代码注入

在此步骤中,我们将通过在运行时修改应用程序的行为来实际利用易受攻击的应用程序。

要在运行时修改应用程序的行为,我们需要设置断点并控制流程。但是,我们不知道应用程序中使用了哪些类和方法。因此,让我们使用以下命令查找应用程序中使用的类和方法。

查找类:“classes

图6.1

由于我列出了太多的类,我只列出了一些类。但是,如果您仍然向下滚动,您将看到一些有趣的用户定义类,如下图所示。

图6.2

现在让我们使用以下命令查看MainActivity$1类关联的方法。

methods com.example.debug.MainActivity$1

如图7所示。

图7

现在让我们设置一个在onClick方法处的断点并控制应用程序的执行如图8所示。

“stop in com.example.debug.MainActivity$1.onClick(android.view.View)”

图8

要触发断点我们需要手动点击应用程序中的按钮。点击按钮后断点将被触发并显示如图9所示。

图9

从这里开始,我们将能够使用各种命令来控制和查看敏感值、方法参数等。 为了了解后台发生的情况我正在跟随与onClick方法相关联的代码如图10所示。

图10

在继续之前,让我们使用“locals”命令查看此时是否有任何局部变量。

图11

如我们所见,对我们来说没有任何有趣的信息。

因此,让我们使用“next”命令执行下一行,如下图所示。

图12

让我们再次尝试执行“locals”命令,以查看前一个命令中发生了什么。

图13

很明显TextView已加载到方法参数中。如果我们查看图10中提供的源代码可以看到与TextView实例化相关联的行已执行。

现在,让我们执行下一行,通过执行“next”命令,并检查局部变量,如下图所示。

图14

如我们所见,所有局部变量都已显示。字符串“secret”看起来很有趣。当我们点击按钮时将打印出“Try Again”的值。

从图10可以清楚地看到方法setText正在执行以打印值“Try Again”。因此,让我们使用“step”命令进入“setText”方法的定义,并动态修改要打印的文本。

图15

让我们使用“locals”命令查看定义内部的局部变量。

图16

现在,让我们使用“set”命令将“text”的值从“Try Again”更改为“Hacked”。

图17

我们无法在应用程序中看到任何更改,因为我们还没有执行修改后的代码。

因此,让我们使用“run”命令运行应用程序,如下图所示,并在屏幕上查看应用程序的输出。

图18

让我们看一下在模拟器中运行的应用程序。

图19

我们成功地在运行时修改了应用程序的输出。这只是一个示例,展示了如果应用程序是可调试的,如何修改应用程序的行为。在易受攻击的应用程序的上下文中,我们可以执行各种其他操作,包括“获取shell”。

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥