24 KiB
iOS基本测试操作
☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- 你在一家网络安全公司工作吗?你想在HackTricks中看到你的公司广告吗?或者你想获得PEASS的最新版本或下载PDF格式的HackTricks吗?请查看订阅计划!
- 发现我们的独家NFT收藏品The PEASS Family
- 获取官方PEASS和HackTricks周边产品
- 加入💬 Discord群组 或 Telegram群组 或 关注我在Twitter上的🐦@carlospolopm。
- 通过向hacktricks repo 和hacktricks-cloud repo 提交PR来分享你的黑客技巧。
获取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:
- 使用I/O Registry Explorer工具
ioreg
:
$ ioreg -p IOUSB -l | grep "USB Serial"
| "USB Serial Number" = "9e8ada44246cee813e2f8c1407520bf2f84849ec"
- 使用ideviceinstaller(也可在Linux上使用):
$ 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设备时,请考虑以下事项:
- 默认用户是
root
和mobile
。 - 两者的默认密码都是**
alpine
**。
请记住,要更改
root
和mobile
用户的默认密码,因为在同一网络上的任何人都可以找到您设备的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反向shell:ssh -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
:
- 使用设备上的终端或使用诸如 Filza 或 iFile 的应用程序编辑你的越狱 iOS 设备上的文件
/private/etc/master.passwd
- 找到以下行:
root:xxxxxxxxx:0:0::0:0:System Administrator:/var/root:/bin/sh
mobile:xxxxxxxxx:501:501::0:0:Mobile User:/var/mobile:/bin/sh
- 将
xxxxxxxxx
更改为/smx7MYTQIi2M
(这是密码alpine
的哈希值) - 保存并退出
数据传输
通过 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
当您启动objection(objection --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
获取应用程序二进制文件
- 从IPA文件获取:
如果你有IPA文件(可能包含已解密的应用程序二进制文件),解压缩它并准备好开始。应用程序二进制文件位于主要捆绑目录(.app)中,例如Payload/Telegram X.app/Telegram X
。有关属性列表提取的详细信息,请参见下一小节。
在macOS的Finder中,可以通过右键单击.app目录并选择“显示包内容”来打开。在终端中,您可以直接使用
cd
命令进入目录。
- 从越狱设备获取:
如果您没有原始的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
有了这些信息,只需要在越狱设备上运行应用程序,使用gdb(gdb -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-dump的dump.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 是一个使用 radare 和 frida 来 解密 和 转储 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
安装完成后,您将获得几个新的命令行工具,例如ideviceinfo
,ideviceinstaller
或idevicedebug
。
# 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应用程序,具体步骤如下:
- 启动Xcode
- 选择窗口/设备和模拟器
- 选择连接的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 🎥
- 您在网络安全公司工作吗?您想在HackTricks中看到您的公司广告吗?或者您想获得PEASS的最新版本或下载PDF格式的HackTricks吗?请查看订阅计划!
- 发现我们的独家NFT收藏品The PEASS Family
- 获取官方PEASS和HackTricks周边产品
- 加入💬 Discord群组或电报群组,或在Twitter上关注我🐦@carlospolopm。
- 通过向hacktricks repo 和hacktricks-cloud repo 提交PR来分享您的黑客技巧。