跳过内容

MASTG-TECH-0058: 探索应用包

一旦您收集到想要作为目标的应用程序的包名称,您将需要开始收集有关它的信息。首先,检索 iGoat-Swift IPA,如 获取和提取应用中所述。

您可以使用标准 unzip 或任何其他 ZIP 实用程序解压缩 IPA。

unzip iGoat-Swift.ipa

在其中,您会找到一个 Payload 文件夹,其中包含所谓的应用程序包 (.app)。以下是一个示例,请注意,它被截断以获得更好的可读性和概述

$ ls -1 Payload/iGoat-Swift.app
rutger.html
mansi.html
splash.html
about.html

LICENSE.txt
Sentinel.txt
README.txt

URLSchemeAttackExerciseVC.nib
CutAndPasteExerciseVC.nib
RandomKeyGenerationExerciseVC.nib
KeychainExerciseVC.nib
CoreData.momd
archived-expanded-entitlements.xcent
SVProgressHUD.bundle

Base.lproj
Assets.car
PkgInfo
_CodeSignature
[email protected]

Frameworks

embedded.mobileprovision

Credentials.plist
Assets.plist
Info.plist

iGoat-Swift

最相关的项目是

  • Info.plist 包含应用程序的配置信息,例如其捆绑包 ID、版本号和显示名称。
  • _CodeSignature/ 包含一个 plist 文件,其中包含捆绑包中所有文件的签名。
  • Frameworks/ 包含应用程序原生库,格式为 .dylib 或 .framework 文件。
  • PlugIns/ 可能包含应用程序扩展,格式为 .appex 文件(示例中不存在)。
  • iGoat-Swift 是包含应用程序代码的应用程序二进制文件。它的名称与捆绑包的名称相同,减去 .app 扩展名。
  • 各种资源,例如图像/图标,*.nib 文件(存储 iOS 应用程序的用户界面)、本地化内容 (<language>.lproj)、文本文件、音频文件等。

Info.plist 文件

信息属性列表或 Info.plist(按惯例命名)是 iOS 应用程序的主要信息来源。它由一个结构化文件组成,该文件包含描述应用程序基本配置信息的键值对。实际上,所有捆绑的执行文件(应用程序扩展、框架和应用程序)都应具有 Info.plist 文件。您可以在Apple 开发者文档中找到所有可能的键。

该文件可能采用 XML 或二进制 (bplist) 格式。您可以使用一个简单的命令将其转换为 XML 格式

  • 在 macOS 上,使用 plutil,这是一个 macOS 10.2 及更高版本原生提供的工具(目前没有官方在线文档)
plutil -convert xml1 Info.plist
  • 在 Linux 上
apt install libplist-utils
plistutil -i Info.plist -o Info_xml.plist

以下是一些信息和相应关键字的非详尽列表,您只需检查文件或使用 grep -i <keyword> Info.plist 即可轻松在 Info.plist 文件中搜索这些信息。

  • 应用程序权限目的字符串:UsageDescription(请参阅“iOS 平台 API”)
  • 自定义 URL 方案:CFBundleURLTypes(请参阅“iOS 平台 API”)
  • 导出/导入的自定义文档类型UTExportedTypeDeclarations / UTImportedTypeDeclarations(请参阅“iOS 平台 API”)
  • 应用程序传输安全 (ATS) 配置:NSAppTransportSecurity(请参阅“iOS 网络通信”)

请参阅上述章节,以了解有关如何测试每个要点的更多信息。

应用程序二进制文件

iOS 应用程序二进制文件是胖二进制文件(它们可以部署在所有 32 位和 64 位设备上)。与 Android 相比,您可以实际将应用程序二进制文件反编译为 Java 代码,而 iOS 应用程序二进制文件只能被反汇编。

原生库

iOS 应用程序可以通过使用不同的元素来模块化其代码库。在 MASTG 中,我们将所有这些都称为原生库,但它们可以采用不同的形式

  • 静态库和动态库:
    • 静态库可以被使用,并将被编译到应用程序二进制文件中。
    • 动态库(通常具有 .dylib 扩展名)也被使用,但必须是框架捆绑包的一部分。独立动态库在 iOS、watchOS 或 tvOS 上不受支持,除非是 Xcode 提供的系统 Swift 库。
  • 框架(自 iOS 8 以来)。框架是一个分层目录,它将动态库、头文件和资源(例如故事板、图像文件和本地化字符串)封装到一个包中。
  • 二进制框架 (XCFrameworks):Xcode 11 支持使用 XCFrameworks 格式分发二进制库,这是一种捆绑框架的多个变体的新方法,例如,适用于 Xcode 支持的任何平台(包括模拟器和设备)。它们还可以捆绑静态库(及其相应的头文件),并支持基于 Swift 和 C 代码的二进制分发。 XCFrameworks 可以作为 Swift 包分发
  • Swift 包:Xcode 11 增加了对 Swift 包的支持,这些包是 Swift、Objective-C、Objective-C++、C 或 C++ 代码的可重用组件,开发人员可以在其项目中使用,并作为源代码分发。自 Xcode 12 以来,它们还可以捆绑资源,例如图像、故事板和其他文件。由于包库默认情况下是静态的。Xcode 编译它们,以及它们所依赖的包,然后将所有内容链接和组合到应用程序中。

您可以通过单击左侧菜单栏中的“模块”图标,在 Grapefruit中查看原生库

并获得更详细的视图,包括它们的导入/导出

它们位于 IPA 的 Frameworks 文件夹中,您也可以从终端检查它们

$ ls -1 Frameworks/
Realm.framework
libswiftCore.dylib
libswiftCoreData.dylib
libswiftCoreFoundation.dylib

或者使用 objection 从设备上查看(当然也可以通过 SSH)

OWASP.iGoat-Swift on (iPhone: 11.1.2) [usb] # ls
NSFileType      Perms  NSFileProtection    ...  Name
------------  -------  ------------------  ...  ----------------------------
Directory         493  None                ...  Realm.framework
Regular           420  None                ...  libswiftCore.dylib
Regular           420  None                ...  libswiftCoreData.dylib
Regular           420  None                ...  libswiftCoreFoundation.dylib
...

请注意,这可能不是应用程序使用的所有原生代码元素的完整列表,因为有些可以是源代码的一部分,这意味着它们将被编译到应用程序二进制文件中,因此无法在 Frameworks 文件夹中作为独立的库或框架找到。

目前,除非您开始对它们进行逆向工程,否则您只能获得有关框架的这些信息。有关如何逆向工程框架的更多信息,请参阅。

其他应用程序资源

通常值得查看您可能在 IPA 中的应用程序包 (.app) 中找到的其余资源和文件,因为有时它们包含额外的惊喜,例如加密数据库、证书等。