# 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来分享您的黑客技巧。**