渗透测试 Android 应用程序:工具和分步说明(下)

您所在的位置:网站首页 ai打包文件和图片怎么弄 渗透测试 Android 应用程序:工具和分步说明(下)

渗透测试 Android 应用程序:工具和分步说明(下)

2023-04-26 00:32| 来源: 网络整理| 查看: 265

渗透测试 Android 应用程序:工具和分步说明(下) walker 技术 2023-04-14 11:20:00 收藏

导语:在本文中,我们讨论了攻击者可能用来入侵您的应用程序的不同方法。

渗透测试 Android 应用程序:工具和分步说明(上)

解决 UnCrackable Apps 挑战

我们将向您展示如何解决两个 OWASP MSTG CrackMe 挑战:Android 级别 1 的 UnCrackable 应用程序和 Android 级别 2 的 UnCrackable 应用程序。这些应用程序专门设计为逆向工程挑战,代码中隐藏着秘密。我们的任务就是找到这些秘密。在解决这些挑战时,我们将使用静态分析来分析反编译代码,并使用动态分析来修改一些应用程序参数。

解决 UnCrackable App for Android Level 1

首先,我们需要查看我们的培训应用程序。一个普通的 Android 应用程序实际上是一个正确打包的 APK 文件,其中包含应用程序正常运行所需的所有数据。 

要从内部审视应用程序并解决这一挑战,我们需要:

adb 用于与我们的移动设备和培训应用程序通信

用于将我们的培训应用程序的 APK 文件反汇编为单独的 .smali 类的 Apktool

jdb 用于调试我们的训练应用程序

dex2jar 用于将 APK 文件转换为 JAR 格式

用于处理 JAR 文件的 JD-GUI

现在让我们继续解决第一个挑战。

我们将首先使用以下命令在我们的设备或模拟器上安装 UnCrackable-Level1.apk:

image.png

我们将在 jdb 工具的帮助下解决这个挑战并调试 Release Android 应用程序。继续寻找隐藏的秘密。

1. 解压应用程序并使用 Apktool 解码清单文件:

image.png

2. 使用文本编辑器,通过更改清单文件并将应用程序设置为android:debuggable:将应用程序置于调试模式"true":

XML

3.使用Apktool重新打包APK文件:

image.png

4.退出新创建的APK文件。您可以使用bash 脚本来执行此操作以重新注册 Android 应用程序。

5. 使用以下命令在您的设备或模拟器上安装新的 APK 文件:

此时,我们面临第一个大挑战。UnCrackable App 旨在抵抗调试模式。因此,当我们启用它时,应用程序会简单地关闭。

您将看到带有警告的模态对话框。可以通过点击确定关闭对话框,但这将是应用程序终止前的最后一个操作。

image.png

渗透测试 android 1

幸运的是,有一种方法可以解决这个问题。

6. 在等待调试器模式下在您的设备或模拟器上启动应用程序。此模式允许您在应用程序运行其检测机制之前将调试器连接到目标应用程序。因此,应用程序不会停用调试模式。 

使用以下命令在等待调试器模式下运行应用程序:

您将看到以下对话窗口:

image.png

渗透测试 android 2

7. 现在显示连接设备上运行的所有进程的进程 ID (PID):

image.png

8. 并且只列出可调试的进程:

image.png

9. 在您的主机上打开一个监听套接字并将其传入的 TCP 连接转发到所选可调试进程的 JDWP 传输:

image.png

10. 请注意,附加调试器(在我们的例子中是 jdb)将导致应用程序从挂起状态恢复,我们不希望这样。我们需要暂停该应用程序一段时间以对其进行详细探索。为防止进程恢复,将suspend命令通过管道传输到 jdb:

image.png

11. 现在我们需要绕过点击确定后应用程序在运行时崩溃的那一刻。使用 dex2jar 和 JD-GUI 反编译 APK 文件以查看应用程序代码:

1)使用dex2jar工具将原始APK文件转为JAR文件:

image.png

2)使用JD-GUI工具,打开新建的JAR文件:

image.png

查看代码后,您会看到MainActivity.a方法显示消息:

"This is unacceptable..."

MainActivity.a方法创建一个警告对话框并为 onClick 事件设置一个侦听器类。侦听器类有一个回调方法,当用户点击 OK 按钮时,该方法会关闭应用程序。为防止用户取消对话框,系统调用setCancelable方法。

在这一点上,我们最好的情况是将应用程序暂停在我们正在寻找的秘密字符串存储在明文变量中的状态。不幸的是,除非您能弄清楚应用程序如何检测 root 和篡改,否则这是不可能的。

