hacktricks/mobile-pentesting/ios-pentesting/basic-ios-testing-operations.md

24 KiB
Raw Blame History

iOS基本测试操作

☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

获取iOS设备的UDID

{% hint style="info" %} 在执行这些操作之前,通过USB将设备连接到计算机解锁设备。 {% endhint %}

UDID是一个40位数字和字母的唯一序列用于标识iOS设备。您可以在macOS Catalina及更高版本的Finder应用程序中找到iOS设备的UDID因为Catalina中不再提供iTunes。只需在Finder中选择连接的iOS设备然后单击iOS设备名称下的信息以遍历它。除了UDID您还可以找到序列号、IMEI和其他有用的信息。

如果您使用的是Catalina之前的macOS版本您可以通过iTunes找到您的iOS设备的UDID选择您的设备然后在摘要选项卡中点击“序列号”。点击后您将遍历iOS设备的不同元数据包括其UDID。

还可以在macOS上使用各种命令行工具获取设备连接的UDID

$ ioreg -p IOUSB -l | grep "USB Serial"
|         "USB Serial Number" = "9e8ada44246cee813e2f8c1407520bf2f84849ec"
$ brew install ideviceinstaller
$ idevice_id -l
316f01bd160932d2bf2f95f1f142bc29b1c62dbc
  • 使用system_profiler
$ 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
$ instruments -s devices

访问设备Shell

越狱设备后,您应该安装了一些新的应用程序管理器,如Cydia

SSH

为了启用对iOS设备的SSH访问您可以安装OpenSSH 。安装完成后,您可以通过运行ssh root@<device_ip_address>访问您的设备这将以root用户身份登录您的设备

$ ssh root@192.168.197.234
root@192.168.197.234's password:
iPhone:~ root#

当通过SSH访问您的iOS设备时请考虑以下事项

  • 默认用户是rootmobile
  • 两者的默认密码都是**alpine**。

请记住,要更改rootmobile用户的默认密码因为在同一网络上的任何人都可以找到您设备的IP地址并使用众所周知的默认密码连接这将使他们获得对您设备的root访问权限。

通过USB连接到设备的SSH

在真实的黑盒测试中可靠的Wi-Fi连接可能不可用。在这种情况下您可以使用usbmuxd通过USB连接到设备的SSH服务器。

通过安装和启动iproxy将macOS连接到iOS设备

$ brew install libimobiledevice
$ iproxy 2222 22
waiting for connection

上述命令将iOS设备上的端口22映射到本地主机上的端口2222。如果您不想每次都运行二进制文件来通过USB进行SSH连接您还可以使iproxy在后台自动运行

使用以下命令在新的终端窗口中,您可以连接到设备:

$ 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来实现此目的在撰写本文时它支持iOS 6.0至12.1.2)。

此外有一些越狱工具明确禁用了传入的SSH连接出于安全原因。在这些情况下拥有一个设备上的shell应用程序非常方便您可以使用它首先通过反向shell从设备中SSH出去然后从主机计算机连接到它。

通过运行以下命令可以打开一个SSH反向shellssh -R <remote_port>:localhost:22 <username>@<host_computer_ip>

在设备上的shell应用程序中运行以下命令并在提示时输入主机计算机的mstg用户密码:

ssh -R 2222:localhost:22 mstg@192.168.197.235

在您的主机计算机上运行以下命令并在要求时输入iOS设备的root用户密码:

$ ssh -p 2222 root@localhost

忘记密码

如果你忘记了密码并想要将其重置为默认的 alpine

  1. 使用设备上的终端或使用诸如 FilzaiFile 的应用程序编辑你的越狱 iOS 设备上的文件 /private/etc/master.passwd
  2. 找到以下行:
root:xxxxxxxxx:0:0::0:0:System Administrator:/var/root:/bin/sh
mobile:xxxxxxxxx:501:501::0:0:Mobile User:/var/mobile:/bin/sh
  1. xxxxxxxxx 更改为 /smx7MYTQIi2M(这是密码 alpine 的哈希值)
  2. 保存并退出

数据传输

