Translated ['src/mobile-pentesting/ios-pentesting/ios-pentesting-without

This commit is contained in:
Translator 2025-07-12 18:08:20 +00:00
parent 6d8bbfcbcf
commit d692ac4b1f
2 changed files with 105 additions and 12 deletions

View File

@ -4,11 +4,11 @@
## Main idea
**`get_task_allow`** 권한으로 서명된 애플리케이션은 타사 애플리케이션이 **`task_for_pid()`**라는 함수를 초기 애플리케이션의 프로세스 ID를 인수로 사용하여 실행할 수 있도록 허용하여 해당 작업 포트를 가져올 수 있게 합니다(제어하고 메모리에 접근할 수 있음).
**`get_task_allow`** 권한으로 서명된 애플리케이션은 타사 애플리케이션이 **`task_for_pid()`**라는 함수를 초기 애플리케이션의 프로세스 ID를 인수로 사용하여 실행할 수 있도록 허용하여 해당 작업 포트를 얻을 수 있게 합니다(제어하고 메모리에 접근할 수 있게 됨).
하지만 IPA를 가져와서 권한으로 재서명한 후 장치에 다시 플래시하는 것은 그리 간단하지 않습니다. 이는 FairPlay 보호 때문입니다. 앱의 서명이 변경되면 DRM(디지털 권리 관리) 키가 **무효화되어 앱이 작동하지 않습니다**.
하지만 IPA를 가져와서 권한으로 재서명한 후 장치에 다시 플래시하는 것만으로는 쉽지 않습니다. 이는 FairPlay 보호 때문입니다. 앱의 서명이 변경되면 DRM(디지털 권리 관리) 키가 **무효화되어 앱이 작동하지 않습니다**.
구형 탈옥된 장치에서는 IPA를 설치하고, **좋아하는 도구를 사용하여 복호화한 후**(예: Iridium 또는 frida-ios-dump) 장치에서 다시 가져올 수 있습니다. 가능하다면 복호화된 IPA를 클라이언트에게 요청하는 것이 좋습니다.
구형 탈옥된 장치에서는 IPA를 설치하고, **좋아하는 도구**(예: Iridium 또는 frida-ios-dump)를 사용하여 복호화한 후 장치에서 다시 가져올 수 있습니다. 그러나 가능하다면 복호화된 IPA를 클라이언트에게 요청하는 것이 좋습니다.
## Obtain decrypted IPA
@ -18,16 +18,16 @@
1. iPhone에 펜테스트할 앱을 설치합니다.
2. macOS에서 [Apple Configurator](https://apps.apple.com/au/app/apple-configurator/id1037126344?mt=12)를 설치하고 실행합니다.
3. Mac에서 `Terminal`을 열고 `/Users/[username]/Library/Group\\ Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/MobileApps`로 이동합니다. 나중에 이 폴더에 IPA가 나타납니다.
4. iOS 장치가 보일 것입니다. 더블 클릭한 후 상단 메뉴 바에서 Add + → Apps를 클릭합니다.
4. iOS 장치가 표시되어야 합니다. 더블 클릭한 후 상단 메뉴 바에서 Add + → Apps를 클릭합니다.
5. Add를 클릭하면 Configurator가 Apple에서 IPA를 다운로드하고 장치에 푸시하려고 시도합니다. 이전에 제 권고를 따르고 IPA를 이미 설치했다면 앱을 재설치하라는 프롬프트가 나타납니다.
6. IPA는 `/Users/[username]/Library/Group\\ Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/MobileApps`에 다운로드되며, 여기서 가져올 수 있습니다.
6. IPA는 `/Users/[username]/Library/Group\\ Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/MobileApps`에 다운로드되어 있으며, 여기서 가져올 수 있습니다.
과정에 대한 더 자세한 정보는 [https://dvuln.com/blog/modern-ios-pentesting-no-jailbreak-needed](https://dvuln.com/blog/modern-ios-pentesting-no-jailbreak-needed)를 확인하세요.
프로세스에 대한 더 자세한 정보는 [https://dvuln.com/blog/modern-ios-pentesting-no-jailbreak-needed](https://dvuln.com/blog/modern-ios-pentesting-no-jailbreak-needed)를 확인하세요.
### Decrypting the app
IPA를 복호화하기 위해 설치할 것입니다. 그러나 구형 탈옥된 iPhone이 있다면, 애플리케이션에서 지원하지 않을 가능성이 높습니다. 일반적으로 앱은 최신 버전만 지원하기 때문입니다.
IPA를 복호화하기 위해 설치할 것입니다. 그러나 구형 탈옥된 iPhone이 있는 경우, 애플리케이션에서 지원하지 않을 가능성이 높습니다. 일반적으로 앱은 최신 버전만 지원니다.
따라서 설치하려면 IPA를 압축 해제하세요:
```bash
@ -51,7 +51,7 @@ Cydia에서 **AppSync Unified tweak**가 필요할 수 있으니 `invalid signat
### 권한 패치 및 재서명
`get-task-allow` 권한으로 애플리케이션을 재서명하기 위해 `app-signer`, `codesign`, `iResign`과 같은 여러 도구를 사용할 수 있습니다. `app-signer`는 재서명할 IPA 파일을 지정하고 **`get-task-allow`**를 설정하며 사용할 인증서와 프로비저닝 프로필을 쉽게 지정할 수 있는 매우 사용자 친화적인 인터페이스를 제공합니다.
`get-task-allow` 권한으로 애플리케이션을 재서명하기 위해 `app-signer`, `codesign`, `iResign`과 같은 여러 도구 있습니다. `app-signer`는 재서명할 IPA 파일을 지정하고, **`get-taks-allow`**를 설정하며 사용할 인증서와 프로비저닝 프로필을 쉽게 지정할 수 있는 매우 사용자 친화적인 인터페이스를 제공합니다.
인증서 및 서명 프로필에 관해서는 Apple이 Xcode를 통해 모든 계정에 **무료 개발자 서명 프로필**을 제공합니다. 앱을 생성하고 하나를 구성하세요. 그런 다음, `Settings``Privacy & Security`로 이동하여 **개발자 앱을 신뢰하도록 iPhone을 구성**하세요. `Developer Mode`를 클릭합니다.
@ -77,7 +77,7 @@ iOS 16부터 Apple은 **개발자 모드**를 도입했습니다: `get_task_allo
| 도구 | 요구 사항 | 강점 | 제한 사항 |
|------|--------------|-----------|-------------|
| **AltStore 2 / SideStore** | 매 7일마다 무료 개발 프로필로 IPA를 재서명하는 macOS/Windows/Linux 동반자 | Wi-Fi를 통한 자동 재로드, iOS 17까지 작동 | 동일 네트워크에 있는 컴퓨터 필요, Apple에 의해 3개 앱 제한 |
| **AltStore 2 / SideStore** | 매 7일마다 무료 개발 프로필로 IPA를 재서명하는 macOS/Windows/Linux 동반자 | Wi-Fi를 통한 자동 재로드, iOS 17까지 작동 | 동일 네트워크에 컴퓨터 필요, Apple에 의해 3개 앱 제한 |
| **TrollStore 1/2** | CoreTrust 버그에 취약한 iOS 14 15.4.1 장치 | *영구* 서명 (7일 제한 없음); 설치 후 컴퓨터 필요 없음 | iOS 15.5+에서 지원되지 않음 (버그 패치됨) |
현재 iOS 버전에서의 정기적인 펜테스트를 위해 Alt/Side-Store가 일반적으로 가장 실용적인 선택입니다.
@ -96,7 +96,7 @@ frida -U -f com.example.target -l my_script.js --no-pause
### 탈옥 없이 MobSF를 이용한 자동화된 동적 분석
[MobSF](https://mobsf.github.io/Mobile-Security-Framework-MobSF/)는 동일한 기술(`get_task_allow`)을 사용하여 실제 장치에서 개발자 서명된 IPA를 계측할 수 있으며, 파일 시스템 브라우저, 트래픽 캡처 및 Frida 콘솔이 포함된 웹 UI를 제공합니다【】. 가장 빠른 방법은 Docker에서 MobSF를 실행한 다음 USB를 통해 iPhone을 연결하는 것입니다:
[MobSF](https://mobsf.github.io/Mobile-Security-Framework-MobSF/)는 동일한 기술(`get_task_allow`)을 사용하여 실제 장치에서 개발자 서명된 IPA를 계측할 수 있으며, 파일 시스템 브라우저, 트래픽 캡처 및 Frida 콘솔이 포함된 웹 UI를 제공합니다【†L2-L3】. 가장 빠른 방법은 Docker에서 MobSF를 실행한 다음 USB를 통해 iPhone을 연결하는 것입니다:
```bash
docker pull opensecurity/mobile-security-framework-mobsf:latest
docker run -p 8000:8000 --privileged \
@ -108,7 +108,7 @@ MobSF는 이진 파일을 자동으로 배포하고, 앱 샌드박스 내에서
### iOS 17 및 잠금 모드 주의사항
* **잠금 모드** (설정 → 개인 정보 보호 및 보안)는 동적 링커가 서명되지 않거나 외부에서 서명된 동적 라이브러리를 로드하는 것을 차단합니다. 이 모드가 활성화될 수 있는 장치를 테스트할 때는 반드시 **비활성화**되어 있는지 확인해야 하며, 그렇지 않으면 Frida/objection 세션이 즉시 종료됩니다.
* **잠금 모드** (설정 → 개인 정보 보호 및 보안)는 동적 링커가 서명되지 않거나 외부에서 서명된 동적 라이브러리를 로드하는 것을 차단합니다. 이 모드가 활성화된 장치를 테스트할 때는 **비활성화**되어 있는지 확인해야 하며, 그렇지 않으면 Frida/objection 세션이 즉시 종료됩니다.
* 포인터 인증(PAC)은 A12+ 장치에서 시스템 전반에 걸쳐 시행됩니다. Frida ≥16은 PAC 스트리핑을 투명하게 처리하므로, 새로운 주요 iOS 버전이 출시될 때 *frida-server*와 Python/CLI 툴체인을 모두 최신 상태로 유지해야 합니다.
## 참고문헌

View File

@ -2,6 +2,99 @@
{{#include ../../banners/hacktricks-training.md}}
**게시물 확인 [https://portswigger.net/research/http-2-downgrades](https://portswigger.net/research/http-2-downgrades)**
HTTP/2는 일반적으로 각 DATA 프레임의 길이가 명시적이기 때문에 고전적인 요청 스머글링에 면역이 있다고 여겨집니다. **그러나 프론트엔드 프록시가 요청을 HTTP/1.x로 “다운그레이드”하여 백엔드로 전달하면 그 보호는 사라집니다.** 두 개의 서로 다른 파서(HTTP/2 프론트엔드와 HTTP/1 백엔드)가 하나의 요청이 끝나는 지점과 다음 요청이 시작되는 지점에 대해 합의하려고 할 때, 모든 오래된 비동기 트릭이 다시 나타나며 몇 가지 새로운 트릭도 추가됩니다.
---
## 다운그레이드가 발생하는 이유
1. 브라우저는 이미 HTTP/2를 사용하지만, 많은 레거시 오리진 인프라는 여전히 HTTP/1.1만 이해합니다.
2. 따라서 리버스 프록시(CDN, WAF, 로드 밸런서)는 엣지에서 TLS + HTTP/2를 종료하고 **모든 요청을 HTTP/1.1로 재작성**합니다.
3. 변환 단계에서는 오리진이 본문 길이를 결정할 수 있도록 *둘 다* `Content-Length` **및/또는** `Transfer-Encoding: chunked` 헤더를 생성해야 합니다.
프론트엔드가 HTTP/2 프레임 길이를 신뢰하지만 백엔드가 CL 또는 TE를 신뢰할 때, 공격자는 그들이 동의하지 않도록 강요할 수 있습니다.
---
## 두 가지 주요 원시 클래스
| 변형 | 프론트엔드 길이 | 백엔드 길이 | 일반적인 페이로드 |
|---------|-----------------|-----------------|-----------------|
| **H2.TE** | HTTP/2 프레임 | `Transfer-Encoding: chunked` | 최종 `0\r\n\r\n`*전송되지 않는* 추가 청크 메시지 본문을 포함하여 백엔드가 공격자가 제공한 “다음” 요청을 기다리게 합니다. |
| **H2.CL** | HTTP/2 프레임 | `Content-Length` | 실제 본문보다 *작은* CL을 전송하여 백엔드가 경계를 넘어 다음 요청을 읽도록 합니다. |
> 이들은 고전적인 TE.CL / CL.TE와 본질적으로 동일하며, 단지 HTTP/2가 파서 중 하나를 대체합니다.
---
## 다운그레이드 체인 식별
1. TLS 핸드셰이크에서 **ALPN** 사용 (`openssl s_client -alpn h2 -connect host:443`) 또는 **curl**:
```bash
curl -v --http2 https://target
```
`* Using HTTP2`가 나타나면 엣지가 H2를 사용하고 있습니다.
2. HTTP/2를 통해 의도적으로 잘못된 CL/TE 요청을 전송합니다(Burp Repeater는 이제 HTTP/2를 강제하는 드롭다운을 제공합니다). 응답이 `400 Bad chunk`와 같은 HTTP/1.1 오류인 경우, 엣지가 HTTP/1 파서를 위해 트래픽을 변환했다는 증거가 됩니다.
---
## 익스플로잇 워크플로우 (H2.TE 예시)
```http
:method: POST
:path: /login
:scheme: https
:authority: example.com
content-length: 13 # ignored by the edge
transfer-encoding: chunked
5;ext=1\r\nHELLO\r\n
0\r\n\r\nGET /admin HTTP/1.1\r\nHost: internal\r\nX: X
```
1. **프론트엔드**는 정확히 13바이트(`HELLO\r\n0\r\n\r\nGE`)를 읽고 요청이 끝났다고 생각하며 그만큼을 오리진으로 전달합니다.
2. **백엔드**는 TE 헤더를 신뢰하고, *두 번째* `0\r\n\r\n`을 볼 때까지 계속 읽어 공격자의 두 번째 요청(`GET /admin …`)의 접두사를 소비합니다.
3. 나머지(`GET /admin …`)는 피해자의 뒤에 대기 중인 *새로운* 요청으로 처리됩니다.
밀반입된 요청을 다음으로 교체합니다:
* `POST /api/logout`으로 세션 고정을 강제합니다.
* `GET /users/1234`로 피해자 특정 리소스를 탈취합니다.
---
## h2c 밀반입 (명확한 텍스트 업그레이드)
2023년 연구에 따르면, 프론트엔드가 HTTP/1.1 `Upgrade: h2c` 헤더를 명확한 텍스트 HTTP/2를 지원하는 백엔드로 전달하면, 공격자는 HTTP/1.1만 검증된 엣지를 통해 *원시* HTTP/2 프레임을 터널링할 수 있습니다. 이는 헤더 정규화, WAF 규칙 및 심지어 TLS 종료를 우회합니다.
주요 요구 사항:
* 엣지는 **둘 다** `Connection: Upgrade``Upgrade: h2c`를 변경하지 않고 전달합니다.
* 오리진은 HTTP/2로 증가하고 요청 대기열을 가능하게 하는 연결 재사용 의미를 유지합니다.
완화는 간단합니다 WebSockets를 제외하고 엣지에서 `Upgrade` 헤더를 제거하거나 하드코딩합니다.
---
## 주목할 만한 실제 CVE (2022-2025)
* **CVE-2023-25690** Apache HTTP Server mod_proxy 재작성 규칙이 요청 분할 및 밀반입을 위해 연결될 수 있습니다. (2.4.56에서 수정됨)
* **CVE-2023-25950** HTX 파서가 파이프라인 요청을 잘못 처리할 때 HAProxy 2.7/2.6 요청/응답 밀반입.
* **CVE-2022-41721** Go `MaxBytesHandler`가 남은 본문 바이트를 **HTTP/2** 프레임으로 파싱하여 프로토콜 간 밀반입을 가능하게 했습니다.
---
## 도구
* **Burp Request Smuggler** v1.26부터 H2.TE/H2.CL 및 숨겨진 ALPN 지원을 자동으로 테스트합니다. 확장 옵션에서 “HTTP/2 프로빙”을 활성화합니다.
* **h2cSmuggler** Bishop Fox의 Python PoC로 명확한 텍스트 업그레이드 공격을 자동화합니다:
```bash
python3 h2csmuggler.py -u https://target -x 'GET /admin HTTP/1.1\r\nHost: target\r\n\r\n'
```
* **curl**/`hyper` 수동 페이로드 작성: `curl --http2-prior-knowledge -X POST --data-binary @payload.raw https://target`.
---
## 방어 조치
1. **종단 간 HTTP/2** 다운그레이드 변환을 완전히 제거합니다.
2. **길이 진실의 단일 출처** 다운그레이드할 때는 *항상* 유효한 `Content-Length`를 생성하고 **사용자 제공** `Content-Length`/`Transfer-Encoding` 헤더를 **제거**합니다.
3. **라우트 전에 정규화** 라우팅/재작성 로직 *이전*에 헤더 정화 적용합니다.
4. **연결 격리** 사용자 간에 백엔드 TCP 연결을 재사용하지 마십시오; “연결당 하나의 요청”은 대기열 기반 공격을 무력화합니다.
5. **WebSocket이 아닌 경우 `Upgrade` 제거** h2c 터널링을 방지합니다.
---
## 참고 문헌
* PortSwigger Research “HTTP/2: The Sequel is Always Worse” <https://portswigger.net/research/http2>
* Bishop Fox “h2c Smuggling: request smuggling via HTTP/2 clear-text” <https://bishopfox.com/blog/h2c-smuggling-request>
{{#include ../../banners/hacktricks-training.md}}