# iOS基本测试操作
☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥 * 你在一家**网络安全公司**工作吗?你想在HackTricks中看到你的**公司广告**吗?或者你想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)! * 发现我们的独家[NFT](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family) * 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com) * **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram群组**](https://t.me/peass) 或 **关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。** * **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
## 获取iOS设备的UDID {% hint style="info" %} 在执行这些操作之前,**通过USB将设备连接到计算机**并**解锁**设备。 {% endhint %} UDID是一个40位数字和字母的唯一序列,用于标识iOS设备。您可以在macOS Catalina及更高版本的**Finder应用程序**中找到iOS设备的UDID,因为Catalina中不再提供iTunes。只需在Finder中选择连接的iOS设备,然后**单击iOS设备名称下的信息**以遍历它。除了UDID,您还可以找到序列号、IMEI和其他有用的信息。 ![](<../../.gitbook/assets/image (471).png>) 如果您使用的是Catalina之前的macOS版本,您可以通过iTunes找到您的iOS设备的[UDID](http://www.iclarified.com/52179/how-to-find-your-iphones-udid),选择您的设备,然后在摘要选项卡中点击“序列号”。点击后,您将遍历iOS设备的不同元数据,包括其UDID。 还可以在macOS上使用各种命令行工具获取设备连接的UDID: * 使用[I/O Registry Explorer](https://developer.apple.com/library/archive/documentation/DeviceDrivers/Conceptual/IOKitFundamentals/TheRegistry/TheRegistry.html)工具`ioreg`: ```bash $ ioreg -p IOUSB -l | grep "USB Serial" | "USB Serial Number" = "9e8ada44246cee813e2f8c1407520bf2f84849ec" ``` * 使用[ideviceinstaller](https://github.com/libimobiledevice/ideviceinstaller)(也可在Linux上使用): ```bash $ brew install ideviceinstaller $ idevice_id -l 316f01bd160932d2bf2f95f1f142bc29b1c62dbc ``` * 使用system\_profiler: ```bash $ system_profiler SPUSBDataType | sed -n -e '/iPad/,/Serial/p;/iPhone/,/Serial/p;/iPod/,/Serial/p' | grep "Serial Number:" 2019-09-08 10:18:03.920 system_profiler[13251:1050356] SPUSBDevice: IOCreatePlugInInterfaceForService failed 0xe00002be Serial Number: 64655621de6ef5e56a874d63f1e1bdd14f7103b1 ``` * 使用instruments: ```bash $ instruments -s devices ``` ## 访问设备Shell 越狱设备后,您应该安装了一些新的应用程序管理器,如**Cydia**。 ### SSH 为了启用对iOS设备的SSH访问,您可以安装**OpenSSH** **包**。安装完成后,您可以通过运行`ssh root@`访问您的设备,这将以root用户身份登录您的设备: ```bash $ ssh root@192.168.197.234 root@192.168.197.234's password: iPhone:~ root# ``` 当通过SSH访问您的iOS设备时,请考虑以下事项: * **默认用户是`root`和`mobile`**。 * 两者的默认**密码**都是**`alpine`**。 > 请记住,要更改`root`和`mobile`用户的默认密码,因为在同一网络上的任何人都可以找到您设备的IP地址并使用众所周知的默认密码连接,这将使他们获得对您设备的root访问权限。 ### **通过USB连接到设备的SSH** 在真实的黑盒测试中,可靠的Wi-Fi连接可能不可用。在这种情况下,您可以使用usbmuxd通过USB连接到设备的SSH服务器。 通过安装和启动iproxy将macOS连接到iOS设备: ```bash $ brew install libimobiledevice $ iproxy 2222 22 waiting for connection ``` 上述命令将iOS设备上的端口`22`映射到本地主机上的端口`2222`。如果您不想每次都运行二进制文件来通过USB进行SSH连接,您还可以[使iproxy在后台自动运行](https://iphonedevwiki.net/index.php/SSH\_Over\_USB)。 使用以下命令在新的终端窗口中,您可以连接到设备: ```bash $ ssh -p 2222 root@localhost root@localhost's password: iPhone:~ root# ``` > 关于iDevice的USB的小提示:在iOS设备上,如果处于锁定状态超过1小时,除非再次解锁,否则无法进行数据连接,这是由iOS 11.4.1引入的USB受限模式导致的。 ### 设备上的Shell应用程序 通常情况下,使用设备上的shell(终端模拟器)可能比远程shell更加繁琐,但在调试网络问题或检查某些配置时,它可能非常方便。例如,您可以通过Cydia安装[NewTerm 2](https://repo.chariz.io/package/ws.hbang.newterm2/)来实现此目的(在撰写本文时,它支持iOS 6.0至12.1.2)。 此外,有一些越狱工具明确禁用了传入的SSH连接,出于安全原因。在这些情况下,拥有一个设备上的shell应用程序非常方便,您可以使用它首先通过反向shell从设备中SSH出去,然后从主机计算机连接到它。 通过运行以下命令可以打开一个SSH反向shell:`ssh -R :localhost:22 @`。 在设备上的shell应用程序中运行以下命令,并在提示时输入主机计算机的`mstg`用户密码: ```bash ssh -R 2222:localhost:22 mstg@192.168.197.235 ``` 在您的主机计算机上运行以下命令,并在要求时输入iOS设备的`root`用户密码: ```bash $ ssh -p 2222 root@localhost ``` ### **忘记密码** 如果你忘记了密码并想要将其重置为默认的 **`alpine`**: 1. 使用设备上的终端或使用诸如 **Filza** 或 **iFile** 的应用程序编辑你的越狱 iOS 设备上的文件 `/private/etc/master.passwd` 2. 找到以下行: ```bash root:xxxxxxxxx:0:0::0:0:System Administrator:/var/root:/bin/sh mobile:xxxxxxxxx:501:501::0:0:Mobile User:/var/mobile:/bin/sh ``` 3. 将 `xxxxxxxxx` 更改为 `/smx7MYTQIi2M`(这是密码 `alpine` 的哈希值) 4. 保存并退出 ## 数据传输 ### 通过 SSH 和 SCP 复制应用数据文件 现在我们知道,我们的应用文件存储在 Data 目录中。你现在可以使用 `tar` 将 Data 目录打包,并使用 `scp` 从设备中拉取它: ```bash iPhone:~ root# tar czvf /tmp/data.tgz /private/var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8EF8-8F5560EB0693 iPhone:~ root# exit $ scp -P 2222 root@localhost:/tmp/data.tgz . ``` ### 使用iFunbox [**iFunbox**](https://www.i-funbox.com/en/page-download.html) 是一个图形用户界面应用程序,可用于多种用途(包括上传/下载文件)。\ 另一个用于此目的的图形用户界面工具是 [**iExplorer**](https://macroplant.com/iexplorer)。 {% hint style="info" %} 从iOS 8.4版本开始,苹果限制了第三方管理器对应用程序沙盒的访问权限,因此如果设备没有越狱,像iFunbox和iExplorer这样的工具将无法显示/检索设备上安装的应用程序的文件。 {% endhint %} ### 使用Objection 当您启动objection(`objection --gadget com.apple.mobilesafari explorer`)时,您将在Bundle目录中找到提示符。 ```bash org.owasp.MSTG on (iPhone: 10.3.3) [usb] # pwd print Current directory: /var/containers/Bundle/Application/DABF849D-493E-464C-B66B-B8B6C53A4E76/org.owasp.MSTG.app ``` 使用`env`命令获取应用程序的目录,并导航到Documents目录。 ```bash org.owasp.MSTG on (iPhone: 10.3.3) [usb] # cd /var/mobile/Containers/Data/Application/72C7AAFB-1D75-4FBA-9D83-D8B4A2D44133/Documents /var/mobile/Containers/Data/Application/72C7AAFB-1D75-4FBA-9D83-D8B4A2D44133/Documents ``` 使用命令 `file download <文件名>` 可以将文件从iOS设备下载到您的主机计算机,并可以随后进行分析。 ```bash org.owasp.MSTG on (iPhone: 10.3.3) [usb] # file download .com.apple.mobile_container_manager.metadata.plist Downloading /var/mobile/Containers/Data/Application/72C7AAFB-1D75-4FBA-9D83-D8B4A2D44133/.com.apple.mobile_container_manager.metadata.plist to .com.apple.mobile_container_manager.metadata.plist Streaming file from device... Writing bytes to destination... Successfully downloaded /var/mobile/Containers/Data/Application/72C7AAFB-1D75-4FBA-9D83-D8B4A2D44133/.com.apple.mobile_container_manager.metadata.plist to .com.apple.mobile_container_manager.metadata.plist ``` 您还可以使用`file upload `将文件上传到iOS设备。 ## 获取和提取应用程序 ### 从OTA分发链接获取IPA文件 在开发过程中,有时会通过OTA分发将应用程序提供给测试人员。在这种情况下,您将收到一个itms-services链接,例如: ``` itms-services://?action=download-manifest&url=https://s3-ap-southeast-1.amazonaws.com/test-uat/manifest.plist ``` 您可以使用[ITMS服务资产下载器](https://www.npmjs.com/package/itms-services)工具从OTA分发URL下载IPA文件。通过npm安装它: ```bash $ npm install -g itms-services ``` 使用以下命令将IPA文件保存在本地: ```bash # itms-services -u "itms-services://?action=download-manifest&url=https://s3-ap-southeast-1.amazonaws.com/test-uat/manifest.plist" -o - > out.ipa ``` ### 获取应用程序二进制文件 1. **从IPA文件获取**: 如果你有IPA文件(可能包含已解密的应用程序二进制文件),解压缩它并准备好开始。应用程序二进制文件位于主要捆绑目录(.app)中,例如`Payload/Telegram X.app/Telegram X`。有关属性列表提取的详细信息,请参见下一小节。 > 在macOS的Finder中,可以通过右键单击.app目录并选择“显示包内容”来打开。在终端中,您可以直接使用`cd`命令进入目录。 2. **从越狱设备获取**: 如果您没有原始的IPA文件,则需要一个越狱设备,在该设备上**安装该应用程序**(例如通过App Store)。安装完成后,您需要**从内存中提取应用程序二进制文件并重新构建IPA文件**。由于数字版权管理(DRM)的原因,应用程序二进制文件在存储在iOS设备上时是加密的,因此仅仅从捆绑包中提取它(无论是通过SSH还是Objection)是不足以进行逆向工程的(请阅读下一节)。 ### 解密(手动) 与Android应用程序不同,iOS应用程序的二进制文件**只能被反汇编**而不能被反编译。\ 当应用程序提交到应用商店时,苹果首先验证应用程序的行为,然后使用[**FairPlay**](https://developer.apple.com/streaming/fps/)对二进制文件进行加密,然后才将其发布到应用商店。因此,从应用商店下载的二进制文件是加密的,这增加了逆向工程的复杂性。 然而,请注意还有其他**第三方软件可以用于混淆**生成的二进制文件。 为了运行加密的二进制文件,设备需要在内存中对其进行解密。然后,可以**从内存中转储解密后的二进制文件**。 首先,检查二进制文件是否使用了PIE(位置无关代码)标志: ```bash otool -Vh Original_App #Check the last word of the last line of this code Home: Mach header magic cputype cpusubtype caps filetype ncmds sizeofcmds flags MH_MAGIC_64 X86_64 ALL 0x00 EXECUTE 47 6080 NOUNDEFS DYLDLINK TWOLEVEL PIE ``` 如果已经设置,您可以使用脚本[`change_macho_flags.py`](https://chromium.googlesource.com/chromium/src/+/49.0.2623.110/build/mac/change\_mach\_o\_flags.py)来使用python2移除它: ```bash python change_mach_o_flags.py --no-pie Original_App otool -Vh Hello_World Hello_World: Mach header magic cputype cpusubtype caps filetype ncmds sizeofcmds flags MH_MAGIC ARM V7 0x00 EXECUTE 22 2356 NOUNDEFS DYLDLINK TWOLEVEL MH_NO_HEAP_EXECUTION ``` 现在,由于未设置PIE标志,操作系统将每次在**固定的起始位置**加载程序。为了找到这个**位置**,您可以使用: ```bash otool -l Original_App | grep -A 3 LC_SEGMENT | grep -A 1 __TEXT segname __TEXT vmaddr 0x00004000 ``` 然后,需要提取需要转储的内存范围: ```bash otool -l Original_App | grep -A 4 LC_ENCRYPTION_INFO cmd LC_ENCRYPTION_INFO cmdsize 20 cryptoff 16384 cryptsize 17416192 cryptid 0 ``` **`cryptoff`**的值表示加密内容的起始地址,而**`cryptsize`**表示加密内容的大小。 因此,要转储的`起始地址`将是`vmaddr + cryptoff`,而`结束地址`将是`起始地址 + cryptsize`\ 在这种情况下:`起始地址 = 0x4000 + 0x4000 = 0x8000`,而`结束地址 = 0x8000 + 0x109c000 = 0x10a4000` 有了这些信息,只需要在越狱设备上运行应用程序,使用gdb(`gdb -p `)附加到进程并转储内存即可: ```bash dump memory dump.bin 0x8000 0x10a4000 ``` 恭喜!你已经解密了dump.bin中的加密部分。现在**将这个dump传输到你的电脑上,并用解密后的内容覆盖掉加密部分**: ```bash dd bs=1 seek= conv=notrunc if=dump.bin of=Original_App ``` 还有一步要完成。应用程序在其元数据中仍然**指示**它是**加密的**,但实际上**并不是**。然后,当执行时,设备将尝试解密已经解密的部分,但会失败。 然而,你可以使用像[MachOView](https://sourceforge.net/projects/machoview/)这样的工具来更改这些信息。只需打开二进制文件并将**cryptid**设置为0: ![](<../../.gitbook/assets/image (470).png>) ### 解密(自动) #### frida-ios-dump 你可以使用像[frida-ios-dump](https://github.com/AloneMonkey/frida-ios-dump)这样的工具来**自动去除应用程序的加密**。 首先,确保在**Frida-ios-dump**的`dump.py`配置中,当使用**iproxy**时,将其设置为本地主机和端口2222,或者设置为要从中转储二进制文件的设备的实际IP地址和端口。 现在,你可以安全地使用该工具来**枚举已安装的应用程序**: ```bash $ python dump.py -l PID Name Identifier ---- --------------- ------------------------------------- 860 Cydia com.saurik.Cydia 1130 Settings com.apple.Preferences 685 Mail com.apple.mobilemail 834 Telegram ph.telegra.Telegraph - Stocks com.apple.stocks ... ``` 你可以**转储**列出的二进制文件之一: ```bash $ python3 dump.py -u "root" -p "" ph.telegra.Telegraph Start the target app ph.telegra.Telegraph Dumping Telegram to /var/folders/qw/gz47_8_n6xx1c_lwq7pq5k040000gn/T [frida-ios-dump]: HockeySDK.framework has been loaded. [frida-ios-dump]: Load Postbox.framework success. [frida-ios-dump]: libswiftContacts.dylib has been dlopen. ... start dump /private/var/containers/Bundle/Application/14002D30-B113-4FDF-BD25-1BF740383149/Telegram.app/Frameworks/libswiftsimd.dylib libswiftsimd.dylib.fid: 100%|██████████| 343k/343k [00:00<00:00, 1.54MB/s] start dump /private/var/containers/Bundle/Application/14002D30-B113-4FDF-BD25-1BF740383149/Telegram.app/Frameworks/libswiftCoreData.dylib libswiftCoreData.dylib.fid: 100%|██████████| 82.5k/82.5k [00:00<00:00, 477kB/s] 5.m4a: 80.9MB [00:14, 5.85MB/s] 0.00B [00:00, ?B/s]Generating "Telegram.ipa" ``` 完成后,`Telegram.ipa` 文件将在当前目录中创建。您可以通过删除应用程序并重新安装它(例如使用 [**ios-deploy**](https://github.com/ios-control/ios-deploy) `ios-deploy -b Telegram.ipa`)来验证转储的成功。请注意,这仅适用于越狱设备,否则签名将无效。 #### flexdecrypt 为了从已安装的应用程序中**获取ipa文件**,您还可以使用工具 [**flexdecrypt**](https://github.com/JohnCoates/flexdecrypt) 或该工具的包装器 [**flexdump**](https://gist.github.com/defparam/71d67ee738341559c35c684d659d40ac)**。**\ 无论哪种情况,您都需要在设备上**安装flexdecrypt**,可以运行以下命令: ```markup wget https://github.com/JohnCoates/flexdecrypt/releases/download/1.1/flexdecrypt.deb dpkg -i flexdecrypt.deb rm flexdecrypt.deb ``` 为了使用**flexdump**: ```bash apt install zip unzip wget https://gist.githubusercontent.com/defparam/71d67ee738341559c35c684d659d40ac/raw/30c7612262f1faf7871ba8e32fbe29c0f3ef9e27/flexdump -P /usr/local/bin; chmod +x /usr/local/bin/flexdump flexdump list #List apps flexdump dump Twitter.app #Create .ipa file from app ``` #### bagbak 又一个基于Frida的应用程序解密工具。需要越狱的iOS设备和[frida.re](https://www.frida.re/)。 ```bash bagbak --raw Chrome ``` #### r2flutch [**r2flutch**](https://github.com/as0ler/r2flutch) 是一个使用 **radare** 和 **frida** 来 **解密** 和 **转储 iOS 应用程序** 的工具。 更多信息请参阅 **github**。 ## 安装应用程序 当您在不使用苹果的应用商店的情况下安装应用程序时,这被称为 **侧载**。有多种侧载的方式,下面将对其进行描述。在 iOS 设备上,实际的安装过程由 **installd 守护进程** 处理,该进程将解压并安装应用程序。为了集成应用程序服务或在 iOS 设备上安装应用程序,所有的 **应用程序必须使用由 Apple 颁发的证书进行签名**。这意味着只有在成功进行代码签名验证后,应用程序才能被安装。然而,在越狱手机上,您可以通过 [**AppSync**](http://repo.hackyouriphone.org/appsyncunified) 来 **绕过这个安全功能**,AppSync 是 Cydia 商店中提供的一个软件包,它包含了许多利用越狱提供的 root 权限执行高级功能的有用应用程序。**AppSync 是一个修补 installd 的插件**,允许安装伪签名的 IPA 包。 有不同的方法可以将 IPA 包安装到 iOS 设备上,下面将详细描述这些方法。 > 请注意,iTunes 在 macOS Catalina 中不再可用。如果您使用的是较旧版本的 macOS,则仍然可以使用 iTunes,但自 iTunes 12.7 以来,无法安装应用程序。 #### Cydia Impactor [Cydia Impactor](http://www.cydiaimpactor.com) 最初是用于越狱 iPhone 的,但已经被重新编写为通过侧载方式对 iOS 设备进行 IPA 包的签名和安装(甚至可以对 Android 设备进行 APK 文件的签名和安装)。Cydia Impactor 可在 Windows、macOS 和 Linux 上使用。[yalujailbreak.net](https://yalujailbreak.net/how-to-use-cydia-impactor/) 上提供了一份逐步指南和故障排除步骤。 #### libimobiledevice 在 Linux 和 macOS 上,您还可以使用 [libimobiledevice](https://www.libimobiledevice.org),这是一个跨平台的软件协议库和一组用于与 iOS 设备进行本地通信的工具。这使您可以通过执行 ideviceinstaller 来通过 USB 连接安装应用程序。连接是通过 USB 多路复用守护进程 [usbmuxd](https://www.theiphonewiki.com/wiki/Usbmux) 实现的,它在 USB 上提供了一个 TCP 隧道。 libimobiledevice 的软件包将在您的 Linux 软件包管理器中提供。在 macOS 上,您可以通过 brew 安装 libimobiledevice: ```bash $ brew install libimobiledevice $ brew install ideviceinstaller ``` 安装完成后,您将获得几个新的命令行工具,例如`ideviceinfo`,`ideviceinstaller`或`idevicedebug`。 ```bash # The following command will show detailed information about the iOS device connected via USB. $ ideviceinfo # The following command will install the IPA to your iOS device. $ ideviceinstaller -i iGoat-Swift_v1.0-frida-codesigned.ipa ... Install: Complete # The following command will start the app in debug mode, by providing the bundle name. The bundle name can be found in the previous command after "Installing". $ idevicedebug -d run OWASP.iGoat-Swift ``` #### ipainstaller 可以使用[ipainstaller](https://github.com/autopear/ipainstaller)命令行直接在iOS设备上安装IPA文件。将文件通过scp等方式复制到设备上后,可以使用ipainstaller执行IPA文件的文件名: ```bash $ ipainstaller App_name.ipa ``` #### ios-deploy 在 macOS 上,您还可以使用 **ios-deploy** 工具通过命令行安装 iOS 应用程序。您需要解压缩您的 IPA 文件,因为 ios-deploy 使用应用程序包来安装应用程序。 ```bash $ unzip Name.ipa $ ios-deploy --bundle 'Payload/Name.app' -W -d -v ``` 在iOS设备上安装应用程序后,您可以通过添加`-m`标志来直接启动调试,而无需再次安装应用程序。 ```bash $ ios-deploy --bundle 'Payload/Name.app' -W -d -v -m ``` #### Xcode 也可以使用Xcode集成开发环境来安装iOS应用程序,具体步骤如下: 1. 启动Xcode 2. 选择**窗口/设备和模拟器** 3. 选择连接的iOS设备,然后点击**已安装的应用**中的**+**号。 #### 允许在非iPad设备上安装应用程序 有时候某个应用程序可能要求在iPad设备上使用。如果你只有iPhone或iPod touch设备,你可以通过将**Info.plist**文件中的**UIDeviceFamily**属性的值更改为**1**来强制应用程序接受在这些设备上安装和使用。 ```markup UIDeviceFamily 1 ``` 需要注意的是,更改此值将破坏IPA文件的原始签名,因此您需要在更新后重新签名IPA,以便在未禁用签名验证的设备上安装它。 如果应用程序需要与现代iPad特定的功能,而您的iPhone或iPod较旧,则此绕过可能无效。 可以在Apple开发者文档中找到属性[UIDeviceFamily](https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/iPhoneOSKeys.html#//apple\_ref/doc/uid/TP40009252-SW11)的可能值。
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥 * 您在**网络安全公司**工作吗?您想在HackTricks中看到您的**公司广告**吗?或者您想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)! * 发现我们的独家[NFT收藏品**The PEASS Family**](https://opensea.io/collection/the-peass-family) * 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com) * **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass),或在**Twitter**上**关注**我[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。** * **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享您的黑客技巧。**