12. 尝试稍微修改运行时以绕过应用程序终止。android.app.Dialog.setCancelable在应用程序仍处于暂停状态时设置方法断点,然后恢复应用程序:

image.png

13. 应用程序在第一个setCancelable方法指令处暂停。您可以使用该locals命令打印传递给setCancelable方法的参数:

image.png

正如您在上面的代码中看到的,系统调用了setCancelable(true)方法,所以这不是我们需要的调用。让我们用resume命令恢复这个过程:

image.png

我们已经通过参数调用了setCancelablefalse方法。此时,我们需要使用set命令将变量更改为true并恢复应用程序:

image.png

每次到达断点时继续设置,flag直到最终显示警报窗口。true您可能需要尝试五六次才能看到此窗口。此时,您应该能够在不导致应用程序终止的情况下取消应用程序——只需点击对话框窗口旁边的屏幕,它就会关闭。

image.png

渗透测试 android 3

14. 最后,是提取秘密字符串的时候了。再次查看应用程序代码。您会注意到我们正在寻找的字符串是使用高级加密标准解密的,并与用户在消息框中输入的字符串进行比较。应用程序使用java.lang.String类的equals方法来确定字符串输入是否与秘密字符串匹配。

现在在java.lang.String.equals上设置一个方法断点,在编辑字段中输入随机文本,然后点击 VERIFY。locals到达断点后,您可以使用命令读取方法参数:

image.png

答对了!我们的秘诀是“我想相信”。您可以通过在消息框中输入此短语并单击“验证”按钮来轻松检查是否正确。

image.png

渗透测试 android 4

做得好!现在我们可以开始解决第二个挑战了。 

解决 UnCrackable App for Android Level 2

与之前的任务一样,在这个训练应用程序的代码中某处隐藏着一个秘密字符串,我们的目标是找到它。然而,在这种情况下,我们的秘密字符串可能有一些本地代码的痕迹。

为了解决这个挑战,我们将使用以下工具:

adb 用于与我们的移动设备通信

用于反汇编 APK 文件的 Apktool

用于处理库的切割器

gbd 用于分析应用程序代码

用于编辑二进制数据的 Hex Workshop Editor

dex2jar 用于将 APK 文件转换为 JAR 格式

用于处理 JAR 文件的 JD-GUI

让我们直接解决这个挑战:

1.使用dex2jar和JD-GUI,分析UnCrackable-Level2.apk文件。

1)首先,使用dex2jar将APK文件转换为JAR文件:

image.png

2) 然后用JD-GUI打开转换后的文件。从MainActivity类开始:

image.png

系统加载本机 foo 库。然后我们在MainActivity类的onInit方法中调用原生的init函数。

接下来,CodeCheck类从 bar 库中导入一个函数:

image.png

CodeCheck的一个方法(很可能被混淆了)使用这个函数来验证密码。

image.png

2.使用Apktool提取foo库,然后用Cutter反编译成机器码:

image.png

在 temp/lib 文件夹中,查找扩展名为 .so 的文件。应该有针对不同类型处理器架构的文件:arm64-v8a、armeabi-v7a、x86 和 x86_64。选择与您正在使用的设备或模拟器的处理器架构相匹配的库。您可以使用CPU-Z应用程序检查设备的架构。 

使用 Cutter 分析所选库。首先检查功能选项卡以了解库的功能。

例如:

pthread_create和pthread_exit函数表明函数库使用线程。

image.png

渗透测试 android 5

如果您看到strncmp字符串比较器,它可能用于验证传递的密码。如果幸运的话,我们正在寻找的字符串是硬编码的,输入的密码会与它进行比较。然而,根据线程的使用判断,我们可以假设库在运行时计算秘密字符串。

image.png

渗透测试 android 6

我们来分析一下strncmp函数。使用 Cutter 找到strncmp函数的地址(0xffb)。

image.png

渗透测试 android 7

ptrace是用于调试的 Linux 系统调用。然而,在我们的例子中,它被用作一种反调试技术。

image.png

渗透测试 android 8

让我们分析一下ptrace的功能。这个调用被使用了两次:第一次是在 0x777,然后是 0x7a7。在第一种情况下,它是当前进程的 PID,在第二种情况下,它是 PTRACE_ATTACH 标志,0x10。

ptrace函数调用将一个 Android 进程附加到自身。但是,一个 Android 进程只能附加一个进程。这意味着目前我们无法将 gdb 附加到 Android 进程。

image.png

渗透测试 android 9

3. 附加 gdb 的问题可以通过 NOP-ing 两个 ptrace 系统调用来解决。您可以使用 Hex Workshop Editor 更改字节。将ptrace函数的地址插入工具的转到字段并更改值:

image.png

