mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-26 22:52:06 +00:00
195 lines
13 KiB
Markdown
195 lines
13 KiB
Markdown
# iOS 기본 테스트 작업
|
|
|
|
{% hint style="success" %}
|
|
AWS 해킹 배우기 및 연습하기:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
|
GCP 해킹 배우기 및 연습하기: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
|
|
|
<details>
|
|
|
|
<summary>HackTricks 지원하기</summary>
|
|
|
|
* [**구독 계획**](https://github.com/sponsors/carlospolop) 확인하기!
|
|
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 참여하거나 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
|
|
* **[**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 리포지토리에 PR을 제출하여 해킹 팁을 공유하세요.**
|
|
|
|
</details>
|
|
{% endhint %}
|
|
|
|
## **iOS 기기 식별 및 접근 요약**
|
|
|
|
### **iOS 기기의 UDID 식별하기**
|
|
|
|
iOS 기기를 고유하게 식별하기 위해 40자리 시퀀스인 UDID가 사용됩니다. macOS Catalina 이상에서는 **Finder 앱**에서 이를 찾을 수 있으며, iTunes는 더 이상 존재하지 않습니다. USB로 연결된 기기를 Finder에서 선택하면, 이름 아래의 세부 정보를 클릭하여 UDID를 포함한 기타 정보를 확인할 수 있습니다.
|
|
|
|
Catalina 이전 버전의 macOS에서는 iTunes가 UDID 발견을 용이하게 합니다. 자세한 지침은 [여기](http://www.iclarified.com/52179/how-to-find-your-iphones-udid)에서 확인할 수 있습니다.
|
|
|
|
명령줄 도구는 UDID를 검색하는 대체 방법을 제공합니다:
|
|
|
|
* **I/O Registry Explorer 도구 `ioreg` 사용하기:**
|
|
```bash
|
|
$ ioreg -p IOUSB -l | grep "USB Serial"
|
|
```
|
|
* **macOS (및 Linux)에서 `ideviceinstaller` 사용하기:**
|
|
```bash
|
|
$ brew install ideviceinstaller
|
|
$ idevice_id -l
|
|
```
|
|
* **`system_profiler` 활용:**
|
|
```bash
|
|
$ system_profiler SPUSBDataType | sed -n -e '/iPad/,/Serial/p;/iPhone/,/Serial/p;/iPod/,/Serial/p' | grep "Serial Number:"
|
|
```
|
|
* **`instruments`를 사용하여 장치 나열하기:**
|
|
```bash
|
|
$ instruments -s devices
|
|
```
|
|
### **디바이스 셸 접근**
|
|
|
|
**SSH 접근**은 탈옥 후 **OpenSSH 패키지**를 설치하여 활성화되며, `ssh root@<device_ip_address>`를 통해 연결할 수 있습니다. 디바이스를 보호하기 위해 `root`와 `mobile` 사용자에 대한 기본 비밀번호(`alpine`)를 변경하는 것이 중요합니다.
|
|
|
|
**USB를 통한 SSH**는 Wi-Fi가 없을 경우 필요하며, `iproxy`를 사용하여 SSH 연결을 위한 디바이스 포트를 매핑합니다. 이 설정은 다음 명령어를 실행하여 USB를 통해 SSH 접근을 가능하게 합니다:
|
|
```bash
|
|
$ iproxy 2222 22
|
|
$ ssh -p 2222 root@localhost
|
|
```
|
|
**온디바이스 셸 애플리케이션**은 NewTerm 2와 같은 도구로, 직접적인 장치 상호작용을 용이하게 하며, 문제 해결에 특히 유용합니다. **리버스 SSH 셸**도 호스트 컴퓨터에서 원격 액세스를 위해 설정할 수 있습니다.
|
|
|
|
### **잊어버린 비밀번호 재설정**
|
|
|
|
잊어버린 비밀번호를 기본값(`alpine`)으로 재설정하려면 `/private/etc/master.passwd` 파일을 편집해야 합니다. 이는 기존 해시를 `root` 및 `mobile` 사용자 항목 옆에 있는 `alpine` 해시로 교체하는 것을 포함합니다.
|
|
|
|
## **데이터 전송 기술**
|
|
|
|
### **앱 데이터 파일 전송**
|
|
|
|
**SSH 및 SCP를 통한 아카이빙 및 검색:** `tar`를 사용하여 애플리케이션의 Data 디렉토리를 아카이브한 다음 `scp`를 사용하여 전송하는 것은 간단합니다. 아래 명령은 Data 디렉토리를 .tgz 파일로 아카이브한 후 장치에서 가져옵니다:
|
|
```bash
|
|
tar czvf /tmp/data.tgz /private/var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8EF8-8F5560EB0693
|
|
exit
|
|
scp -P 2222 root@localhost:/tmp/data.tgz .
|
|
```
|
|
### **그래픽 사용자 인터페이스 도구**
|
|
|
|
**iFunbox와 iExplorer 사용:** 이 GUI 도구는 iOS 장치의 파일을 관리하는 데 유용합니다. 그러나 iOS 8.4부터 Apple은 장치가 탈옥되지 않는 한 이러한 도구의 애플리케이션 샌드박스 접근을 제한했습니다.
|
|
|
|
### **파일 관리를 위한 Objection 사용**
|
|
|
|
**Objection을 통한 인터랙티브 셸:** Objection을 실행하면 앱의 Bundle 디렉토리에 접근할 수 있습니다. 여기에서 앱의 Documents 디렉토리로 이동하고 파일을 관리할 수 있으며, iOS 장치로부터 파일을 다운로드하고 업로드할 수 있습니다.
|
|
```bash
|
|
objection --gadget com.apple.mobilesafari explorer
|
|
cd /var/mobile/Containers/Data/Application/72C7AAFB-1D75-4FBA-9D83-D8B4A2D44133/Documents
|
|
file download <filename>
|
|
```
|
|
## **앱 얻기 및 추출하기**
|
|
|
|
### **IPA 파일 획득하기**
|
|
|
|
**OTA 배포 링크:** OTA를 통해 테스트용으로 배포된 앱은 ITMS 서비스 자산 다운로드 도구를 사용하여 다운로드할 수 있으며, 이 도구는 npm을 통해 설치되고 IPA 파일을 로컬에 저장하는 데 사용됩니다.
|
|
```bash
|
|
npm install -g itms-services
|
|
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를 압축 해제하여 복호화된 앱 바이너리에 접근합니다.
|
|
2. **탈옥된 장치에서:** 앱을 설치하고 메모리에서 복호화된 바이너리를 추출합니다.
|
|
|
|
### **복호화 과정**
|
|
|
|
**수동 복호화 개요:** iOS 앱 바이너리는 Apple의 FairPlay를 사용하여 암호화됩니다. 리버스 엔지니어링을 위해서는 메모리에서 복호화된 바이너리를 덤프해야 합니다. 복호화 과정은 PIE 플래그를 확인하고, 메모리 플래그를 조정하며, 암호화된 섹션을 식별한 후 이 섹션을 복호화된 형태로 덤프하고 교체하는 것을 포함합니다.
|
|
|
|
**PIE 플래그 확인 및 수정:**
|
|
```bash
|
|
otool -Vh Original_App
|
|
python change_macho_flags.py --no-pie Original_App
|
|
otool -Vh Hello_World
|
|
```
|
|
**암호화된 섹션 식별 및 메모리 덤프:**
|
|
|
|
`otool`을 사용하여 암호화된 섹션의 시작 및 끝 주소를 확인하고, gdb를 사용하여 탈옥된 장치에서 메모리를 덤프합니다.
|
|
```bash
|
|
otool -l Original_App | grep -A 4 LC_ENCRYPTION_INFO
|
|
dump memory dump.bin 0x8000 0x10a4000
|
|
```
|
|
**암호화된 섹션 덮어쓰기:**
|
|
|
|
원본 앱 바이너리의 암호화된 섹션을 복호화된 덤프로 교체합니다.
|
|
```bash
|
|
dd bs=1 seek=<starting_address> conv=notrunc if=dump.bin of=Original_App
|
|
```
|
|
**최종 복호화:** **MachOView**와 같은 도구를 사용하여 이진 파일의 메타데이터를 수정하여 암호화가 없음을 나타내고 `cryptid`를 0으로 설정합니다.
|
|
|
|
### **복호화 (자동으로)**
|
|
|
|
#### **frida-ios-dump**
|
|
[**frida-ios-dump**](https://github.com/AloneMonkey/frida-ios-dump) 도구는 iOS 장치에서 **자동으로 앱을 복호화하고 추출하는 데** 사용됩니다. 처음에는 `dump.py`를 구성하여 iOS 장치에 연결해야 하며, 이는 **iproxy**를 통해 localhost의 포트 2222로 하거나 장치의 IP 주소와 포트를 통해 직접 수행할 수 있습니다.
|
|
|
|
장치에 설치된 애플리케이션은 다음 명령어로 나열할 수 있습니다:
|
|
```bash
|
|
$ python dump.py -l
|
|
```
|
|
특정 앱, 예를 들어 Telegram을 덤프하려면 다음 명령어를 사용합니다:
|
|
```bash
|
|
$ python3 dump.py -u "root" -p "<PASSWORD>" ph.telegra.Telegraph
|
|
```
|
|
이 명령은 앱 덤프를 시작하여 현재 디렉토리에 `Telegram.ipa` 파일을 생성합니다. 이 과정은 탈옥된 장치에 적합하며, 서명되지 않았거나 가짜 서명된 앱은 [**ios-deploy**](https://github.com/ios-control/ios-deploy)와 같은 도구를 사용하여 재설치할 수 있습니다.
|
|
|
|
#### **flexdecrypt**
|
|
[**flexdecrypt**](https://github.com/JohnCoates/flexdecrypt) 도구와 그 래퍼 [**flexdump**](https://gist.github.com/defparam/71d67ee738341559c35c684d659d40ac)는 설치된 애플리케이션에서 IPA 파일을 추출할 수 있게 해줍니다. 장치에서 **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
|
|
flexdump dump Twitter.app
|
|
```
|
|
#### **bagbak**
|
|
[**bagbak**](https://github.com/ChiChou/bagbak), 또 다른 Frida 기반 도구로, 앱 복호화를 위해 탈옥된 장치가 필요합니다:
|
|
```bash
|
|
bagbak --raw Chrome
|
|
```
|
|
#### **r2flutch**
|
|
**r2flutch**는 radare와 frida를 활용하여 앱을 복호화하고 덤프하는 데 사용됩니다. 더 많은 정보는 [**GitHub 페이지**](https://github.com/as0ler/r2flutch)에서 확인할 수 있습니다.
|
|
|
|
### **앱 설치하기**
|
|
|
|
**사이드로딩**은 공식 App Store 외부에서 애플리케이션을 설치하는 것을 의미합니다. 이 과정은 **installd daemon**에 의해 처리되며, 앱은 Apple에서 발급한 인증서로 서명되어야 합니다. 탈옥된 장치는 **AppSync**를 통해 이를 우회하여 가짜 서명된 IPA 패키지를 설치할 수 있습니다.
|
|
|
|
#### **사이드로딩 도구**
|
|
|
|
- **Cydia Impactor**: iOS에서 IPA 파일과 Android에서 APK 파일을 서명하고 설치하는 도구입니다. 가이드와 문제 해결 방법은 [yalujailbreak.net](https://yalujailbreak.net/how-to-use-cydia-impactor/)에서 확인할 수 있습니다.
|
|
|
|
- **libimobiledevice**: iOS 장치와 통신하기 위한 Linux 및 macOS용 라이브러리입니다. USB를 통해 앱을 설치하기 위한 ideviceinstaller의 설치 명령과 사용 예제가 제공됩니다.
|
|
|
|
- **ipainstaller**: 이 명령줄 도구는 iOS 장치에 직접 앱을 설치할 수 있게 해줍니다.
|
|
|
|
- **ios-deploy**: macOS 사용자를 위해 ios-deploy는 명령줄에서 iOS 앱을 설치합니다. IPA 파일을 압축 해제하고 직접 앱을 실행하기 위해 `-m` 플래그를 사용하는 것이 과정의 일부입니다.
|
|
|
|
- **Xcode**: Xcode를 사용하여 **Window/Devices and Simulators**로 이동하고 앱을 **Installed Apps**에 추가하여 앱을 설치합니다.
|
|
|
|
#### **비 iPad 장치에서 애플리케이션 설치 허용**
|
|
iPhone 또는 iPod touch 장치에 iPad 전용 애플리케이션을 설치하려면 **Info.plist** 파일의 **UIDeviceFamily** 값을 **1**로 변경해야 합니다. 그러나 이 수정은 서명 검증 체크로 인해 IPA 파일을 다시 서명해야 합니다.
|
|
|
|
**참고**: 이 방법은 애플리케이션이 구형 iPhone 또는 iPod touch를 사용할 때 최신 iPad 모델에만 해당되는 기능을 요구하는 경우 실패할 수 있습니다.
|
|
|
|
|
|
|
|
## References
|
|
* [https://mas.owasp.org/MASTG/iOS/0x06b-iOS-Security-Testing/](ttps://mas.owasp.org/MASTG/iOS/0x06b-iOS-Security-Testing/)
|
|
* [https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0052/](https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0052/)
|
|
* [https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0053/](https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0053/)
|
|
* [https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0054/](https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0054/)
|
|
* [https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0056/](https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0056/)
|
|
|
|
{% hint style="success" %}
|
|
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
|
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
|
|
|
<details>
|
|
|
|
<summary>Support HackTricks</summary>
|
|
|
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
|
|
|
</details>
|
|
{% endhint %}
|