通过分步说明了解 Android 渗透测试的基础知识,以发现漏洞并提高移动安全性。
写于 2022 年 10 月 18 日
![[Pasted image 20221025193901.png]]
移动应用程序和服务对于我们在家中和工作中的日常生活至关重要。这使它们成为寻求敏感信息的恶意行为者的主要目标。
在本指南中,您将在执行移动评估以提高安全性时学习基本的 Android 渗透测试技术。首先,我们将设置环境以开始测试,然后检查在移动评估中有用的工具的功能。
什么是安卓渗透测试?
移动或安卓渗透测试旨在检测安全漏洞并确保移动应用程序不易受到攻击。
(Android 和 iOS 操作系统的市场份额合计为 99.35%。)
可以使用自动化工具或手动分析 Android 应用程序。在此过程中,移动渗透测试人员将使用多种技术来模拟攻击,发现移动应用程序中的安全漏洞,并获得对敏感数据的访问权限。
为什么Android渗透测试很重要
现代 Android 应用程序用于商业目的、医疗保健、银行业务、学习等。这些移动应用程序除了保存敏感信息外,还包含安全漏洞。渗透测试人员和开发人员可以发现并修复这些漏洞并降低安全风险。
2021 年,支付应用程序 Klarna 遭遇应用程序缺陷,导致用户随机登录其他客户的帐户并暴露敏感的个人和信用卡信息。
ParkMobile 是美国无现金停车应用程序背后的公司,该公司仍在与 2021 年影响 2100 万用户的移动应用程序数据泄露事件进行集体诉讼。
随着每天都有新的漏洞浮出水面,Android 渗透测试对于避免欺诈攻击、恶意软件感染和数据泄露是必要的。这对于任何想要使用新应用程序而不必担心法律或安全问题的公司来说都是至关重要的。
移动渗透测试还有助于评估开发团队的工作和检查 IT 团队的响应能力,因为测试可以揭示应用程序使用的后端服务中的漏洞和错误配置。
Android包 (APK) 文件结构说明
Android 包 (APK) 是一个带有 .apk 后缀的存档文件,它包含运行 Android 应用程序所需的所有文件(代码和资产)。
APK 文件可以在 Linux 中使用命令 unzip app_name.apk
解压。下图显示了 APK 文件的解压缩结构:
· METTA-INF:包含应用签名时生成的验证信息。
· MANIFEST.MF:包含 APK 的所有文件的名称/哈希列表(通常为 Base64 中的 SHA256)。
· CERT.SF:包含 MANIFEST.MF 文件中相应行的名称/哈希列表。
· CERT.RSA:此文件包含 CERT.SF 的公钥和签名。
· Assets:包含开发人员与应用程序捆绑的资产,可以通过AssetManager检索。这些资产可以是图像、视频、文档、数据库等。
· lib:包含带有编译代码的本机库,用于不同的设备架构。
· res:包含预定义的应用程序资源,例如定义颜色状态列表、用户界面布局、字体、值等的 XML 文件。
· AndroidManifest.xml:一个清单文件,描述了应用程序的包名、活动、资源、版本等。
· classes.dex: 包含 dex(Dalvik Executable)文件格式的所有 java 类,由Android Runtime执行。
· resources.arsc:包含预编译的资源。它包含将代码链接到资源的信息。
从 OWASP Mobile Top 10 开始寻找漏洞
开放 Web 应用程序安全项目 (OWASP) 是一个非营利性基金会,主要为 Web 应用程序提供安全提示和方法。2016 年,OWASP 创建了最新的移动十大漏洞列表。它指的是每个漏洞对个人和企业的影响,并提出了预防方法。
如果您不熟悉 Android 渗透测试,这些漏洞是一个很好的起点,可以帮助您发现缺陷并提高应用程序的安全性:
平台使用不当
此类别包括滥用平台功能,例如 Android 意图、平台权限、TouchID、钥匙串,或未能使用移动操作系统的平台安全控制。为了利用此漏洞,组织必须公开移动应用程序使用的 Web 服务或 API 调用。
漏洞的影响:利用此漏洞的影响范围从更改应用程序的内容到完整的帐户泄露。
预防:必须在移动应用程序的服务器端使用安全编码和配置实践。
不安全的数据存储
在设备的本地存储中存储未加密的数据是一种不好的做法,因为有恶意应用程序可能会尝试从中检索敏感信息。攻击者还可以直接从被盗设备中检索数据。
漏洞影响:利用此漏洞可能导致数据丢失和/或应用程序敏感信息被提取。业务影响包括身份盗用、欺诈、声誉损害、外部政策违规 (PCI) 和物质损失。
预防:为防止此类攻击,您可以加密存储的数据或/和限制对本地数据存储的访问。正如 OWASP 所建议的,了解应用程序处理的信息资产以及 API 如何处理这些资产非常重要。
3. 不安全的通信
在这种类型的攻击中,恶意行为者利用漏洞拦截受感染网络中的敏感数据(例如监控公司的网络流量)。有针对性的攻击更容易执行。
漏洞影响:通过利用此漏洞,攻击者可以暴露个人数据,甚至完全破坏帐户和服务器。对于企业而言,这可能会导致隐私侵犯,进而可能导致身份盗用、欺诈或声誉受损。
预防:
· 使用 SSL/TLS 协议进行安全通信。
· 依靠具有适当密钥长度的强大行业标准密码套件。
· 确保证书由受信任的 CA 提供商签名,而不是自签名。
· 需要 SSL 链验证。
· 在将敏感数据提供给 SSL 通道之前,对任何敏感数据应用单独的加密层。
4. 不安全的身份验证
攻击者通常使用可用或自定义的自动化工具来利用此漏洞。他们尝试使用默认凭据或绕过实施不佳的身份验证协议登录。
漏洞影响:身份验证不当的影响可能导致声誉受损、信息被盗或未经授权访问数据。
预防:
· 确保所有身份验证请求都在服务器端执行。
· 使用客户端存储时加密数据。
· 检查在移动应用程序中实现的持久身份验证(记住我)功能永远不应将用户密码存储在设备上。
· 确保应用程序必须使用特定于设备的身份验证令牌。
· 不允许用户提供 4 位 PIN 码作为验证密码。
5. 密码学不足
未正确加密的数据可以被具有物理访问权限的攻击者或通过恶意软件应用程序还原。
漏洞影响:此漏洞将导致未经授权从移动设备中检索敏感信息。此外,这可能会产生许多不同的业务影响,例如侵犯隐私、信息盗窃、代码盗窃、知识产权盗窃或声誉损害。
预防:为防止这种攻击,应避免在移动设备中存储敏感数据,应用能够经受住未来至少 10 年时间考验的加密标准,并遵循NIST 关于推荐算法的指南。
6.不安全的授权
攻击者通常使用可用或自定义的自动化工具以合法用户身份登录应用程序。登录后,他们可以对移动应用程序执行二进制攻击,并尝试执行只有在移动应用程序处于“离线”模式时才能由更高权限的用户执行的特权功能。
漏洞影响:不安全授权的影响可能导致声誉受损、欺诈或信息盗窃。
预防:为了防止这种攻击,必须仅使用后端系统中包含的信息来验证经过身份验证的用户的角色和权限。后端代码还应该验证身份。
7. 代码质量差
在这种情况下,攻击者可以将不受信任的输入传递给在移动代码中进行的方法调用。代码质量差的问题通常通过恶意软件或网络钓鱼诈骗加以利用。典型的攻击类型将利用内存泄漏和缓冲区溢出。
漏洞的影响:导致远程代码执行的低劣代码质量问题可能导致信息被盗、声誉受损、知识产权被盗。
预防:防止代码质量问题:
· 保持组织中每个人都同意的一致的编码模式。
· 编写易于阅读且文档齐全的代码。
· 始终验证任何传入缓冲区数据的长度。
· 使用第三方静态分析工具识别缓冲区溢出和内存泄漏。
8.代码篡改
攻击者可以通过修改现有应用的源代码并将其托管在第三方应用商店中来创建恶意应用。攻击者还可以通过使用网络钓鱼技术将这些修改后的恶意应用程序传递给受害者。
漏洞的影响:代码篡改可能导致未经授权的新功能、身份盗用、欺诈、盗版导致的收入损失和声誉受损。
预防:为防止此类攻击,移动应用程序必须能够在运行时检测到代码已被添加或更改。此外,由于此类应用程序将在越狱或 root 环境中执行,用户可以检查设备是否已 root 或越狱。
9.逆向工程
攻击者将从应用商店下载一个应用,以使用可用工具执行逆向工程和静态分析技术。这使他们能够了解应用程序的功能、更改代码并重新编译它。
漏洞影响:攻击者随后可以泄露有关后端服务器的信息并进行攻击,泄露密码常数和密码,窃取知识产权。这可能导致公司声誉受损和客户身份盗窃。
预防:代码混淆是减少逆向工程漏洞的关键。
10. 无关功能
攻击者将尝试了解应用程序的工作原理,以发现后端系统的功能。然后,他们尝试直接利用后端系统。
漏洞影响:此类攻击的技术影响包括暴露后端系统功能,执行未经授权的高权限操作,以及声誉受损和知识产权盗窃。
预防:应手动执行源代码审查,以防止此类漏洞。
推荐的安卓渗透测试工具
以下是可用于执行 Android 应用程序渗透测试的工具列表。有些用于自动化测试,有些用于手动测试。
自动化的 Android 渗透测试工具非常适合扫描常见漏洞。与手动工具和流程相比,它们提供了更快、更便宜的解决方案,通过将人类智能与自动化工具相结合,提供更深入和更脆弱的洞察:
· Android Debug Bridge (ADB):一种多功能命令行工具,可让您与设备进行通信。
· Dex2jar:将 .dex 文件转换为 .class 文件,压缩为 jar 文件。
· JD-GUI:一个独立的图形实用程序,显示来自 CLASS 文件的 Java 源代码。
· JADX:用于从 Android Dex 和 APK 文件生成 Java 源代码的命令行和 GUI 工具。
· APKTOOL : 用于逆向工程第三方、封闭、二进制 Android 应用程序的工具。
· Burp Suite:一组用于 Web 应用程序渗透测试的工具。
· Frida:面向开发人员、逆向工程师和安全研究人员的动态检测工具包。
· 异议:由 Frida 提供支持的运行时移动探索工具包,旨在帮助您评估移动应用程序的安全状况,而无需越狱。
· Ghidra:由 NSA 研究局开发的软件逆向工程 (SRE) 工具套件,用于支持网络安全任务。
· Drozer:drozer(原 Mercury)是领先的 Android 安全测试框架。
· MobSF:移动安全框架 (MobSF) 是一种自动化的一体化移动应用程序 (Android/iOS/Windows) 笔测试、恶意软件分析和安全评估框架,能够执行静态和动态分析。
为 Android 设置渗透测试环境
为了对 Android 设备和应用程序进行评估,我们需要一个真实的或模拟的 Android 设备。Android 虚拟设备 (AVD) 与 Android Studio IDE(集成开发环境)一起提供,这是一个很好的解决方案。
Genymotion和Corellium也是不错的选择,因为它们提供了基于云的环境和基于 ARM 的虚拟化(用于移动设备的 CPU 架构)。利用基于云的环境,我们可以使用 Web 浏览器生成和自定义移动设备,而 Corellium 提供相应的选项来根或越狱 Android 或 iPhone 设备。
ARM 是当今用于 Android 和 iPhone 设备的 CPU 架构。内核利用与 CPU 架构有关。大多数模拟器虚拟化了非 ARM CPU 架构,这使得渗透测试者无法使用移动模拟器来研究潜在的新内核开发技术。对我们来说幸运的是,Corellium 和 Genymotion 通过基于 ARM 的虚拟化解决了这个问题。
在 Linux 上安装Android Studio非常简单。我们所要做的就是解压缩并运行目录中的studio.sh文件bin/。要在 Windows 或 macOS 上安装 Android Studio,我们需要按照安装向导进行操作。两个操作系统的过程几乎相同。
例如,在 Windows 上,我们单击可执行文件,然后按照设置向导的步骤进行操作。安装完成后,我们只需要等待一些组件下载即可。
完成后,单击完成,然后单击新建项目。
选择 Empty Activity,然后在以下窗口中单击 Next。
最后,单击完成以完成该过程。
现在我们已经创建了一个新项目,我们只需要等待更多文件从 IDE 自动下载。完成后,单击 IDE 的顶部中心(如下所示)并选择 AVD Manager。
在 AVD Manager 菜单上,单击绿色的 Play 按钮启动模拟器。
设备启动后,应如下所示:
五种有效的Android渗透测试技术
在 Android 设备中,您需要进行许多测试以发现安全漏洞。
反转 APK(Android 包)文件的代码、拦截 HTTP 请求,甚至枚举已安装应用程序的文件结构,都可能导致敏感信息的潜在暴露,这可能使我们能够更改特定功能的预期逻辑流程. 我将在下面的部分中解释如何检查 Android 设备。
1.本地数据存储枚举
为了枚举已安装应用程序的文件结构,我们需要访问真实或模拟设备。这可以通过使用Android 调试桥(ADB) 来实现,这是一个命令行工具,可让您直接与设备通信。使用 ADB,我们可以安装和调试应用程序,而它提供的 Unix shell 可用于在设备上运行命令。
ADB 可以通过键入轻松安装在 Linux 中sudo apt install adb。安装后,adb 客户端还会启动一个 adb 服务器,该服务器会自动建立与所有正在运行的设备的连接。如果这不起作用,我们必须按照以下步骤手动建立连接:
通过 ADB 手动连接
首先,我们在设备上启用 USB 调试选项。为此,我们点击设置,然后点击关于设备或关于手机,具体取决于设备,然后我们向下滚动并点击内部版本号七次,直到出现“您现在是开发人员!”消息。弹出。
接下来,点击一次后退按钮并导航到开发人员选项。
然后向下滚动到调试部分,直到我们找到并启用 USB 调试选项。
现在启用了 USB 调试,我们可以在 Linux 中通过键入来安装 ADB sudo apt install adb。回到我们的 Android 设备,我们点击设置图标,然后导航到 Wi-Fi,最后点击屏幕右上角的齿轮图标以获得 IP 地址。
获得 IP 后,我们输入adb connect 192.168.232.2:5555. 此命令还将在本地启动 adb 服务器,等待新连接。根据官方 ADB文档,端口 5555 由 adb 服务器使用,它是模拟器将尝试连接的序列中的第一个端口。建立连接后,我们可以键入adb devices以列出连接的设备。
连接的设备可能以 或 的格式name-port显示ip-port。在我们的例子中,设备显示为emulator-5554。
重要目录
下面列出的目录是 Android 设备中最重要的目录,值得留意。
· /data/data:包含用户安装的所有应用程序。
· /data/user/0:包含只有应用程序可以访问的数据。
· /data/app:包含用户安装的应用程序的 APK。
· /system/app:包含设备预装的应用程序。
· /system/bin:包含二进制文件。
· /data/local/tmp:一个世界可写的目录。
· /data/system:包含系统配置文件。
· /etc/apns-conf.xml:包含默认接入点名称 (APN) 配置。APN 用于使设备连接到我们当前运营商的网络。
· /data/misc/wifi:包含 WiFi 配置文件。
· /data/misc/user/0/cacerts-added:用户证书存储。它包含用户添加的证书。
· /etc/security/cacerts/:系统证书存储。不允许授予非 root 用户权限。
· /sdcard:包含指向 DCIM、下载、音乐、图片等目录的符号链接。
枚举
在 Android 中,该目录/data/data/包含设备上安装的每个应用程序的安装目录。此目录是私有的,其他应用程序或非 root 用户无法访问。通过 ADB 获得 root 访问权限,我们可以列出该目录的内容。
如前所述,存储在设备内部存储器中的应用程序驻留在目录中/data/data/。在某些情况下,像databases和一样的目录shared_prefs是在安装过程中创建的。数据库目录通常在应用程序首次运行时填充,将结构化数据存储在私有数据库中。
通过 ADB 访问设备后,我们可以使用“sqlite3”客户端枚举任何可用的数据库。假设安装了/data/data/com.example.demo软件包,并且使用数据库来存储数据。在这种情况下,可以在目录下找到数据库/data/data/com.example.demo/databases/。
一旦识别出数据库,我们就可以使用该sqlite3工具读取其内容。
数据库并不是唯一存储数据的地方。在源代码中,SharedPreferences 是指向 XML 文件以便对其进行读写的对象。这些 XML 文件最终将包含一组键值对,并将存储在一个名为shared_prefs. 读取这些文件,可以获得敏感信息。
以加密形式存储任何敏感值可以减轻信息泄露攻击,就像我们之前看到的那样。此外,使用像EncryptedSharedPreferences这样的库可能是保护 XML 文件内容的一个很好的解决方案,因为它会加密键值对。
2.提取APK文件
对 APK 文件进行逆向工程可能会导致绕过各种安全措施。可以使用dex2jar、JADX、JD-GUI、APKTOOL等开源工具来反转 APK 文件。让我们看看如何反转应用程序,并使用从源代码中收集的信息绕过身份验证机制。
在线查找 APK
在我们开始逆向工程之前,拥有一个 APK 文件可以让我们安装它并使用它的功能。可以通过多种方式提取 APK 文件。我们要研究的第一种方法是在线查找 APK。为此,我们导航到APKCombo,然后搜索我们要导出 APK 文件的应用程序。让我们搜索 Twitter 应用程序。
选择第一个结果,然后单击显示下载 APK 的绿色按钮。
最后,点击 Twitter 图标下载 APK 文件。
而已。Twitter APK 已成功下载。
使用第三方工具提取 APK
Android 第三方工具也可用于导出 APK。APK Export 是一个Android 应用程序,它会自动导出另一个应用程序的APK 文件并存储在本地。我们可以直接从 Google Play 商店安装 APK Export。
安装后,我们可以通过点击它来启动它,然后导航到所需的应用程序。
让我们尝试导出应用程序 HelloKotlin 的 APK 文件。为此,我们点击 HelloKotlin 应用程序,然后点击窗口右下角的光盘图标。
然后,如果我们使用文件浏览器应用程序浏览文件存储,我们会看到一个名为“apk”的新目录。
最后浏览到APK文件夹,可以看到“HelloKotlin1.0.apk”已经成功导出。
从设备中提取 APK
现在让我们假设该应用程序在 Google Play 商店中不可用。当设备上已经安装了应用程序时,APK文件存储在目录中/data/app/
例如,如果包名是com.example.myapp,则 APK 的完整路径应该是/data/app/com.example.myapp-1/base.apk。
我们可以看到包名后面是一个数字。在某些 Android 版本中,这是一个序列号,而在其他版本中,这是一个随机字符串。非root用户是不允许读取目录内容的/data/app/,因此很难猜出应用的完整包名。
要获取包名称,我们可以键入以下命令,因为应用名称通常是包名称的一部分。
adb shell pm list packages | grep myapp
获得包名后,我们键入以下命令来获取 APK 文件的完整路径。
adb shell pm path com.example.myapp
最后,我们可以键入以下命令来检索base.apk文件。
adb pull /data/app/com.example.myapp-1/base.apk
3. 使用 JADX 进行逆向工程
现在让我们继续该过程的下一部分,对 APK 进行逆向工程。
假设应用程序安装在 AVD 中,我们可以看到它的主要功能是请求 VIP 代码,如果通过验证,它会返回一张票。
让我们继续并反转 APK 文件以检查源代码。使用 JADX-GUI,我们可以直接打开 APK 文件并读取应用程序的 Java 伪代码。您可以通过 Linux 上的 APT 包管理器安装此工具,方法是键入apt install jadx 或从GitHub下载。键入jadx-gui以启动程序并加载demo.apk文件。
然后我们可以浏览应用程序结构。在窗口的左侧,我们可以看到 APK 文件中包含的包和文件。
在某些情况下,源代码可能会被混淆。混淆是使人类难以阅读代码的过程。Android Studio 使用 ProGuard 进行代码混淆。
ProGuard 是一个开源命令行工具,可以压缩、优化和混淆 Java 代码。在一个新的 Android Studio 项目中,在该Grandle Scripts部分下,有一个名为的文件proguard-rules.pro ,您可以在其中指定其他规则。混淆源代码并不意味着它完全不可读。
使用 ProGuard 进行混淆时,所有方法名称都替换为 a、b、c 等字母。这样,人们就很难理解应用程序的功能,因此,它将部分保护它免受逆向工程的影响。在 Android Studio 中,默认情况下不启用代码混淆。要启用它,您必须在文件中将布尔变量设置minifyEnabled为true, build.gradle 。
有关 ProGuard 和 Android Studio 的更多信息,请阅读此处的官方文档。(分析混淆应用程序的源代码将是未来博客文章的主题!)查看 JADX-GUI 的右侧窗口,我们会看到应用程序的源代码。让我们看一下类的源代码MainActivity.class。
如果提供了正确的密码,这段代码表明正在使用 AES 算法加密返回给用户的字符串。加密的密钥也被泄露。仔细检查源代码,特别是下面的代码片段,可以发现密文。
APK 文件的源代码为我们提供了创建脚本和解密密文所需的所有信息。脚本可以用我们选择的任何语言编写。按照这样的方法,我们可以反转任何 APK 文件,以研究源代码的流程并更改或绕过预期的功能。
4.反编译和重新编译APK文件
另一个可用于 Android 逆向工程的有用工具是Apktool。
它还可用于进一步检查代码被混淆的应用程序。主要特点是能够反汇编 APK,允许通过这种方式读取和更改源代码,然后将资源重建回 APK 文件。这使用户可以更改应用程序的功能。
假设我们有以下应用程序,并且我们想尝试绕过登录屏幕。
为此,我们将尝试对应用程序进行逆向工程,找到并编辑验证用户输入的代码片段,然后重新编译它。为此,我们将使用 Apktool。Apktool 将为我们提供Smali代码。与 JADX 提供的 Java 伪代码相比,Smali 代码更难阅读。为了对源代码流程有一个很好的初步了解,让我们先用 JADX 打开 apk 文件。
正如我们所看到的,上面的代码片段显示了一个if看起来像是检查用户名和密码的语句。更具体地说,嵌入if语句看起来像是使用现有的 MD5 字符串验证用户输入的 MD5 值,如果它们匹配,则会显示一条消息,否则,将显示消息“Wrong Credentials”。让我们尝试使用 Apktool 查找和编辑这段代码。
要在基于 Debian 的 Linux 系统中安装 Apktool,请键入apt install apktool. 然后输入apktool d demo.apk开始反汇编APK文件。
反编译完成后,我们可以继续列出demo 已创建文件的内容。
我们可以看到,Apktool 已经反编译了AndroidManifest.xml. 如前所述,该文件包含有关应用程序的包名称、活动、资源、版本等信息。该文件在枚举 APK 文件时提供了重要信息。除了这个文件,我们还注意到目录smali。
Smali 代码是 dalvik 使用的 dex 格式的汇编器/反汇编器,dalvik 是 Android 的 Java VM 实现。换句话说,它是一种符号语言,就像 C 程序的汇编代码一样。正如我们前面提到的,java 类被打包成 dex(Dalvik Executable)文件格式,由 Android Runtime 执行。
由于我们可以访问 smali 代码,因此我们可以使用 Apktool 读取、更改和重新编译它。下面我们可以看到应用反编译后的Activity:
让我们打开MainActivity$a.smali 并阅读它的内容。
向下滚动一点后,我们可以找到包含 MD5 字符串的行,以及if 检查用户输入的 MD5 值是否等于该 MD5 字符串的语句。让我们尝试更改此语句并使其检查输入是否不等于此 MD5 字符串。这样,每当我们输入错误的密码时,该应用程序将允许我们登录。
为此,我们必须将指令更改if-eqz为if-nez. 然后,我们将与资源一起重新编译编辑的代码并创建一个新的 APK 文件。为此,我们键入以下命令,并将反编译demo.apk 文件时创建的目录的名称作为参数传递。
apktool b demo
如果构建成功如上图所示,我们所要做的就是对使用自签名证书创建的新 APK 文件进行签名,并将其安装到我们的设备上。首先,我们生成一个新密钥keytool -genkey -keystore john.keystore -validity 1000 -alias john。
生成密钥后,我们键入以下内容对 APK 文件进行签名:
jarsigner -keystore john.keystore -verbose demo/dist/demo.apk john
APK 文件已成功签名,它位于目录./demo/dist/demo.apk中。在我们将它安装到设备上之前,我们首先需要卸载已经安装的那个。我们可以从 UI 执行此操作,也可以在终端中键入以下内容:adb uninstall com.example.demo
我们现在可以继续输入以下命令来安装新的 APK:adb install demo.apk
在 UI 中,我们找到应用程序名称 Demo 并点击它。一旦打开,我们输入用户名admin,就像我们在上一步的源代码中看到的那样,然后提供一个随机密码。
提示“登录成功!” 屏幕上显示,表示我们已成功绕过此应用程序的登录屏幕。更多的逆向工程技术可用于静态和动态分析,使用 Ghidra 和 Frida 等工具,但这将是未来博客文章的主题.
5.拦截网络流量
在 Android 中使用 Burp Suite 拦截 HTTP 请求的过程很简单。许多 Android 应用程序正在使用服务器来远程处理或存储数据。当应用程序和服务器通信时,可以拦截请求/响应,并读取通过 HTTP 协议发送的数据。
让我们检查一个场景,其中应用程序具有一个登录表单,该表单将数据发送到远程服务器,以便对用户进行身份验证。此外,此应用程序存储了先前会话中的用户凭据,但密码是隐藏的,因此无法读取。
假设应用程序使用远程服务对用户进行身份验证,则可以通过拦截 HTTP 请求来读取密码。Android 虚拟设备 (AVD) 提供了一个配置选项卡,可以在其中设置代理首选项,位于 Settings -> Proxy 下。勾选 Manual Proxy Configuration 选项,然后设置主机的 IP 地址和端口 8080。
在 AVD 上配置代理设置后,我们需要编辑代理服务器的 IP 地址,将其从 localhost 更改为主机的本地 IP 地址。
完成后,我们可以继续使用 Burp 启动代理服务器,然后单击应用程序中的登录按钮。我们在下面看到截获的请求,以及纯文本的用户凭据。
为了缓解此类问题,可以使用安全套接字层 (SSL)。在 Android 中实现 SSL 可以通过多种方式完成。然而,绕过这些实现的技术也已经开发出来。
例如,SSL Pinning 是一种用于防止中间人攻击的技术。这种技术要么将证书放在应用程序包中(证书固定),要么将证书的公钥或哈希作为字符串包含在源代码中。
Frida 是用于移动评估的著名框架,它允许我们在运行时篡改应用程序的代码。使用 Frida 向 APK 注入代码,可以绕过 SSL pinning。对 Frida 框架的更深入研究将成为后续博客文章的主题。
取证有助于形成更详细的移动安全图景
在某些情况下,逆向工程不会向您显示恶意软件感染或受感染的应用程序造成的真正损害,这就是取证的用武之地。取证检查将帮助您识别违规证据并防止您的应用程序在未来受到损害揭示漏洞背后的更多细节。
对于 Android 设备,可以制作磁盘映像的副本,以便使用Autopsy等工具进一步检查它。Autopsy 是一个在 Windows 上运行良好的开源数字取证平台。此工具可以帮助您从磁盘中检索已删除的文件和图像、读取数据库、EXIF 数据、SMS 和电话日志、读取网络浏览器的历史记录等等。
Android 磁盘映像可以在有根的设备中获取。植根 Android 设备可以通过多种方式完成。在这一点上,值得注意的是,以 root 用户身份访问设备的终端与 root 设备本身是完全不同的事情。按照这个 GitHub项目中的说明,可以轻松地对我们之前在 Android Studio 中设置的 Nexus 5X 等 AVD 进行生根。下图显示了应用程序 RootChecker 在成功植根设备后的结果。
设备植根后,可以使用dd Unix 实用程序获取磁盘映像。此时,我们还需要介绍应用程序 BusyBox。BusyBox 是一个软件套件,它在一个可执行文件中提供了多个 Unix 实用程序。它可以通过 ADB 安装在有根设备上。
假设我们有一个安装了 BusyBox 的根 AVD,我们需要获取的分区是挂载在 /data
目录中的分区。Android 设备上安装的分区可能如下所示。
硬件设备驱动程序和特殊设备文件就像普通文件一样出现在文件系统中。dd 命令行实用程序能够备份硬盘驱动器的引导扇区。一旦我们找到了正确的分区,我们就可以使用dd 获取磁盘映像,并nc 从 BusyBox 应用程序中将磁盘映像直接发送到我们的主机。以下命令获取磁盘映像,并启动侦听器。
adb shell "dd if=/dev/block/dm-0 | busybox nc -l -p 8888" &
接下来,我们使用 ADB 在端口 8888 上转发流量。
adb forward tcp:8888 tcp:8888
最后,我们运行以下命令在本地获取磁盘映像。
nc 127.0.0.1 8888 > disk.dd
完成后,我们可以启动 Autopsy 并按照提供的步骤加载磁盘映像。首先,让我们为新案例命名。
接下来,我们设置案例编号。
在下一步中,选择主机名和数据源类型。
然后选择我们之前获取的磁盘映像,并将其加载为数据源。
最后,单击下一步并完成。
至此,磁盘镜像应该已经加载成功了。查看左侧窗口,我们可以看到一个折叠菜单,允许我们浏览从设备收集的文件。
Autopsy 的一个重要功能是能够从设备中恢复已删除的文件。下图显示已删除的文件 Credentials.xlsx 已恢复。
练习您的 Android 渗透测试技能
本文介绍了一些用于评估 Android 应用程序或设备安全性的最常用技术。移动设备是我们日常生活中不可或缺的一部分,预计未来几年对如何保护和破解这些设备的兴趣将会增加。
学习我们所介绍的技术的最佳方法是在可以使用常见 Android 漏洞利用向量的真实环境中测试您的技能!