渗透测试 android 10

4. 打开原始APK 文件作为zip 存档并将原始libfoo.so 库替换为更改后的库。

5. 使用与上一个挑战相同的脚本退出修改后的 APK 文件。

6. 在 root 设备上安装应用程序: 

image.png

现在,当您启动该应用程序时,您会看到一条警告,提示您无法使用该应用程序,因为设备已获得 root 权限。

image.png

渗透测试 android 11

7.从应用程序代码中删除 root 和调试器检测。为此,请在反编译的 APK 文件中找到 MainActivity.smali 文件并删除 a方法的所有内容。

当检测到问题时调用a方法。它向用户显示一个警告对话框,然后退出应用程序。为了防止我们的应用程序出现此类行为,我们需要修补 a方法。

这是删除a方法内容后 MainActivity.smali 文件的样子:

image.png

8. 现在用修改后的MainActivity.smali文件重新打包 APK 文件:

image.png

9. 接下来,打开 UnCrackable-Level2_resigned.apk 文件作为 ZIP 存档,并将其中的 classes.dex 文件替换为我们重新打包的 APK 文件中的补丁文件。

10. 退出初始的 UnCrackable-Level2.apk 文件。在这一步,我们的 APK 文件有两个替换的补丁文件:来自第 8 步的 MainActivity.smali 和来自第 4 步的 libfoo.so。

11. 在您的设备上安装重新安装的 APK 文件:

这一次,我们的应用程序启动时没有任何警告消息。

image.png

渗透测试 android 12

接下来,我们需要将 gdb 附加到 Android 进程。首先在您的设备或模拟器上设置 gdb 服务器。

12. 在您的设备上打开 root shell:

image.png

13. 使用计算机上的命令行界面,将 gdb 服务器复制到 /data/local/tmp/gdb-server 文件夹中:

image.png

14. 现在在您的移动设备上使用命令行启动 gdb 服务器:

image.png

15.确保服务器正在运行:

image.png

16.确定应用程序的PID:

image.png

如您所见,我们应用程序的 PID 是 4925。

17. 将 gdb 服务器附加到所选的 Android 进程:

image.png

18、在PC上使用命令行,转发8888端口:

image.png

19. 在您的 PC 上,启动 gdb 客户端。

20.将gdb客户端附加到远程进程:

image.png

21. 在您的设备上使用命令行,显示所有导入库的列表:

image.png

image.png

渗透测试 android 13

22. 现在让我们回到在第 2 步中找到的strncmp函数 (0xffb) 地址。断点应设置为地址 0x000000b2d8dffb。在您的 PC 上,从已启动的 gdb 客户端运行此命令:

Shell脚本

(gdb) b *0x000000b2d8dffb Breakpoint 1 at 0xb2d8dffb (gdb) c Continuing. Thread 1 “nt.uncrackable2” hit Breakpoint 1, 0x000000b2d8dffb in Java_sg_vantagepoint_uncrackable2_CodeCheck_bar () from target: /data/app/sg.vantagepoint.uncrackable2-1/lib/x86/libfoo.so (gdb) info registers x0    0xb2d834470        547311273344 x1    0xb2dd49170        549585261184 x2    0x17    23

23. 同样,从您的 PC 上的 gdb 客户端运行此命令以转储寄存器的内容:

image.png

正如您在第 22 步中看到的,应用程序将输入密码的地址和计算出的秘密字符串作为两个参数传递给strncmp函数,分别传入 x0 和 x1 寄存器。

最后,我们需要转储这两个字符串:

image.png

注意:由于 Android 设备的处理器架构和所用工具的版本不同,解决此挑战的积极结果可能不稳定。 

我们做到了!我们的第二个秘密字符串是“感谢所有的鱼”。

结论

Android 应用程序渗透测试是移动应用程序开发的一个复杂但重要的阶段。开发人员需要构建复杂的移动应用程序渗透测试方法,并确保他们的应用程序使用的敏感数据无论如何都将保持安全。

本文翻译自:https://www.apriorit.com/qa-blog/654-reverse-pentesting-android-apps如若转载,请注明原文地址 分享至 取消 嘶吼

感谢您的支持,我会继续努力的!

扫码支持

打开微信扫一扫后点击右上角即可分享哟

发表评论

  你可能感兴趣的

Earth Preta的最新隐蔽攻击策略(上)

Vice Society勒索软件如何通过PowerShell窃取用户数据

UPX压缩如何被用于规避检测工具?

BabLock(又名Rorschach)勒索软件分析

黑入AI:通过MLflow漏洞接管系统和云

Mac恶意软件MacStealer伪装成P2E应用程序大肆传播



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3