通过 SSH 和 SCP 复制应用数据文件

现在我们知道,我们的应用文件存储在 Data 目录中。你现在可以使用 tar 将 Data 目录打包,并使用 scp 从设备中拉取它:

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 是一个图形用户界面应用程序,可用于多种用途(包括上传/下载文件)。
另一个用于此目的的图形用户界面工具是 iExplorer

{% hint style="info" %} 从iOS 8.4版本开始苹果限制了第三方管理器对应用程序沙盒的访问权限因此如果设备没有越狱像iFunbox和iExplorer这样的工具将无法显示/检索设备上安装的应用程序的文件。 {% endhint %}

使用Objection

当您启动objectionobjection --gadget com.apple.mobilesafari explorer您将在Bundle目录中找到提示符。

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目录。

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设备下载到您的主机计算机并可以随后进行分析。

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 <local_file_path>将文件上传到iOS设备。

获取和提取应用程序

从OTA分发链接获取IPA文件

在开发过程中有时会通过OTA分发将应用程序提供给测试人员。在这种情况下您将收到一个itms-services链接例如

itms-services://?action=download-manifest&url=https://s3-ap-southeast-1.amazonaws.com/test-uat/manifest.plist

您可以使用ITMS服务资产下载器工具从OTA分发URL下载IPA文件。通过npm安装它

$ npm install -g itms-services

使用以下命令将IPA文件保存在本地

# 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命令进入目录。

  1. 从越狱设备获取

如果您没有原始的IPA文件则需要一个越狱设备在该设备上安装该应用程序例如通过App Store。安装完成后您需要从内存中提取应用程序二进制文件并重新构建IPA文件。由于数字版权管理DRM的原因应用程序二进制文件在存储在iOS设备上时是加密的因此仅仅从捆绑包中提取它无论是通过SSH还是Objection是不足以进行逆向工程的请阅读下一节

解密(手动)

与Android应用程序不同iOS应用程序的二进制文件只能被反汇编而不能被反编译。
当应用程序提交到应用商店时,苹果首先验证应用程序的行为,然后使用FairPlay对二进制文件进行加密,然后才将其发布到应用商店。因此,从应用商店下载的二进制文件是加密的,这增加了逆向工程的复杂性。

然而,请注意还有其他第三方软件可以用于混淆生成的二进制文件。

为了运行加密的二进制文件,设备需要在内存中对其进行解密。然后,可以从内存中转储解密后的二进制文件

首先检查二进制文件是否使用了PIE位置无关代码标志

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来使用python2移除它

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标志操作系统将每次在固定的起始位置加载程序。为了找到这个位置,您可以使用:

otool -l Original_App | grep -A 3 LC_SEGMENT | grep -A 1 __TEXT
segname __TEXT
vmaddr 0x00004000

然后,需要提取需要转储的内存范围:

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

有了这些信息只需要在越狱设备上运行应用程序使用gdbgdb -p <pid>)附加到进程并转储内存即可:

dump memory dump.bin 0x8000 0x10a4000

恭喜你已经解密了dump.bin中的加密部分。现在将这个dump传输到你的电脑上并用解密后的内容覆盖掉加密部分

dd bs=1 seek=<starting_address> conv=notrunc if=dump.bin of=Original_App

还有一步要完成。应用程序在其元数据中仍然指示它是加密的,但实际上并不是。然后,当执行时,设备将尝试解密已经解密的部分,但会失败。

然而,你可以使用像MachOView这样的工具来更改这些信息。只需打开二进制文件并将cryptid设置为0

解密(自动)

frida-ios-dump

你可以使用像frida-ios-dump这样的工具来自动去除应用程序的加密

首先,确保在Frida-ios-dumpdump.py配置中,当使用iproxy将其设置为本地主机和端口2222或者设置为要从中转储二进制文件的设备的实际IP地址和端口。

现在,你可以安全地使用该工具来枚举已安装的应用程序

$ 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
...

你可以转储列出的二进制文件之一:

$ python3 dump.py -u "root" -p "<PASSWORD>" 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 ios-deploy -b Telegram.ipa)来验证转储的成功。请注意,这仅适用于越狱设备,否则签名将无效。

