mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/mobile-pentesting/ios-pentesting/ios-pentesting-without
This commit is contained in:
parent
6d8bbfcbcf
commit
d692ac4b1f
@ -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 툴체인을 모두 최신 상태로 유지해야 합니다.
|
||||
|
||||
## 참고문헌
|
||||
|
@ -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}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user