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) 中找到的其余资源和文件,因为有时它们包含额外的惊喜,例如加密数据库、证书等。