flexdecrypt

为了从已安装的应用程序中获取ipa文件,您还可以使用工具 flexdecrypt 或该工具的包装器 flexdump
无论哪种情况,您都需要在设备上安装flexdecrypt,可以运行以下命令:

wget https://github.com/JohnCoates/flexdecrypt/releases/download/1.1/flexdecrypt.deb
dpkg -i flexdecrypt.deb
rm flexdecrypt.deb

为了使用flexdump

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

bagbak --raw Chrome

r2flutch

r2flutch 是一个使用 radarefrida解密转储 iOS 应用程序 的工具。

更多信息请参阅 github

安装应用程序

当您在不使用苹果的应用商店的情况下安装应用程序时,这被称为 侧载。有多种侧载的方式,下面将对其进行描述。在 iOS 设备上,实际的安装过程由 installd 守护进程 处理,该进程将解压并安装应用程序。为了集成应用程序服务或在 iOS 设备上安装应用程序,所有的 应用程序必须使用由 Apple 颁发的证书进行签名。这意味着只有在成功进行代码签名验证后,应用程序才能被安装。然而,在越狱手机上,您可以通过 AppSync绕过这个安全功能AppSync 是 Cydia 商店中提供的一个软件包,它包含了许多利用越狱提供的 root 权限执行高级功能的有用应用程序。AppSync 是一个修补 installd 的插件,允许安装伪签名的 IPA 包。

有不同的方法可以将 IPA 包安装到 iOS 设备上,下面将详细描述这些方法。

请注意iTunes 在 macOS Catalina 中不再可用。如果您使用的是较旧版本的 macOS则仍然可以使用 iTunes但自 iTunes 12.7 以来,无法安装应用程序。

Cydia Impactor

Cydia Impactor 最初是用于越狱 iPhone 的,但已经被重新编写为通过侧载方式对 iOS 设备进行 IPA 包的签名和安装(甚至可以对 Android 设备进行 APK 文件的签名和安装。Cydia Impactor 可在 Windows、macOS 和 Linux 上使用。yalujailbreak.net 上提供了一份逐步指南和故障排除步骤。

libimobiledevice

在 Linux 和 macOS 上,您还可以使用 libimobiledevice,这是一个跨平台的软件协议库和一组用于与 iOS 设备进行本地通信的工具。这使您可以通过执行 ideviceinstaller 来通过 USB 连接安装应用程序。连接是通过 USB 多路复用守护进程 usbmuxd 实现的,它在 USB 上提供了一个 TCP 隧道。

libimobiledevice 的软件包将在您的 Linux 软件包管理器中提供。在 macOS 上,您可以通过 brew 安装 libimobiledevice

$ brew install libimobiledevice
$ brew install ideviceinstaller

安装完成后,您将获得几个新的命令行工具,例如ideviceinfoideviceinstalleridevicedebug

# 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命令行直接在iOS设备上安装IPA文件。将文件通过scp等方式复制到设备上后可以使用ipainstaller执行IPA文件的文件名

$ ipainstaller App_name.ipa

ios-deploy

在 macOS 上,您还可以使用 ios-deploy 工具通过命令行安装 iOS 应用程序。您需要解压缩您的 IPA 文件,因为 ios-deploy 使用应用程序包来安装应用程序。

$ unzip Name.ipa
$ ios-deploy --bundle 'Payload/Name.app' -W -d -v

在iOS设备上安装应用程序后您可以通过添加-m标志来直接启动调试,而无需再次安装应用程序。

$ 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来强制应用程序接受在这些设备上安装和使用。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>

<key>UIDeviceFamily</key>
<array>
<integer>1</integer>
</array>

</dict>
</plist>

需要注意的是更改此值将破坏IPA文件的原始签名因此您需要在更新后重新签名IPA以便在未禁用签名验证的设备上安装它。

如果应用程序需要与现代iPad特定的功能而您的iPhone或iPod较旧则此绕过可能无效。

可以在Apple开发者文档中找到属性UIDeviceFamily的可能值。

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