diff --git a/src/mobile-pentesting/android-app-pentesting/README.md b/src/mobile-pentesting/android-app-pentesting/README.md index 48fcacc6f..e51ca36d4 100644 --- a/src/mobile-pentesting/android-app-pentesting/README.md +++ b/src/mobile-pentesting/android-app-pentesting/README.md @@ -4,7 +4,7 @@ ## Android Applications Basics -이 페이지를 먼저 읽어 Android 보안과 Android 애플리케이션에서 가장 위험한 구성 요소에 관한 **가장 중요한 부분**을 아는 것을 강력히 권장합니다: +이 페이지를 먼저 읽어 Android 보안 및 Android 애플리케이션에서 가장 위험한 구성요소와 관련된 **가장 중요한 부분들**에 대해 파악하는 것을 강력히 권장합니다: {{#ref}} @@ -13,14 +13,14 @@ android-applications-basics.md ## ADB (Android Debug Bridge) -이것은 에뮬레이터나 물리적 Android 기기에 연결하는 데 필요한 주요 도구입니다.\ -**ADB**는 컴퓨터에서 **USB** 또는 **Network**를 통해 기기를 제어할 수 있게 해줍니다. 이 유틸리티는 파일의 양방향 **복사**, 앱의 **설치** 및 **제거**, 셸 명령의 **실행**, 데이터 **백업**, 로그 **읽기** 등 다양한 기능을 제공합니다. +이 도구는 에뮬레이터나 실제 Android 기기에 연결할 때 주로 사용하는 주요 도구입니다. +**ADB**는 컴퓨터에서 **USB** 또는 **Network**를 통해 기기를 제어할 수 있게 해줍니다. 이 유틸리티는 파일의 양방향 **복사**, 앱의 **설치** 및 **제거**, shell commands의 **실행**, 데이터 **백업**, 로그 **읽기** 등 다양한 기능을 제공합니다. -다음 [**ADB Commands**](adb-commands.md) 목록을 확인하여 adb 사용법을 배우세요. +adb 사용법을 배우려면 다음 [**ADB Commands**](adb-commands.md) 목록을 살펴보세요. ## Smali -때때로 **응용 프로그램 코드를 수정**하여 **숨겨진 정보**(예: 잘 난독화된 비밀번호나 플래그)에 접근하는 것이 유용할 수 있습니다. 그런 경우, apk를 디컴파일하고 코드를 수정한 뒤 다시 컴파일하는 것이 흥미로울 수 있습니다.\ [**In this tutorial** you can **learn how to decompile and APK, modify Smali code and recompile the APK** with the new functionality](smali-changes.md). 이는 동적 분석 중 제시될 여러 테스트의 **대안**으로 매우 유용할 수 있습니다. 따라서 **항상 이 가능성을 염두에 두세요**. +때때로 **애플리케이션 코드를 수정**하여 **숨겨진 정보**(예: 잘 난독화된 비밀번호나 플래그)에 접근하는 것이 흥미로울 수 있습니다. 이 경우 apk를 디컴파일하고 코드를 수정한 다음 다시 컴파일하는 것이 유용할 수 있습니다. [**In this tutorial** you can **learn how to decompile and APK, modify Smali code and recompile the APK** with the new functionality](smali-changes.md). 이는 동적 분석 중 여러 테스트에 대한 **대안**으로 매우 유용할 수 있으니, 항상 이 가능성을 염두에 두세요. ## Other interesting tricks @@ -28,8 +28,8 @@ android-applications-basics.md - [Shizuku Privileged API (ADB-based non-root privileged access)](shizuku-privileged-api.md) - [Exploiting Insecure In-App Update Mechanisms](insecure-in-app-update-rce.md) - [Abusing Accessibility Services (Android RAT)](accessibility-services-abuse.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를 디바이스에서 추출: +- **Download APKs**: [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 추출: ```bash adb shell pm list packages com.android.insecurebankv2 @@ -39,7 +39,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 ``` -- 모든 splits와 base apks를 [APKEditor](https://github.com/REAndroid/APKEditor): +- 모든 splits 및 base apks를 [APKEditor](https://github.com/REAndroid/APKEditor)로 병합: ```bash mkdir splits adb shell pm path com.android.insecurebankv2 | cut -d ':' -f 2 | xargs -n1 -i adb pull {} splits @@ -62,39 +62,38 @@ java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed ## 정적 분석 -우선, APK를 분석할 때는 decompiler를 사용하여 **Java 코드를 살펴봐야 합니다**.\ -[**다양한 사용 가능한 decompilers에 대한 정보를 보려면 여기를 읽으세요**](apk-decompilers.md). +무엇보다도, APK를 분석할 때는 디컴파일러를 사용하여 **Java code**를 살펴봐야 합니다.\ +[**다양한 사용 가능한 decompilers에 대한 정보를 보려면 여기 읽어보세요**](apk-decompilers.md). ### 흥미로운 정보 찾기 -APK의 **strings**를 살펴보면 **passwords**, **URLs** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep)), **api** keys, **encryption**, **bluetooth uuids**, **tokens** 등 흥미로운 것들을 검색할 수 있습니다... 코드 실행 **backdoors**나 인증 백도어(앱에 하드코딩된 관리자 자격증명)도 확인하세요. +APK의 **strings**를 살펴보면 **passwords**, **URLs** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep)), **api** keys, **encryption**, **bluetooth uuids**, **tokens** 등 흥미로운 항목들을 검색할 수 있습니다. 코드 실행 **backdoors**나 인증 backdoors(앱에 하드코딩된 admin credentials)도 찾아보세요. **Firebase** -Firebase URL에 특히 주의하고 잘못 구성되어 있는지 확인하세요. [Firebase가 무엇이며 이를 어떻게 악용할 수 있는지에 대한 자세한 정보는 여기](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md). +**firebase URLs**에 특히 주의하고 잘못 구성되어 있는지 확인하세요. [Firebase가 무엇이고 이를 어떻게 악용하는지에 대한 자세한 정보는 여기를 참조하세요.](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md) -### 애플리케이션의 기본 이해 - Manifest.xml, strings.xml +### 애플리케이션 기본 이해 - Manifest.xml, strings.xml -애플리케이션의 _Manifest.xml_ 및 **_strings.xml_** 파일을 검토하면 잠재적인 보안 취약점을 발견할 수 있습니다. 이러한 파일들은 decompiler로 접근하거나 APK 파일 확장자를 .zip로 변경한 다음 압축을 풀어 확인할 수 있습니다. +애플리케이션의 _Manifest.xml_ 및 **_strings.xml_** 파일을 조사하면 잠재적 보안 취약점을 발견할 수 있습니다. 이러한 파일들은 디컴파일러를 사용하거나 APK 파일 확장자를 .zip으로 변경한 후 압축을 풀어 접근할 수 있습니다. -**Manifest.xml**에서 확인되는 취약점에는 다음이 포함됩니다: +Manifest.xml에서 식별되는 취약점에는 다음이 포함됩니다: -- **Debuggable Applications**: _Manifest.xml_ 파일에서 `debuggable="true"`로 설정된 애플리케이션은 연결을 허용하여 악용될 가능성이 있으므로 위험합니다. 디버깅 가능 애플리케이션을 기기에서 찾고 악용하는 방법에 대한 튜토리얼을 참조하세요. -- **Backup Settings**: 민감한 정보를 다루는 애플리케이션은 무단 adb 백업을 방지하기 위해 `android:allowBackup="false"` 속성을 명시적으로 설정해야 합니다. 특히 USB 디버깅이 활성화된 경우 중요합니다. -- **Network Security**: _res/xml/_의 사용자 정의 네트워크 보안 구성(`android:networkSecurityConfig="@xml/network_security_config"`)은 certificate pin이나 HTTP 트래픽 설정 같은 보안 세부사항을 명시할 수 있습니다. 예로 특정 도메인에 대해 HTTP 트래픽을 허용하는 설정이 있을 수 있습니다. -- **Exported Activities and Services**: manifest에서 exported된 activities 및 services를 식별하면 악용될 수 있는 컴포넌트를 찾아낼 수 있습니다. 동적 테스트 중 추가 분석을 통해 이러한 컴포넌트를 어떻게 악용할 수 있는지 알 수 있습니다. -- **Content Providers and FileProviders**: 노출된 Content Providers는 데이터에 대한 무단 접근 또는 수정을 허용할 수 있습니다. FileProviders의 구성 또한 면밀히 검토해야 합니다. -- **Broadcast Receivers and URL Schemes**: 이러한 컴포넌트는 악용될 여지가 있으며, 특히 URL schemes가 입력 취약성에 대해 어떻게 처리되는지 주의해야 합니다. -- **SDK Versions**: `minSdkVersion`, `targetSDKVersion`, 및 `maxSdkVersion` 속성은 지원되는 Android 버전을 나타내며, 오래되고 취약한 Android 버전을 지원하지 않는 것이 보안상 중요함을 강조합니다. +- **Debuggable Applications**: _Manifest.xml_ 파일에 `debuggable="true"`로 설정된 애플리케이션은 연결을 허용하여 악용될 수 있으므로 위험합니다. debuggable 애플리케이션을 찾고 악용하는 방법에 대해서는 관련 튜토리얼을 참조하세요. +- **Backup Settings**: 민감한 정보를 다루는 애플리케이션의 경우 `android:allowBackup="false"` 속성을 명시적으로 설정하여 usb debugging이 활성화된 경우 adb를 통한 무단 데이터 백업을 방지해야 합니다. +- **Network Security**: _res/xml/_의 사용자 정의 네트워크 보안 설정(`android:networkSecurityConfig="@xml/network_security_config"`)은 certificate pinning이나 HTTP 트래픽 설정과 같은 보안 세부사항을 지정할 수 있습니다. 예로 특정 도메인에 대해 HTTP 트래픽을 허용하는 설정이 있습니다. +- **Exported Activities and Services**: 매니페스트에서 exported된 activity 및 service를 식별하면 오용될 수 있는 컴포넌트를 파악할 수 있습니다. 동적 테스트 중 추가 분석을 통해 이러한 컴포넌트를 악용하는 방법을 밝힐 수 있습니다. +- **Content Providers and FileProviders**: 노출된 content provider는 무단 접근이나 데이터 변경을 허용할 수 있습니다. FileProviders의 구성도 면밀히 검토해야 합니다. +- **Broadcast Receivers and URL Schemes**: 이러한 컴포넌트는 악용에 사용될 수 있으며, 특히 URL 스킴이 입력 취약성에 대해 어떻게 관리되는지 주의해야 합니다. +- **SDK Versions**: `minSdkVersion`, `targetSDKVersion`, 및 `maxSdkVersion` 속성은 지원되는 Android 버전을 나타내며, 보안상의 이유로 오래된 취약한 Android 버전을 지원하지 않는 것이 중요함을 보여줍니다. -_strings.xml_ 파일에서는 API 키, custom schemas 및 기타 개발자 메모와 같은 민감한 정보를 발견할 수 있으므로 이러한 리소스를 주의 깊게 검토해야 합니다. +**strings.xml** 파일에서는 API keys, custom schemas 및 기타 개발자 메모와 같은 민감한 정보가 발견될 수 있으므로 이러한 리소스를 주의 깊게 검토해야 합니다. ### Tapjacking -**Tapjacking**은 **악성** **애플리케이션**이 실행되어 **피해자 애플리케이션 위에 자신을 위치시키는** 공격입니다. 한 번 피해 앱을 시각적으로 가리면, 악성 앱의 사용자 인터페이스는 사용자가 상호작용하도록 속이도록 설계되어 있으며, 동시에 그 상호작용을 피해 앱으로 전달합니다.\ -결과적으로 사용자는 자신이 실제로 피해 앱에서 동작을 수행하고 있다는 사실을 인지하지 못하게 됩니다. +Tapjacking은 악성 애플리케이션이 실행되어 피해자 애플리케이션 위에 자신을 배치하는 공격입니다. 일단 피해자 앱을 시각적으로 가리면, 악성 앱의 UI는 사용자가 그것과 상호작용하도록 속이도록 설계되며, 동시에 그 상호작용을 피해자 앱으로 전달합니다. 결과적으로 사용자는 실제로 피해자 앱에서 동작을 수행하고 있다는 사실을 알지 못하게 됩니다. -Find more information in: +자세한 정보는 다음을 참조하세요: {{#ref}} @@ -103,82 +102,82 @@ tapjacking.md ### Task Hijacking -`launchMode`가 **`singleTask`로 설정되고 `taskAffinity`가 정의되어 있지 않은** **activity**는 Task Hijacking에 취약합니다. 이는 악성 **application**이 설치되어 실제 애플리케이션보다 먼저 실행되면 **실제 애플리케이션의 task를 hijack**할 수 있음을 의미합니다(사용자는 실제 앱을 사용하는 줄 알고 **malicious application**과 상호작용하게 됩니다). +`launchMode`가 `singleTask`로 설정되어 있고 `taskAffinity`가 정의되어 있지 않은 activity는 task Hijacking에 취약합니다. 즉, 악성 application을 설치하고 실제 application보다 먼저 실행하면 실제 애플리케이션의 task를 가로챌 수 있으므로(사용자는 실제 애플리케이션을 사용한다고 생각하면서 악성 application과 상호작용하게 됩니다). -More info in: +추가 정보: {{#ref}} android-task-hijacking.md {{#endref}} -### 안전하지 않은 데이터 저장 +### 불안정한 데이터 저장 Internal Storage -Android에서 내부 저장소에 **저장된** 파일은 이를 **생성한** **앱**만 접근할 수 있도록 **설계되어** 있습니다. 이 보안 조치는 Android 운영체제에 의해 **강제**되며 대부분의 애플리케이션 보안 요구에는 일반적으로 적절합니다. 그러나 개발자들은 때때로 `MODE_WORLD_READABLE` 및 `MODE_WORLD_WRITABLE`과 같은 모드를 사용하여 파일을 다른 애플리케이션 간에 **공유 허용**하도록 합니다. 하지만 이러한 모드는 잠재적으로 악성인 다른 애플리케이션의 파일 접근을 **제한하지 않습니다**. +Android에서 internal storage에 저장된 파일은 이를 생성한 app만 접근하도록 설계되어 있습니다. 이 보안 조치는 Android 운영체제에 의해 강제되며 대부분의 애플리케이션 보안 요구에 대해 일반적으로 충분합니다. 그러나 개발자가 `MODE_WORLD_READABLE` 및 `MODE_WORLD_WRITABLE`과 같은 모드를 사용하여 파일을 서로 다른 애플리케이션 간에 공유하도록 허용하는 경우가 있습니다. 이러한 모드는 잠재적으로 악성 앱을 포함한 다른 애플리케이션의 파일 접근을 제한하지 않습니다. 1. **정적 분석:** -- **확인**: `MODE_WORLD_READABLE` 및 `MODE_WORLD_WRITABLE`의 사용이 **면밀히 검토**되었는지 확인하세요. 이러한 모드는 **파일을 노출시킬 수 있습니다**(원치 않거나 무단 접근). +- `MODE_WORLD_READABLE` 및 `MODE_WORLD_WRITABLE`의 사용을 **면밀히 검토**하세요. 이러한 모드는 파일을 의도하지 않거나 무단 접근에 **노출시킬 수 있습니다**. 2. **동적 분석:** -- **검증**: 앱이 생성한 파일에 설정된 **권한**을 확인하세요. 특히 어떤 파일이 **전역 읽기 또는 쓰기 가능**으로 **설정되어 있는지** 확인하세요. 이는 심각한 보안 위험을 초래할 수 있으며, 기기에 설치된 **모든 애플리케이션**이 출처나 의도에 관계없이 해당 파일을 **읽거나 수정**할 수 있게 됩니다. +- 앱이 생성한 파일에 설정된 **permissions**를 **확인**하세요. 특히 어떤 파일이 전역적으로 읽기 또는 쓰기가 가능하도록 설정되어 있는지 **확인**해야 합니다. 이는 장치에 설치된 **어떤 application**이라도 출처나 의도와 상관없이 해당 파일을 읽거나 수정할 수 있게 하여 심각한 보안 위험을 초래할 수 있습니다. External Storage -SD 카드와 같은 **external storage**의 파일을 다룰 때는 다음과 같은 주의가 필요합니다: +SD 카드와 같은 **external storage**의 파일을 다룰 때는 다음과 같은 주의사항이 필요합니다: -1. **Accessibility**: -- 외부 저장소의 파일은 **전역적으로 읽기 및 쓰기 가능**합니다. 즉, 모든 애플리케이션이나 사용자가 이 파일들에 접근할 수 있습니다. -2. **Security Concerns**: -- 접근이 쉬우므로 **민감한 정보를 외부 저장소에 저장하지 않는 것**이 권장됩니다. -- 외부 저장소는 제거될 수 있으며 어떤 애플리케이션이라도 접근할 수 있어 보안성이 낮습니다. -3. **Handling Data from External Storage**: -- 외부 저장소에서 가져온 데이터에 대해 항상 **입력 검증을 수행**하세요. 외부 저장소의 데이터는 신뢰할 수 없는 소스이기 때문에 필수적입니다. -- 외부 저장소에 실행 파일이나 class 파일을 저장한 후 동적으로 로드하는 것은 강력히 권장되지 않습니다. -- 애플리케이션이 외부 저장소에서 실행 파일을 반드시 불러와야 한다면, 동적으로 로드하기 전에 해당 파일들이 **서명되어 있고 암호학적으로 검증**되었는지 확인하세요. 이 단계는 애플리케이션의 보안 무결성을 유지하는 데 중요합니다. +1. 접근성: +- 외부 저장소의 파일은 **전역적으로 읽기 및 쓰기 가능**합니다. 즉, 어떤 application이나 사용자도 이 파일들에 접근할 수 있습니다. +2. 보안 문제: +- 접근이 용이하기 때문에 **민감한 정보를 외부 저장소에 저장하지 않는 것**을 권장합니다. +- 외부 저장소는 제거될 수 있고 어떤 application도 접근할 수 있어 덜 안전합니다. +3. 외부 저장소에서 가져온 데이터 처리: +- 외부 저장소에서 가져온 데이터에 대해 항상 **입력 검증(input validation)**을 수행하세요. 이는 해당 데이터가 신뢰할 수 없는 출처에서 온 것이기 때문에 매우 중요합니다. +- 외부 저장소에 실행 파일이나 class 파일을 두고 동적으로 로드하는 것은 강력히 권장되지 않습니다. +- 애플리케이션이 외부 저장소에서 실행 파일을 가져와야 하는 경우, 이러한 파일이 동적으로 로드되기 전에 **서명되고 암호학적으로 검증**되었는지 확인하세요. 이 단계는 애플리케이션의 보안 무결성을 유지하는 데 필수적입니다. -External storage는 `/storage/emulated/0` , `/sdcard` , `/mnt/sdcard`에서 접근할 수 있습니다. +외부 저장소는 `/storage/emulated/0`, `/sdcard`, `/mnt/sdcard`에서 접근할 수 있습니다. > [!TIP] -> Android 4.4(**API 17**)부터 SD 카드는 애플리케이션이 특정 앱 전용 디렉터리로만 접근을 제한하는 디렉터리 구조를 가집니다. 이는 악성 애플리케이션이 다른 앱의 파일에 대한 읽기 또는 쓰기 접근을 얻는 것을 방지합니다. +> Android 4.4(**API 17**)부터 SD 카드는 앱별 디렉터리로의 접근을 제한하는 디렉터리 구조를 가지게 됩니다. 이는 악성 application이 다른 앱의 파일에 대한 읽기 또는 쓰기 접근을 획득하는 것을 방지합니다. -민감한 데이터가 평문으로 저장됨 +**암호화되지 않은(평문)으로 저장된 민감한 데이터** -- **Shared preferences**: Android는 각 애플리케이션이 `/data/data//shared_prefs/` 경로에 xml 파일을 쉽게 저장할 수 있게 하며, 때때로 해당 폴더에서 평문으로 민감한 정보를 찾을 수 있습니다. -- **Databases**: Android는 각 애플리케이션이 `/data/data//databases/` 경로에 sqlite 데이터베이스를 쉽게 저장할 수 있게 하며, 때때로 해당 폴더에서 평문으로 민감한 정보를 찾을 수 있습니다. +- **Shared preferences**: Android는 각 애플리케이션이 `/data/data//shared_prefs/` 경로에 xml 파일을 쉽게 저장할 수 있도록 허용하며, 때때로 해당 폴더에서 평문으로 된 민감한 정보를 찾을 수 있습니다. +- **Databases**: Android는 각 애플리케이션이 `/data/data//databases/` 경로에 sqlite 데이터베이스를 쉽게 저장할 수 있도록 허용하며, 때때로 해당 폴더에서 평문으로 된 민감한 정보를 찾을 수 있습니다. ### Broken TLS -Accept All Certificates +**Accept All Certificates** -어떤 이유에서인지 개발자가 예를 들어 hostname이 일치하지 않더라도 모든 인증서를 수락하는 경우가 있습니다. 다음과 같은 코드 라인에서처럼: +어떤 이유로 개발자들이 호스트명이 일치하지 않더라도 모든 인증서를 수락하는 경우가 있습니다. 예를 들어 다음과 같은 코드 라인으로: ```java SSLSocketFactory sf = new cc(trustStore); sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); ``` A good way to test this is to try to capture the traffic using some proxy like Burp without authorising Burp CA inside the device. Also, you can generate with Burp a certificate for a different hostname and use it. -### 잘못된 암호화 +### 취약한 암호화 -**취약한 키 관리 프로세스** +**열악한 키 관리 프로세스** -일부 개발자는 민감한 데이터를 로컬 스토리지에 저장하고 코드에 하드코딩되거나 예측 가능한 키로 암호화합니다. 이러한 방식은 리버싱으로 인해 공격자가 기밀 정보를 추출할 수 있으므로 해서는 안 됩니다. +일부 개발자는 민감한 데이터를 로컬 스토리지에 저장하고 코드에 하드코딩되었거나 예측 가능한 키로 암호화합니다. 이는 리버스엔지니어링(reversing)으로 공격자가 기밀 정보를 추출할 수 있으므로 해서는 안 됩니다. -**안전하지 않거나/또는 폐기된 알고리즘 사용** +**안전하지 않거나/또는 더 이상 사용되지 않는 알고리즘의 사용** -개발자는 권한 검사(authorisation **checks**), 데이터 **저장** 또는 **전송**에 **deprecated algorithms**을 사용해서는 안 됩니다. 이러한 알고리즘의 예로는 RC4, MD4, MD5, SHA1 등이 있습니다. 예를 들어 비밀번호 저장에 **hashes**를 사용하는 경우, 솔트를 사용한 브루트포스에 **강한** 해시를 사용해야 합니다. +개발자는 권한 검사(authorisation checks), 데이터 저장(store) 또는 전송(send)에 **deprecated algorithms**를 사용해서는 안 됩니다. 이런 알고리즘에는 RC4, MD4, MD5, SHA1 등이 있습니다. 예를 들어 비밀번호 저장에 **hashes**를 사용한다면, salt와 함께 브루트포스에 강한 해시 알고리즘을 사용해야 합니다. ### 기타 점검사항 -- APK를 난독화(obfuscate the APK)하여 역분석 작업을 어렵게 만드는 것을 권장합니다. -- 앱이 민감한 경우(예: 은행 앱) 모바일이 **rooted** 되었는지 자체적으로 검사하고 그에 따라 동작해야 합니다. -- 앱이 민감한 경우(예: 은행 앱) **emulator** 사용 여부를 확인해야 합니다. -- 앱이 민감한 경우(예: 은행 앱) 실행 전에 **자체 무결성 검사(check it's own integrity before executing)** 를 수행하여 수정 여부를 확인해야 합니다. -- APK를 빌드할 때 어떤 compiler/packer/obfuscator가 사용되었는지 확인하려면 [**APKiD**](https://github.com/rednaga/APKiD)를 사용하세요. +- 공격자의 리버스 엔지니어링 작업을 어렵게 하기 위해 **obfuscate the APK** 하는 것이 권장됩니다. +- 앱이 민감한 성격(예: 은행 앱)이라면 모바일이 루팅되었는지에 대해 자체적으로 검사하고 그에 따라 동작해야 합니다. +- 앱이 민감한 성격(예: 은행 앱)이라면 **emulator** 사용 여부를 검사해야 합니다. +- 앱이 민감한 성격(예: 은행 앱)이라면 실행하기 전에 **자기 무결성(self integrity)** 을 검사하여 수정되었는지 확인해야 합니다. +- 어떤 컴파일러/패커/난독화 도구로 APK가 빌드되었는지 확인하려면 [**APKiD**](https://github.com/rednaga/APKiD)를 사용하세요 ### React Native Application -React 애플리케이션의 javascript 코드를 쉽게 접근하는 방법을 배우려면 다음 페이지를 읽으세요: +다음 페이지를 읽어 React 애플리케이션의 JavaScript 코드를 쉽게 접근하는 방법을 확인하세요: {{#ref}} @@ -187,7 +186,7 @@ react-native-application.md ### Xamarin Applications -Xamarin 애플리케이션의 C# 코드에 쉽게 접근하는 방법을 배우려면 다음 페이지를 읽으세요: +다음 페이지를 읽어 Xamarin 애플리케이션의 C# 코드에 쉽게 접근하는 방법을 확인하세요: {{#ref}} @@ -196,17 +195,17 @@ Xamarin 애플리케이션의 C# 코드에 쉽게 접근하는 방법을 배우 ### Superpacked Applications -이 [**blog post**](https://clearbluejar.github.io/posts/desuperpacking-meta-superpacked-apks-with-github-actions/)에 따르면 superpacked는 애플리케이션의 내용을 단일 파일로 압축하는 Meta 알고리즘입니다. 블로그는 이러한 앱을 압축 해제하는 앱을 만드는 가능성에 대해 이야기하며... **애플리케이션을 실행하고 파일시스템에서 압축 해제된 파일을 수집하는 더 빠른 방법**에 대해서도 언급합니다. +이 [**blog post**](https://clearbluejar.github.io/posts/desuperpacking-meta-superpacked-apks-with-github-actions/)에 따르면 superpacked는 애플리케이션의 콘텐츠를 하나의 파일로 압축하는 Meta 알고리즘입니다. 블로그는 이러한 종류의 앱을 압축 해제하는 앱을 만드는 가능성에 대해 이야기하고 있으며... 더 빠른 방법으로는 **애플리케이션을 실행하고 파일시스템에서 압축 해제된 파일을 수집(execute the application and gather the decompressed files from the filesystem.)**하는 방법이 있습니다. ### Automated Static Code Analysis -도구 [**mariana-trench**](https://github.com/facebook/mariana-trench)는 애플리케이션의 **코드**를 **스캔**하여 **취약점(vulnerabilities)** 을 찾을 수 있습니다. 이 도구는 **known sources**(사용자에 의해 **입력**이 **제어되는 위치**를 도구에 알려주는 것), **sinks**(악의적인 사용자 입력이 피해를 일으킬 수 있는 **위험한 위치**) 및 **rules**의 집합을 포함합니다. 이 규칙들은 취약점을 가리키는 **sources-sinks** 조합을 나타냅니다. +도구 [**mariana-trench**](https://github.com/facebook/mariana-trench)는 애플리케이션의 **코드**를 **스캔**하여 **취약점(vulnerabilities)** 을 찾을 수 있습니다. 이 도구는 **known sources**(도구에 **입력(input)** 이 **사용자에 의해 제어되는 위치**를 알려주는 것), **sinks**(악의적 사용자 입력이 피해를 줄 수 있는 **위험한 위치**) 및 **rules**의 집합을 포함합니다. 이 규칙들은 취약점을 나타내는 **sources-sinks**의 **조합**을 지시합니다. -이 지식을 바탕으로 **mariana-trench는 코드를 검토하고 가능한 취약점을 찾아냅니다**. +이 지식을 바탕으로 **mariana-trench는 코드를 검토하여 가능한 취약점을 찾아냅니다.** ### Secrets leaked -애플리케이션 내에 API 키, 비밀번호, 숨겨진 URL, 서브도메인 등과 같은 secrets가 포함되어 있을 수 있으며 이를 발견할 수 있습니다. 예를 들어 [https://github.com/dwisiswant0/apkleaks](https://github.com/dwisiswant0/apkleaks) 같은 도구를 사용할 수 있습니다. +애플리케이션에는 API 키, 비밀번호, 숨겨진 URL, 서브도메인 등과 같은 비밀이 포함되어 있을 수 있으며 이를 발견할 수 있습니다. 예를 들어 [https://github.com/dwisiswant0/apkleaks](https://github.com/dwisiswant0/apkleaks) 같은 도구를 사용할 수 있습니다. ### Bypass Biometric Authentication @@ -215,12 +214,12 @@ Xamarin 애플리케이션의 C# 코드에 쉽게 접근하는 방법을 배우 bypass-biometric-authentication-android.md {{#endref}} -### Other interesting functions +### 기타 흥미로운 기능 - **Code execution**: `Runtime.exec(), ProcessBuilder(), native code:system()` - **Send SMSs**: `sendTextMessage, sendMultipartTestMessage` - **Native functions** declared as `native`: `public native, System.loadLibrary, System.load` -- [이 문서를 읽어 **네이티브 함수 리버싱 방법**을 배우세요](reversing-native-libraries.md) +- [Read this to learn **how to reverse native functions**](reversing-native-libraries.md) ### **Other tricks** @@ -233,215 +232,223 @@ content-protocol.md --- -## Dynamic Analysis +## 동적 분석 -> 먼저, 애플리케이션을 설치하고 필요한 환경(Burp CA cert, Drozer 및 Frida 등)을 구성할 수 있는 환경이 필요합니다. 따라서 루팅된 기기(rooted device, 에뮬레이터 여부 무관)를 강력히 권장합니다. +> 우선, 애플리케이션과 관련 환경(Burp CA cert, Drozer 및 Frida 등)을 설치할 수 있는 환경이 필요합니다. 따라서 루팅된 디바이스(에뮬레이터든 아니든)가 강력히 권장됩니다. -### Online Dynamic analysis +### 온라인 동적 분석 -[https://appetize.io/](https://appetize.io/)에서 **무료 계정**을 생성할 수 있습니다. 이 플랫폼은 APK를 **업로드**하고 **실행**할 수 있게 해주므로 APK가 어떻게 동작하는지 확인하는 데 유용합니다. +다음에서 **무료 계정**을 생성할 수 있습니다: [https://appetize.io/](https://appetize.io/). 이 플랫폼은 APK를 **업로드**하고 **실행**할 수 있게 해주므로 APK가 어떻게 동작하는지 확인하는 데 유용합니다. -웹에서 **애플리케이션 로그를 확인**할 수 있고 **adb**로 연결할 수도 있습니다. +웹에서 애플리케이션의 로그를 확인하고 **adb**를 통해 연결할 수도 있습니다. ![](<../../images/image (831).png>) -ADB 연결 덕분에 에뮬레이터 내에서 **Drozer**와 **Frida**를 사용할 수 있습니다. +ADB 연결 덕분에 에뮬레이터 안에서 **Drozer**와 **Frida**를 사용할 수 있습니다. -### Local Dynamic Analysis +### 로컬 동적 분석 -#### Using an emulator +#### 에뮬레이터 사용 -- [**Android Studio**](https://developer.android.com/studio) (x86 및 arm 디바이스를 생성할 수 있으며, [**이 글**](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)에 따르면 최신 x86 버전은 느린 arm 에뮬레이터 없이도 **ARM libraries**를 지원합니다). -- 설정 방법은 다음 페이지를 참고하세요: +- [**Android Studio**](https://developer.android.com/studio) (x86 및 arm 디바이스를 생성할 수 있으며, [**이 글**](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)에 따르면 최신 x86 버전은 느린 ARM 에뮬레이터 없이도 ARM 라이브러리를 지원합니다). +- 설정 방법은 다음 페이지에서 확인하세요: {{#ref}} avd-android-virtual-device.md {{#endref}} -- [**Genymotion**](https://www.genymotion.com/fun-zone/) **(무료 버전:** Personal Edition, 계정 생성 필요. _가능한 오류를 피하기 위해 **VirtualBox**가 포함된 버전을 **다운로드**하는 것이 권장됩니다._) -- [**Nox**](https://es.bignox.com) (무료이지만 Frida 또는 Drozer를 지원하지 않습니다). +- [**Genymotion**](https://www.genymotion.com/fun-zone/) **(무료 버전:** Personal Edition, 계정 생성 필요. _가능한 오류를 피하려면 VirtualBox가 포함된 버전을 **WITH** 다운로드하는 것이 권장됩니다._) +- [**Nox**](https://es.bignox.com) (무료지만 Frida나 Drozer는 지원하지 않습니다). > [!TIP] -> 어떤 플랫폼에서 새로운 에뮬레이터를 생성할 때 화면이 클수록 에뮬레이터가 느려집니다. 가능하면 작은 화면을 선택하세요. +> 새 에뮬레이터를 만들 때 화면이 클수록 에뮬레이터가 더 느려집니다. 가능하면 작은 화면을 선택하세요. -Genymotion에 **google services**(예: AppStore)를 설치하려면 다음 이미지에서 빨간색으로 표시된 버튼을 클릭해야 합니다: +Genymotion에 **google services**(예: AppStore)를 설치하려면 다음 이미지에서 빨간 표시된 버튼을 클릭해야 합니다: ![](<../../images/image (277).png>) -또한 **Genymotion의 Android VM 구성(configuration of the Android VM in Genymotion)** 에서 **Bridge Network mode**를 선택할 수 있다는 점을 기억하세요(도구가 설치된 다른 VM에서 Android VM에 연결할 경우 유용합니다). +또한 **Genymotion의 Android VM 구성(configuration of the Android VM in Genymotion)**에서 **Bridge Network mode**를 선택할 수 있음을 확인하세요(다른 VM에서 도구로 Android VM에 연결할 경우 유용합니다). -#### Use a physical device +#### 물리적 디바이스 사용 -디버깅 옵션을 활성화해야 하며 가능하면 루팅(root)하는 것이 좋습니다: +**debugging** 옵션을 활성화해야 하며 루팅(root)하면 더 좋습니다: 1. **Settings**. -2. (Android 8.0부터) **System** 선택. -3. **About phone** 선택. -4. **Build number**를 7번 누릅니다. -5. 뒤로 가면 **Developer options**를 찾을 수 있습니다. +2. (FromAndroid 8.0) Select **System**. +3. Select **About phone**. +4. Press **Build number** 7 times. +5. Go back and you will find the **Developer options**. -> 애플리케이션을 설치한 후 가장 먼저 해야 할 일은 해당 앱을 사용해보고 무엇을 하는지, 어떻게 동작하는지 조사하여 익숙해지는 것입니다.\ -> 초기 동적 분석은 **MobSF dynamic analysis + pidcat**을 사용하여 수행할 것을 권장합니다. 이렇게 하면 MobSF가 나중에 검토할 수 있는 많은 **흥미로운 데이터**를 **캡처**하는 동안 애플리케이션의 동작을 배우는 데 도움이 됩니다. +> 애플리케이션을 설치한 후 가장 먼저 해야 할 일은 앱을 직접 실행해 무엇을 하는지, 어떻게 동작하는지 조사하여 익숙해지는 것입니다.\ +> 저는 MobSF dynamic analysis + pidcat을 사용한 초기 동적 분석을 수행할 것을 제안합니다. 이렇게 하면 애플리케이션이 어떻게 동작하는지 배우는 동시에 MobSF가 나중에 검토할 수 있는 많은 흥미로운 데이터를 캡처합니다. -### Unintended Data Leakage +Magisk/Zygisk quick notes (recommended on Pixel devices) +- Patch boot.img with the Magisk app and flash via fastboot to get systemless root +- Enable Zygisk + DenyList for root hiding; consider LSPosed/Shamiko when stronger hiding is required +- Keep original boot.img to recover from OTA updates; re-patch after each OTA +- For screen mirroring, use scrcpy on the host -**로깅(Logging)** -개발자는 **디버깅 정보**를 공개적으로 노출하지 않도록 주의해야 하며, 이는 민감한 데이터의 유출로 이어질 수 있습니다. 애플리케이션 로그를 모니터링하여 민감한 정보를 식별하고 보호하기 위해 [**pidcat**](https://github.com/JakeWharton/pidcat) 및 `adb logcat`을 권장합니다. **Pidcat**은 사용 편의성과 가독성 때문에 선호됩니다. + +### 의도치 않은 데이터 leak + +**로깅** + +개발자는 **디버깅 정보(debugging information)** 를 공개적으로 노출하지 않도록 주의해야 합니다. 이는 민감한 데이터가 leak될 수 있기 때문입니다. 애플리케이션 로그를 모니터링하여 민감한 정보를 식별하고 보호하기 위해 [**pidcat**](https://github.com/JakeWharton/pidcat) 및 `adb logcat` 도구를 권장합니다. **Pidcat**은 사용 편의성과 가독성 때문에 선호됩니다. > [!WARNING] -> Android 4.0 이후 버전부터는 **애플리케이션이 자신의 로그만 접근할 수 있습니다**. 따라서 앱은 다른 앱의 로그에 접근할 수 없습니다.\ -> 그럼에도 불구하고 민감한 정보를 로그로 남기지 않는 것이 권장됩니다. +> Android 4.0 이후 버전부터 **애플리케이션은 자신의 로그만 접근할 수 있습니다**. 따라서 앱은 다른 앱의 로그를 접근할 수 없습니다.\ +> 그럼에도 불구하고 민감한 정보를 로그에 남기지 않는 것이 권장됩니다. -**복사/붙여넣기 버퍼 캐싱(Copy/Paste Buffer Caching)** +**복사/붙여넣기 버퍼 캐싱** -Android의 **클립보드 기반** 프레임워크는 앱 간 복사-붙여넣기 기능을 가능하게 하지만, **다른 애플리케이션이 클립보드에 접근**할 수 있어 민감한 데이터가 노출될 위험이 있습니다. 신용카드 정보와 같은 민감한 섹션에 대해 복사/붙여넣기 기능을 비활성화하는 것이 중요합니다. +Android의 **클립보드 기반** 프레임워크는 앱 간 복사-붙여넣기 기능을 제공하지만 **다른 애플리케이션**이 클립보드에 접근할 수 있어 민감한 데이터가 노출될 위험이 있습니다. 신용카드 정보 같은 민감한 섹션에 대해서는 복사/붙여넣기 기능을 비활성화하는 것이 중요합니다. -**Crash Logs** +**크래시 로그** -애플리케이션이 **충돌(crash)** 하고 로그를 저장하는 경우, 이러한 로그는 특히 애플리케이션을 역분석할 수 없을 때 공격자에게 도움이 될 수 있습니다. 이 위험을 줄이려면 충돌 시 로깅을 피하고, 로그를 네트워크로 전송해야 하는 경우 SSL 채널을 통해 전송되도록 하세요. +애플리케이션이 **크래시**하고 로그를 저장하면, 해당 로그는 특히 애플리케이션을 리버스엔지니어링할 수 없는 경우 공격자에게 도움이 될 수 있습니다. 이를 완화하려면 크래시 시 로그를 남기지 말고, 로그를 네트워크로 전송해야 한다면 반드시 SSL 채널을 통해 전송하세요. -pentester로서 **이 로그들을 살펴보도록** 하세요. +펜테스터(pentester)로서 **이 로그들을 확인해 보세요**. -**Analytics Data Sent To 3rd Parties** +**제3자에게 전송되는 분석 데이터** -애플리케이션은 종종 Google Adsense와 같은 서비스를 통합하는데, 개발자의 잘못된 구현으로 인해 민감한 데이터가 leak될 수 있습니다. 잠재적 데이터 유출을 식별하려면 애플리케이션의 트래픽을 가로채서 제3자 서비스로 전송되는 민감한 정보가 있는지 확인하는 것이 좋습니다. +애플리케이션은 종종 Google Adsense와 같은 서비스를 통합하며, 개발자의 잘못된 구현으로 인해 민감한 데이터가 의도치 않게 leak될 수 있습니다. 데이터 유출 가능성을 식별하려면 애플리케이션의 트래픽을 가로채어 제3자에게 전송되는 민감한 정보가 있는지 확인하는 것이 좋습니다. ### SQLite DBs -대부분의 애플리케이션은 정보를 저장하기 위해 **내부 SQLite 데이터베이스**를 사용합니다. 펜테스트 동안 생성된 **데이터베이스**, **테이블** 및 **컬럼 이름**, 저장된 모든 **데이터**를 확인하세요. 민감한 정보가 발견될 수 있습니다(이는 취약점입니다).\ -데이터베이스는 일반적으로 `/data/data/the.package.name/databases`에 위치하며 예: `/data/data/com.mwr.example.sieve/databases` +대부분의 애플리케이션은 정보를 저장하기 위해 **내부 SQLite 데이터베이스**를 사용합니다. 펜테스트 중에는 생성된 **데이터베이스**, **테이블** 및 **컬럼** 이름과 저장된 모든 **데이터**를 확인하세요. 민감한 정보를 발견할 수 있으며 이는 취약점이 됩니다.\ +데이터베이스는 `/data/data/the.package.name/databases`에 위치해야 하며 예시는 `/data/data/com.mwr.example.sieve/databases` 입니다. -데이터베이스가 기밀 정보를 암호화(encrypted)하고 있지만 애플리케이션 내에서 암호를 찾을 수 있다면 이는 여전히 **취약점**입니다. +데이터베이스가 기밀 정보를 저장하고 있고 **암호화되어(encrypted)** 있더라도 애플리케이션 내에서 **암호(password)** 를 찾을 수 있다면 여전히 **취약점**입니다. -`.tables`로 테이블을 나열하고 `.schema `으로 테이블의 컬럼을 나열하세요. +`.tables`로 테이블을 열거하고 `.schema `으로 테이블의 컬럼을 확인하세요. ### 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 메커니즘을 이용하고 기본 운영체제와 상호작용할 수 있습니다. .\ -Drozer는 다음 섹션에서 배우게 될 것처럼 **exported activities, exported services 및 Content Providers를 공격(exploit)** 하는 데 유용한 도구입니다. +From [Drozer Docs](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf): **Drozer**를 사용하면 **Android 앱의 역할을 맡아** 다른 앱과 상호작용할 수 있습니다. 설치된 애플리케이션이 할 수 있는 모든 작업—Android의 Inter-Process Communication(IPC) 메커니즘을 이용하거나 기본 운영체제와 상호작용하는 것—을 수행할 수 있습니다. .\ +Drozer는 **exported activities, exported services 및 Content Providers**를 **익스플로잇**하는 데 유용한 도구입니다. 다음 섹션에서 이를 배우게 될 것입니다. -### Exploiting exported Activities +### Exported Activities 익스플로잇 -[**Android Activity가 무엇인지 복습하고 싶다면 이 문서를 읽으세요.**](android-applications-basics.md#launcher-activity-and-other-activities)\ -또한 Activity의 코드는 **`onCreate`** 메서드에서 시작된다는 점을 기억하세요. +[**Android Activity가 무엇인지 복습하고 싶다면 이것을 읽으세요.**](android-applications-basics.md#launcher-activity-and-other-activities)\ +또한 액티비티의 코드는 **`onCreate`** 메서드에서 시작된다는 것을 기억하세요. -**권한 우회(Authorisation bypass)** +**권한/인증 우회(Authorisation bypass)** -Activity가 exported 되어 있으면 외부 앱에서 해당 화면을 호출할 수 있습니다. 따라서 **민감한 정보**를 포함한 Activity가 **exported** 되어 있다면 인증(authentication) 메커니즘을 **우회(bypass)** 하여 접근할 수 있습니다. +Activity가 exported되어 있으면 외부 앱에서 그 화면을 호출할 수 있습니다. 따라서 **민감한 정보를 포함한 액티비티가 exported되어 있다면**, 인증 메커니즘을 **bypass**하여 접근할 수 있습니다. -[**Drozer로 exported activities를 공격하는 방법을 배우세요.**](drozer-tutorial/index.html#activities) +[**Drozer로 exported activities를 익스플로잇하는 방법을 배우세요.**](drozer-tutorial/index.html#activities) -또한 adb에서 exported activity를 시작할 수도 있습니다: +다음과 같이 adb에서 exported activity를 시작할 수도 있습니다: - PackageName is com.example.demo - Exported ActivityName is com.example.test.MainActivity ```bash adb shell am start -n com.example.demo/com.example.test.MainActivity ``` -**참고**: MobSF는 activity에서 `android:launchMode`로 _**singleTask/singleInstance**_를 사용하는 것을 악성으로 탐지합니다, 하지만 [this](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750) 때문에, 명백히 이는 구버전(API versions < 21)에서만 위험한 것으로 보입니다. +**참고**: MobSF will detect as malicious the use of _**singleTask/singleInstance**_ as `android:launchMode` in an activity, but due to [this](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750), apparently this is only dangerous on old versions (API versions < 21). > [!TIP] -> authorisation bypass는 항상 취약점이 되는 것은 아니며, 우회 방식과 어떤 정보가 노출되는지에 따라 달라집니다. +> Note that an authorisation bypass is not always a vulnerability, it would depend on how the bypass works and which information is exposed. **Sensitive information leakage** -**Activities can also return results**. 만약 export되어 있고 보호되지 않은 activity가 **`setResult`** 메서드를 호출하여 **민감한 정보를 반환**한다면, there is a sensitive information leakage. +**액티비티는 결과를 반환할 수도 있습니다**. export되어 있고 보호되지 않은 액티비티가 **`setResult`** 메서드를 호출하며 **민감한 정보를 반환**한다면, sensitive information leakage가 발생합니다. #### Tapjacking -Tapjacking이 방지되지 않으면, export된 activity를 악용하여 **사용자가 예기치 않은 동작을 수행하도록** 만들 수 있습니다. For more info about [**what is Tapjacking follow the link**](#tapjacking). +Tapjacking이 방지되지 않는다면, export된 액티비티를 악용하여 **사용자가 예상치 못한 동작을 수행하도록** 만들 수 있습니다. 자세한 내용은 [**what is Tapjacking follow the link**](#tapjacking)를 참조하세요. ### Exploiting Content Providers - Accessing and manipulating sensitive information [**Read this if you want to refresh what is a Content Provider.**](android-applications-basics.md#content-provider)\ -Content providers는 기본적으로 **데이터를 공유**하는 데 사용됩니다. 앱에 사용 가능한 content providers가 있다면, 거기서부터 **민감한 데이터**를 추출할 수 있습니다. 또한 취약할 수 있으므로 가능한 **SQL injections** 및 **Path Traversals**를 테스트해보는 것이 좋습니다. +Content providers는 기본적으로 **데이터 공유**에 사용됩니다. 앱에 사용 가능한 content providers가 있다면 그들로부터 **민감한 데이터를 추출**할 수 있을지도 모릅니다. 또한 **SQL injections** 및 **Path Traversals** 가능성을 테스트해보는 것도 흥미로운데, 취약할 수 있기 때문입니다. [**Learn how to exploit Content Providers with Drozer.**](drozer-tutorial/index.html#content-providers) ### **Exploiting Services** [**Read this if you want to refresh what is a Service.**](android-applications-basics.md#services)\ -Service의 동작은 `onStartCommand` 메서드에서 시작된다는 점을 기억하세요. +Service의 동작은 `onStartCommand` 메서드에서 시작한다는 것을 기억하세요. -Service는 기본적으로 데이터를 **수신할 수 있고**, 이를 **처리**하며 **응답을 반환**(또는 반환하지 않을 수 있음)하는 것입니다. 따라서 애플리케이션이 일부 서비스를 export하고 있다면, 해당 서비스가 무엇을 하는지 이해하기 위해 **코드**를 확인하고 기밀 정보를 추출하거나 인증 우회 등을 위해 동적으로 **테스트**해야 합니다.\ +Service는 기본적으로 데이터를 **수신**하고 이를 **처리**하며 (응답을) **반환**(또는 반환하지 않음)할 수 있는 구성요소입니다. 따라서 애플리케이션이 일부 서비스를 export하고 있다면 해당 서비스가 무엇을 하는지 이해하기 위해 **코드**를 **확인**하고 기밀 정보를 추출하거나 인증 우회 등을 위해 **동적**으로 **테스트**해야 합니다.\ [**Learn how to exploit Services with Drozer.**](drozer-tutorial/index.html#services) ### **Exploiting Broadcast Receivers** [**Read this if you want to refresh what is a Broadcast Receiver.**](android-applications-basics.md#broadcast-receivers)\ -Broadcast Receiver의 동작은 `onReceive` 메서드에서 시작된다는 점을 기억하세요. +Broadcast Receiver의 동작은 `onReceive` 메서드에서 시작한다는 것을 기억하세요. -Broadcast receiver는 특정 타입의 메시지를 기다립니다. 수신자가 메시지를 처리하는 방식에 따라 취약할 수 있습니다.\ +브로드캐스트 리시버는 특정 유형의 메시지를 기다립니다. 리시버가 메시지를 처리하는 방식에 따라 취약해질 수 있습니다.\ [**Learn how to exploit Broadcast Receivers with Drozer.**](#exploiting-broadcast-receivers) ### **Exploiting Schemes / Deep links** -You can look for deep links manually, using tools like MobSF or scripts like [this one](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py).\ -선언된 **scheme**은 **adb** 또는 **browser**를 사용하여 열 수 있습니다: +딥링크를 수동으로 찾을 수도 있고, MobSF 같은 도구나 [this one](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py) 같은 스크립트를 사용할 수도 있습니다.\ +선언된 scheme은 adb 또는 브라우저로 열 수 있습니다: ```bash adb shell am start -a android.intent.action.VIEW -d "scheme://hostname/path?param=value" [your.package.name] ``` -_패키지 이름을 **생략할 수 있으며**, 모바일 기기는 해당 링크를 열 앱을 자동으로 호출합니다._ +_참고로 **패키지 이름을 생략할 수 있으며** 모바일이 해당 링크를 열 앱을 자동으로 호출합니다._ ```html Click me with alternative ``` -**실행되는 코드** +**앱에서 실행될 코드** -앱에서 실행될 **code**를 찾기 위해, deeplink에 의해 호출되는 activity로 이동하여 함수 **`onNewIntent`**을 검색하세요. +앱에서 **실행될 코드**를 찾으려면 deeplink에 의해 호출되는 activity로 이동하여 함수 **`onNewIntent`**를 검색하세요. ![](<../../images/image (436) (1) (1) (1).png>) -**민감 정보** +**민감한 정보** -deep link를 찾을 때마다 해당 deep link가 **URL parameters를 통해 비밀번호 같은 민감한 데이터를 받지 않는지** 확인하세요. 다른 애플리케이션이 **deep link를 가장하여 해당 데이터를 탈취할 수 있기 때문입니다!** +deep link를 찾을 때마다 해당 deep link가 **URL 매개변수를 통해 민감한 데이터(예: 비밀번호)를 받지 않는지** 확인하세요. 다른 어떤 애플리케이션도 **deep link를 사칭하여 그 데이터를 훔칠 수 있습니다!** -**경로의 파라미터** +**경로 파라미터** -URL 경로 안에 파라미터를 사용하는 deep link가 있는지도 **반드시 확인해야 합니다**, 예: `https://api.example.com/v1/users/{username}`. 이 경우 `example://app/users?username=../../unwanted-endpoint%3fparam=value` 처럼 path traversal을 강제할 수 있습니다.\ -앱 내부에서 올바른 엔드포인트를 찾으면 경로의 일부가 도메인으로 사용되는 경우 **Open Redirect**를 유발할 수 있고, CSRF token 없이 사용자 정보를 수정할 수 있고 취약한 엔드포인트가 올바른 메서드를 사용했다면 **account takeover**가 가능하며 기타 다른 vuln도 발생할 수 있습니다. 자세한 내용은 [info about this here](http://dphoeniixx.com/2020/12/13-2/). +You **must check also if any deep link is using a parameter inside the path** of the URL like: `https://api.example.com/v1/users/{username}` , in that case you can force a path traversal accessing something like: `example://app/users?username=../../unwanted-endpoint%3fparam=value` .\ +Note that if you find the correct endpoints inside the application you may be able to cause a **Open Redirect** (if part of the path is used as domain name), **account takeover** (if you can modify users details without CSRF token and the vuln endpoint used the correct method) and any other vuln. More [info about this here](http://dphoeniixx.com/2020/12/13-2/). -**More examples** +**추가 예시** An [interesting bug bounty report](https://hackerone.com/reports/855618) about links (_/.well-known/assetlinks.json_). ### 전송 계층 검사 및 검증 실패 -- **인증서는 항상 제대로 검사되지 않습니다.** Android 애플리케이션에서는 경고를 무시하고 self-signed 인증서를 수락하거나 경우에 따라 HTTP 연결로 회귀하는 경우가 흔합니다. -- **SSL/TLS 핸드셰이크 중 협상이 약한 경우가 있습니다**, 취약한 cipher suites를 사용하는 경우가 있어 연결이 man-in-the-middle (MITM) 공격에 취약해져 공격자가 데이터를 복호화할 수 있습니다. -- **Leakage of private information**은 애플리케이션이 보안 채널로 인증한 후 다른 트랜잭션을 비보안 채널로 통신하면 발생할 수 있는 위험입니다. 이 접근 방식은 session cookies나 사용자 정보 같은 민감한 데이터를 악의적 주체가 가로채는 것으로부터 보호하지 못합니다. +- **인증서가 항상 제대로 검사되는 것은 아니다** Android 애플리케이션에서는 경고를 무시하고 자체 서명 인증서를 수락하거나, 경우에 따라 HTTP 연결로 되돌아가는 일이 흔합니다. +- **SSL/TLS 핸드셰이크 동안의 협상이 때때로 약하다**, 취약한 암호 모음을 사용합니다. 이 취약점은 MITM(man-in-the-middle) 공격에 노출되어 공격자가 데이터를 복호화할 수 있게 만듭니다. +- **Leakage of private information**는 애플리케이션이 보안 채널로 인증을 수행한 뒤 다른 트랜잭션에서 비보안 채널로 통신할 때 위험합니다. 이러한 접근 방식은 세션 쿠키나 사용자 정보와 같은 민감한 데이터를 악의적인 주체가 가로챌 수 있도록 합니다. #### 인증서 검증 -우리는 **certificate verification**에 집중할 것입니다. 서버 인증서의 무결성을 검증하는 것은 보안을 강화하기 위해 필수적입니다. 이는 안전하지 않은 TLS 구성과 민감한 데이터를 암호화되지 않은 채널로 전송하는 것이 심각한 위험을 초래할 수 있기 때문입니다. 서버 인증서를 검증하고 취약점을 해결하는 자세한 단계는 [**this resource**](https://manifestsecurity.com/android-application-security-part-10/)에서 포괄적으로 안내합니다. +우리는 **인증서 검증**에 중점을 둡니다. 보안을 강화하려면 서버 인증서의 무결성을 검증해야 합니다. 이는 불안전한 TLS 구성과 암호화되지 않은 채널을 통한 민감한 데이터 전송이 심각한 위험을 초래할 수 있기 때문에 매우 중요합니다. 서버 인증서를 검증하고 취약점을 해결하는 자세한 단계는 [**this resource**](https://manifestsecurity.com/android-application-security-part-10/)에서 포괄적으로 안내합니다. #### SSL Pinning -SSL Pinning은 애플리케이션이 서버의 인증서를 앱 내에 저장된 알려진 사본과 비교하여 검증하는 보안 조치입니다. 이 방법은 MITM 공격을 방지하는 데 필수적입니다. 민감한 정보를 다루는 애플리케이션에는 SSL Pinning 구현을 강력히 권장합니다. +SSL Pinning은 애플리케이션이 서버의 인증서를 애플리케이션 내부에 저장된 알려진 사본과 대조하여 검증하는 보안 수단입니다. 이 방법은 MITM 공격을 방지하는 데 필수적입니다. 민감한 정보를 다루는 애플리케이션에는 SSL Pinning 구현을 강력히 권장합니다. #### 트래픽 검사 -HTTP 트래픽을 검사하려면 프록시 도구의 인증서(예: Burp)를 **설치해야** 합니다. 이 인증서를 설치하지 않으면 암호화된 트래픽이 프록시를 통해 보이지 않을 수 있습니다. 커스텀 CA 인증서 설치 가이드는 [**여기**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine)를 참조하세요. +HTTP 트래픽을 검사하려면 프록시 도구의 인증서(예: Burp)를 **설치해야** 합니다. 이 인증서를 설치하지 않으면 암호화된 트래픽이 프록시를 통해 보이지 않을 수 있습니다. 커스텀 CA 인증서 설치 가이드는 [**click here**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine)를 참조하세요. -**API Level 24 이상**을 타깃으로 하는 애플리케이션은 프록시의 CA 인증서를 허용하도록 Network Security Config를 수정해야 합니다. 암호화된 트래픽을 검사하려면 이 단계가 중요합니다. Network Security Config 수정 방법은 [**refer to this tutorial**](make-apk-accept-ca-certificate.md)를 참고하세요. +**API Level 24 and above**를 타깃으로 하는 애플리케이션은 프록시의 CA 인증서를 수락하도록 Network Security Config를 수정해야 합니다. 이 단계는 암호화된 트래픽을 검사하는 데 중요합니다. Network Security Config 수정 방법은 [**refer to this tutorial**](make-apk-accept-ca-certificate.md)를 참조하세요. -만약 **Flutter**를 사용하고 있다면 [**this page**](flutter.md)의 지침을 따라야 합니다. 단순히 인증서를 스토어에 추가하는 것만으로는 동작하지 않으며, Flutter는 자체적으로 유효한 CA 목록을 사용하기 때문입니다. +If **Flutter**가 사용되는 경우 [**this page**](flutter.md)의 지침을 따라야 합니다. 단순히 인증서를 스토어에 추가하는 것만으로는 작동하지 않으며, Flutter는 자체적인 유효 CA 목록을 가지고 있기 때문입니다. #### SSL/TLS pinning의 정적 탐지 런타임 우회 시도를 하기 전에 APK에서 pinning이 적용된 위치를 빠르게 매핑하세요. 정적 탐지는 훅/패치 계획을 세우고 올바른 코드 경로에 집중하는 데 도움이 됩니다. Tool: SSLPinDetect -- 오픈소스 정적 분석 유틸리티로 APK를 Smali로 디컴파일(apktool 사용)한 뒤 SSL/TLS pinning 구현의 curated regex 패턴을 스캔합니다. -- 각 매치에 대해 정확한 파일 경로, 라인 번호, 코드 스니펫을 보고합니다. -- 일반적인 프레임워크와 커스텀 코드 경로를 다룹니다: OkHttp CertificatePinner, custom javax.net.ssl.X509TrustManager.checkServerTrusted, SSLContext.init with custom TrustManagers/KeyManagers, 그리고 Network Security Config XML pins 등. +- 오픈소스 정적 분석 유틸리티로 APK를 Smali( via apktool )로 디컴파일하고 SSL/TLS pinning 구현에 대한 선별된 정규식 패턴을 스캔합니다. +- 각 일치 항목에 대해 정확한 파일 경로, 라인 번호 및 코드 스니펫을 보고합니다. +- 일반적인 프레임워크 및 커스텀 코드 경로를 포괄합니다: OkHttp CertificatePinner, custom javax.net.ssl.X509TrustManager.checkServerTrusted, SSLContext.init with custom TrustManagers/KeyManagers, and Network Security Config XML pins. -Install -- Prereqs: Python >= 3.8, Java on PATH, apktool +설치 +- 필수 요건: Python >= 3.8, Java on PATH, apktool ```bash git clone https://github.com/aancw/SSLPinDetect cd SSLPinDetect @@ -455,8 +462,8 @@ python sslpindetect.py -f app.apk -a apktool.jar # Verbose (timings + per-match path:line + snippet) python sslpindetect.py -a apktool_2.11.0.jar -f sample/app-release.apk -v ``` -예제 패턴 규칙 (JSON) -signatures를 사용하거나 확장하여 독점/커스텀 pinning 스타일을 탐지하세요. 자신만의 JSON을 로드하여 대규모로 스캔할 수 있습니다. +예시 패턴 규칙 (JSON) +signatures를 사용하거나 확장하여 독점/커스텀 pinning 스타일을 탐지하세요. 자신의 JSON을 불러와 대규모로 스캔할 수 있습니다. ```json { "OkHttp Certificate Pinning": [ @@ -470,43 +477,43 @@ signatures를 사용하거나 확장하여 독점/커스텀 pinning 스타일을 ] } ``` -노트 및 팁 -- 대규모 앱을 빠르게 스캔하려면 멀티스레딩 및 memory-mapped I/O를 사용하세요; 사전 컴파일된 regex는 오버헤드와 오탐(false positives)을 줄여줍니다. +Notes and tips +- 대형 앱을 빠르게 스캔하려면 멀티스레딩과 메모리 매핑 I/O를 사용하세요; 사전 컴파일된 regex는 오버헤드와 false positives를 줄여줍니다. - Pattern collection: https://github.com/aancw/smali-sslpin-patterns -- 다음으로 우선 순위로 삼아야 할 대표적인 탐지 대상: +- 다음으로 분류할 일반적인 탐지 대상: - OkHttp: CertificatePinner 사용, setCertificatePinner, okhttp3/okhttp 패키지 참조 - Custom TrustManagers: javax.net.ssl.X509TrustManager, checkServerTrusted 오버라이드 -- Custom SSL contexts: SSLContext.getInstance + SSLContext.init with custom managers -- res/xml network security config 및 manifest 참조에 선언된 pins -- 매칭된 위치를 사용해 Frida hooks, static patches, 또는 config 리뷰를 계획하고 동적 테스트 전에 확인하세요. +- Custom SSL contexts: SSLContext.getInstance + SSLContext.init 와 커스텀 매니저 +- Declarative pins in res/xml network security config 및 manifest 참조 +- 일치한 위치를 활용해 Frida hooks, static 패치 또는 설정 검토를 계획한 뒤 동적 테스트를 진행하세요. #### SSL Pinning 우회 -애플리케이션에 SSL Pinning이 구현되어 있으면 HTTPS 트래픽을 검사하기 위해 이를 우회해야 합니다. 이를 위한 여러 방법이 있습니다: +SSL Pinning이 구현된 경우 HTTPS 트래픽을 검사하기 위해 이를 우회해야 합니다. 이를 위한 다양한 방법이 있습니다: -- 자동으로 [**apk-mitm**](https://github.com/shroudedcode/apk-mitm)을 사용해 **apk**를 **수정**하여 SSLPinning을 **우회**할 수 있습니다. 이 옵션의 가장 큰 장점은 SSL Pinning을 우회하기 위해 root가 필요 없다는 점이지만, 애플리케이션을 삭제하고 새로 설치해야 하며 항상 동작하지는 않습니다. -- 이 보호를 우회하기 위해 **Frida**(아래 참조)를 사용할 수 있습니다. Burp+Frida+Genymotion을 사용하는 가이드는 다음을 참조하세요: [https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/) -- [**objection**](frida-tutorial/objection-tutorial.md)을 사용해 **자동으로 SSL Pinning을 우회**해 볼 수도 있습니다:**:** `objection --gadget com.package.app explore --startup-command "android sslpinning disable"` -- **MobSF dynamic analysis**(아래 설명)을 사용해 **자동으로 SSL Pinning을 우회**할 수도 있습니다 -- 여전히 캡처되지 않은 트래픽이 있다고 생각되면 **iptables를 사용해 트래픽을 Burp로 포워딩**해 보세요. 다음 블로그를 참고하세요: [https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62) +- 자동으로 [**apk-mitm**](https://github.com/shroudedcode/apk-mitm)을 사용해 **apk**를 **수정**하여 **SSLPinning**을 **우회**할 수 있습니다. 이 방법의 가장 큰 장점은 SSL Pinning을 우회하기 위해 root가 필요 없다는 점이지만, 애플리케이션을 삭제하고 새로 설치해야 하며 항상 동작하지는 않습니다. +- 아래에서 설명하는 **Frida**를 사용해 이 보호를 우회할 수 있습니다. Burp+Frida+Genymotion을 사용하는 가이드는 다음을 참고하세요: [https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/) +- **자동으로 SSL Pinning을 우회**하려면 [**objection**](frida-tutorial/objection-tutorial.md)**:** 를 사용해 보세요: `objection --gadget com.package.app explore --startup-command "android sslpinning disable"` +- **자동으로 SSL Pinning을 우회**하려면 **MobSF dynamic analysis**(아래 설명 참조)를 시도할 수도 있습니다. +- 여전히 캡처하지 못하는 트래픽이 있다고 생각되면 **iptables를 사용해 트래픽을 Burp로 포워딩**해 보세요. 블로그를 읽어보세요: [https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62) -#### 흔한 웹 취약점 탐색 +#### 일반적인 Web 취약점 찾기 -애플리케이션 내에서 흔한 웹 취약점도 함께 찾아보는 것이 중요합니다. 이러한 취약점을 식별하고 완화하는 상세한 내용은 이 요약의 범위를 벗어나며 다른 자료에서 광범위하게 다루어집니다. +애플리케이션 내에서 흔히 발생하는 Web 취약점도 반드시 검색해야 합니다. 이러한 취약점을 식별하고 완화하는 방법에 대한 자세한 내용은 이 요약의 범위를 벗어나지만 다른 곳에 광범위하게 설명되어 있습니다. ### Frida -[Frida](https://www.frida.re)는 개발자, 리버스 엔지니어, 보안 연구원을 위한 dynamic instrumentation toolkit입니다.\ -**실행 중인 애플리케이션에 접근해 런타임에 메서드를 훅킹하여 동작을 변경하거나 값 변경/추출, 다른 코드 실행 등을 할 수 있습니다.**\ -Android applications을 pentest하려면 Frida 사용법을 알아야 합니다. +[Frida](https://www.frida.re) 는 개발자, 리버스 엔지니어, 보안 연구원을 위한 dynamic instrumentation toolkit입니다.\ +**실행 중인 애플리케이션에 접근해 런타임에 메서드를 hook하여 동작을 변경하거나 값 변경/추출, 다른 코드를 실행할 수 있습니다.**\ +Android 애플리케이션을 pentest하려면 Frida 사용법을 알아야 합니다. - Frida 사용법 배우기: [**Frida tutorial**](frida-tutorial/index.html) - Frida 작업용 일부 "GUI": [**https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security**](https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security) -- Ojection은 Frida 사용 자동화를 위해 유용함: [**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon) -- 유용한 Frida 스크립트 모음: [**https://codeshare.frida.re/**](https://codeshare.frida.re) -- Frida를 로드해 anti-debugging / anti-frida 메커니즘을 우회하는 방법 시도해 보기: [https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace) (도구 [linjector](https://github.com/erfur/linjector-rs) 참조) +- Ojection은 Frida 사용 자동화에 유용합니다: [**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon) +- 몇 가지 Frida 스크립트 모음은 여기에서 찾을 수 있습니다: [**https://codeshare.frida.re/**](https://codeshare.frida.re) +- [https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace)에 설명된 대로 Frida를 로드해 anti-debugging / anti-frida 메커니즘을 우회해 보세요 (도구 [linjector](https://github.com/erfur/linjector-rs)) #### Anti-instrumentation & SSL pinning bypass workflow @@ -516,9 +523,9 @@ android-anti-instrumentation-and-ssl-pinning-bypass.md ### **메모리 덤프 - Fridump** -애플리케이션이 비밀번호나 니모닉(mnemonics) 같은 민감한 정보를 저장해서는 안 되는 메모리에 저장하고 있는지 확인하세요. +애플리케이션이 비밀번호나 니모닉 같은 저장해서는 안 되는 민감한 정보를 메모리에 저장하고 있는지 확인하세요. -[**Fridump3**](https://github.com/rootbsd/fridump3)를 사용하면 다음 명령으로 앱의 메모리를 덤프할 수 있습니다: +[**Fridump3**](https://github.com/rootbsd/fridump3)를 사용하면 앱의 메모리를 다음과 같이 덤프할 수 있습니다: ```bash # With PID python3 fridump3.py -u @@ -527,76 +534,76 @@ python3 fridump3.py -u frida-ps -Uai python3 fridump3.py -u "" ``` -이것은 메모리를 ./dump 폴더에 dump하고, 그 안에서 다음과 같이 grep할 수 있습니다: +이것은 ./dump 폴더에 메모리를 덤프하며, 그 안에서 다음과 같이 grep할 수 있습니다: ```bash strings * | grep -E "^[a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+$" ``` ### **Keystore의 민감한 데이터** -Android에서 Keystore는 민감한 데이터를 저장하기에 최적의 장소이지만, 충분한 권한이 있으면 여전히 **액세스할 수 있습니다**. 애플리케이션은 여기서 **sensitive data in clear text**를 저장하는 경향이 있으므로, pentests는 root 사용자 권한으로 이를 확인해야 하며 기기에 물리적 접근이 가능한 사람은 이 데이터를 탈취할 수 있습니다. +Android에서 Keystore는 민감한 데이터를 저장하기에 가장 좋은 장소입니다. 그러나 충분한 권한이 있으면 여전히 **접근할 수 있습니다**. 애플리케이션은 여기서 **평문으로 민감한 데이터를** 저장하는 경향이 있으므로, pentests는 root user로 검사를 수행해야 하며 장치에 물리적으로 접근할 수 있는 사람이 이 데이터를 훔칠 수 있습니다. -앱이 keystore에 데이터를 저장하더라도, 데이터는 암호화되어야 합니다. +앱이 keystore에 데이터를 저장하더라도, 해당 데이터는 암호화되어야 합니다. -keystore 내부의 데이터에 접근하려면 이 Frida 스크립트를 사용할 수 있습니다: [https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js](https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js) +keystore 내부의 데이터에 접근하려면 다음 Frida script를 사용할 수 있습니다: [https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js](https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js) ```bash frida -U -f com.example.app -l frida-scripts/tracer-cipher.js ``` ### **Fingerprint/Biometrics Bypass** -다음 Frida 스크립트를 사용하면 Android 애플리케이션이 특정 민감 영역을 보호하기 위해 수행하는 **bypass fingerprint authentication**을 우회할 수 있습니다: +다음 Frida 스크립트를 사용하면 Android 애플리케이션이 특정 민감한 영역을 보호하기 위해 수행하는 **bypass fingerprint authentication**을 우회할 수 있습니다: ```bash frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f ``` ### **백그라운드 이미지** -애플리케이션을 백그라운드로 보낼 때, Android는 **애플리케이션의 스냅샷**을 저장합니다. 이렇게 하면 앱이 포그라운드로 복구될 때 앱보다 먼저 이미지를 로드해 앱이 더 빨리 로드된 것처럼 보입니다. +애플리케이션을 백그라운드로 보낼 때, Android는 **애플리케이션의 스냅샷**을 저장합니다. 포그라운드로 복원될 때 앱 자체가 로드되기 전에 이미지를 먼저 불러와 앱이 더 빨리 로드된 것처럼 보이게 합니다. -하지만 이 스냅샷에 **민감한 정보**가 포함되어 있다면, 스냅샷에 접근할 수 있는 사람이 그 정보를 **탈취할 수 있습니다** (접근하려면 root 권한이 필요하다는 점에 유의). +하지만 이 스냅샷에 **민감한 정보**가 포함되어 있다면, 스냅샷에 접근할 수 있는 사람이 해당 정보를 **탈취할 수 있습니다** (접근하려면 root가 필요하다는 점에 유의하세요). -스냅샷은 일반적으로 다음 경로에 저장됩니다: **`/data/system_ce/0/snapshots`** +스냅샷은 보통 다음 경로에 저장됩니다: **`/data/system_ce/0/snapshots`** -Android는 레이아웃 파라미터인 **FLAG_SECURE를 설정하여 스크린샷 캡처를 방지**하는 방법을 제공합니다. 이 플래그를 사용하면 창 내용이 보안 처리되어 스크린샷에 나타나지 않거나 비보안 디스플레이에서 표시되는 것을 방지합니다. +Android는 **FLAG_SECURE 레이아웃 파라미터를 설정하여 스크린샷 캡처를 방지**하는 방법을 제공합니다. 이 플래그를 사용하면 윈도우의 내용이 보안 처리되어 스크린샷에 나타나거나 비보안 디스플레이에서 표시되는 것을 방지합니다. ```bash getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE); ``` ### **Android Application Analyzer** -이 도구는 동적 분석 중 여러 도구를 관리하는 데 도움이 됩니다: [https://github.com/NotSoSecure/android_application_analyzer](https://github.com/NotSoSecure/android_application_analyzer) +이 도구는 dynamic analysis 중 여러 도구를 관리하는 데 도움이 됩니다: [https://github.com/NotSoSecure/android_application_analyzer](https://github.com/NotSoSecure/android_application_analyzer) ### Intent Injection -개발자는 종종 이러한 Intent를 처리하고 `startActivity(...)` 또는 `sendBroadcast(...)` 같은 메서드로 전달하는 proxy 컴포넌트(예: activities, services, broadcast receivers)를 만듭니다. 이는 위험할 수 있습니다. +개발자들은 종종 Intent를 처리하고 `startActivity(...)`나 `sendBroadcast(...)` 같은 메서드로 전달하는 proxy 컴포넌트(액티비티, 서비스, 브로드캐스트 리시버 등)를 만듭니다. 이는 위험할 수 있습니다. -문제는 공격자가 이러한 Intent를 오도하여 non-exported 앱 컴포넌트를 트리거하거나 민감한 content providers에 접근하도록 허용할 수 있다는 점입니다. 예로 `WebView` 컴포넌트가 URL을 `Intent.parseUri(...)`를 통해 `Intent` 객체로 변환한 뒤 실행하면, 악의적인 Intent 주입이 발생할 수 있습니다. +공격자가 이러한 Intent를 잘못 유도하여 non-exported 앱 컴포넌트를 호출하거나 민감한 content providers에 접근할 수 있게 되는 것이 위험의 핵심입니다. 예를 들어 `WebView`가 URL을 `Intent` 객체로 변환하기 위해 `Intent.parseUri(...)`를 사용하고 이를 실행하면, 악의적인 Intent injection이 발생할 수 있습니다. -### 주요 요점 +### Essential Takeaways -- **Intent Injection**은 웹의 Open Redirect 이슈와 유사합니다. -- 취약점은 `Intent` 객체를 extras로 전달하여 리디렉션되어 안전하지 않은 작업을 실행하도록 유도하는 방식으로 악용됩니다. -- 비-exported 컴포넌트 및 content providers가 공격자에게 노출될 수 있습니다. -- WebView의 URL→Intent 변환은 의도치 않은 동작을 유발할 수 있습니다. +- **Intent Injection**은 웹의 Open Redirect 문제와 유사합니다. +- 공격은 `Intent` 객체를 extras로 전달해 리디렉션시켜 안전하지 않은 동작을 실행하게 만드는 방식으로 이뤄집니다. +- non-exported 컴포넌트와 content providers를 공격자에게 노출시킬 수 있습니다. +- `WebView`의 URL → `Intent` 변환은 의도치 않은 동작을 촉발할 수 있습니다. -### Android 클라이언트 측 인젝션 등 +### Android Client Side Injections and others -이러한 취약점은 웹에서 이미 익숙할 것입니다. Android 애플리케이션에서는 특히 주의해야 합니다: +아마 웹에서 이런 종류의 취약점을 접해보셨을 겁니다. Android 애플리케이션에서는 특히 다음 취약점들에 주의해야 합니다: -- **SQL Injection:** 동적 쿼리나 Content-Providers를 다룰 때는 파라미터화된 쿼리를 사용해야 합니다. -- **JavaScript Injection (XSS):** 모든 WebView에서 JavaScript 및 Plugin 지원이 비활성화되어 있는지 확인하세요(기본적으로 비활성화되어 있음). [여기에서 자세히](webview-attacks.md#javascript-enabled). -- **Local File Inclusion:** WebView에서 파일 시스템 접근을 비활성화해야 합니다(기본적으로 활성화되어 있음) - `(webview.getSettings().setAllowFileAccess(false);)`. [여기에서 자세히](webview-attacks.md#javascript-enabled). -- **Eternal cookies**: 일부 경우 Android 애플리케이션이 세션을 종료할 때 쿠키가 폐기되지 않거나 디스크에 저장될 수 있습니다. +- **SQL Injection:** dynamic 쿼리나 Content-Providers를 다룰 때는 parameterized queries를 사용했는지 확인하세요. +- **JavaScript Injection (XSS):** 모든 WebViews에 대해 JavaScript 및 Plugin 지원이 비활성화되어 있는지 확인하세요(기본적으로 비활성). [More info here](webview-attacks.md#javascript-enabled). +- **Local File Inclusion:** WebViews가 파일 시스템에 접근하지 못하도록 해야 합니다(기본적으로 허용됨) - `(webview.getSettings().setAllowFileAccess(false);)`. [More info here](webview-attacks.md#javascript-enabled). +- **Eternal cookies**: 많은 경우 Android 애플리케이션에서 세션을 종료해도 쿠키가 취소되지 않거나 디스크에 저장될 수 있습니다. - [**Secure Flag** in cookies](../../pentesting-web/hacking-with-cookies/index.html#cookies-flags) --- -## 자동 분석 +## Automatic Analysis ### [MobSF](https://github.com/MobSF/Mobile-Security-Framework-MobSF) -**정적 분석** +**Static analysis** ![](<../../images/image (866).png>) -**애플리케이션의 취약점 평가**를 깔끔한 웹 기반 프런트엔드를 통해 제공합니다. 동적 분석도 수행할 수 있으나(환경을 준비해야 함) +**Vulnerability assessment of the application**을 웹 기반 프런트엔드로 보기 좋게 수행합니다. dynamic analysis도 수행할 수 있으나 환경을 미리 준비해야 합니다. ```bash docker pull opensecurity/mobile-security-framework-mobsf docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest @@ -606,41 +613,41 @@ Also, if you create a **ZIP** file with the source code if an **Android** or an MobSF also allows you to **diff/Compare** analysis and to integrate **VirusTotal** (you will need to set your API key in _MobSF/settings.py_ and enable it: `VT_ENABLED = TRUE` `VT_API_KEY = ` `VT_UPLOAD = TRUE`). You can also set `VT_UPLOAD` to `False`, then the **hash** will be **upload** instead of the file. -### MobSF를 이용한 Assisted Dynamic analysis +### MobSF를 이용한 보조 동적 분석 -**MobSF**는 **Android**에서의 **dynamic analysis**에도 매우 유용하지만, 그 경우 호스트에 MobSF와 **genymotion**을 설치해야 합니다(가상 머신이나 Docker는 작동하지 않습니다). _참고: 먼저 genymotion에서 **VM을 시작한 후** **MobSF를 시작**해야 합니다._\ -The **MobSF dynamic analyser** can: +**MobSF**는 Android의 **dynamic analysis**에 매우 유용할 수 있지만, 이 경우 호스트에 MobSF와 **genymotion**을 설치해야 합니다 (VM이나 Docker에서는 동작하지 않습니다). _참고: 먼저 genymotion에서 **VM을 시작**한 다음 **MobSF를 시작**해야 합니다._\ +**MobSF dynamic analyser**는 다음을 수행할 수 있습니다: -- **Dump application data** (URLs, logs, clipboard, screenshots made by you, screenshots made by "**Exported Activity Tester**", emails, SQLite databases, XML files, and other created files). 이 모든 것은 스크린샷을 제외하고 자동으로 수행됩니다. 스크린샷은 원할 때 버튼을 눌러야 하며, 모든 exported activities의 스크린샷을 얻으려면 "**Exported Activity Tester**"를 눌러야 합니다. +- **Dump application data** (URLs, 로그, 클립보드, 사용자가 찍은 스크린샷, "**Exported Activity Tester**"가 찍은 스크린샷, 이메일, SQLite 데이터베이스, XML 파일 및 기타 생성된 파일). 이들 중 스크린샷을 제외한 모든 항목은 자동으로 수집됩니다. 스크린샷은 직접 촬영할 때만 저장되며, 모든 exported activities의 스크린샷을 얻으려면 "**Exported Activity Tester**"를 눌러야 합니다. - Capture **HTTPS traffic** - Use **Frida** to obtain **runtime** **information** -From android **versions > 5**, it will **automatically start Frida** and will set global **proxy** settings to **capture** traffic. It will only capture traffic from the tested application. +android **versions > 5**부터는 **Frida를 자동으로 시작**하고 전체 **proxy** 설정을 하여 트래픽을 **capture**합니다. 테스트 대상 애플리케이션의 트래픽만 캡처합니다. **Frida** -By default, it will also use some Frida Scripts to **bypass SSL pinning**, **root detection** and **debugger detection** and to **monitor interesting APIs**.\ -MobSF can also **invoke exported activities**, grab **screenshots** of them and **save** them for the report. +기본적으로 몇몇 Frida Scripts를 사용하여 **SSL pinning**, **root detection**, **debugger detection**을 우회하고 흥미로운 API를 **monitor**합니다.\ +MobSF는 **invoke exported activities**를 실행하고 해당 활동들의 **screenshots**를 캡처하여 보고서에 **save**할 수도 있습니다. -To **start** the dynamic testing press the green bottom: "**Start Instrumentation**". Press the "**Frida Live Logs**" to see the logs generated by the Frida scripts and "**Live API Monitor**" to see all the invocation to hooked methods, arguments passed and returned values (this will appear after pressing "Start Instrumentation").\ -MobSF also allows you to load your own **Frida scripts** (to send the results of your Frida scripts to MobSF use the function `send()`). It also has **several pre-written scripts** you can load (you can add more in `MobSF/DynamicAnalyzer/tools/frida_scripts/others/`), just **select them**, press "**Load**" and press "**Start Instrumentation**" (you will be able to see the logs of that scripts inside "**Frida Live Logs**"). +동적 테스트를 **start**하려면 초록색 버튼인: "**Start Instrumentation**"을 누르세요. Frida 스크립트가 생성한 로그를 보려면 "**Frida Live Logs**"를 누르고, 훅된 메서드의 호출, 전달된 인수 및 반환 값을 보려면 "**Live API Monitor**"를 누르세요(이는 "Start Instrumentation"을 누른 후 표시됩니다).\ +MobSF는 또한 사용자 정의 **Frida scripts**를 로드할 수 있습니다 (Frida scripts의 결과를 MobSF로 전송하려면 `send()` 함수를 사용하세요). 여러 **사전 작성된 스크립트**도 로드할 수 있으며 (`MobSF/DynamicAnalyzer/tools/frida_scripts/others/`에 추가 가능), 스크립트를 **선택**한 뒤 "**Load**"를 누르고 "**Start Instrumentation**"을 누르면 해당 스크립트의 로그를 "**Frida Live Logs**"에서 확인할 수 있습니다. ![](<../../images/image (419).png>) -Moreover, you have some Auxiliary Frida functionalities: +또한 몇 가지 보조 Frida 기능이 있습니다: -- **Enumerate Loaded Classes**: 모든 로드된 클래스를 출력합니다 -- **Capture Strings**: 애플리케이션 사용 중 모든 캡처된 문자열을 출력합니다 (super noisy) -- **Capture String Comparisons**: 매우 유용할 수 있습니다. 비교되는 두 문자열과 결과가 True인지 False인지 표시합니다. +- **Enumerate Loaded Classes**: 로드된 모든 클래스를 출력합니다. +- **Capture Strings**: 애플리케이션 사용 중 캡처되는 모든 문자열을 출력합니다 (매우 많은 출력). +- **Capture String Comparisons**: 매우 유용할 수 있습니다. 비교되는 두 문자열을 보여주고 결과가 True인지 False인지 표시합니다. - **Enumerate Class Methods**: 클래스 이름(예: "java.io.File")을 입력하면 해당 클래스의 모든 메서드를 출력합니다. -- **Search Class Pattern**: 패턴으로 클래스를 검색합니다 -- **Trace Class Methods**: 전체 클래스를 **Trace**합니다 (클래스의 모든 메서드의 입력과 출력 확인). 기본적으로 MobSF는 여러 흥미로운 Android Api 메서드를 trace합니다. +- **Search Class Pattern**: 패턴으로 클래스를 검색합니다. +- **Trace Class Methods**: 클래스 전체를 **Trace**합니다 (해당 클래스의 모든 메서드 입력과 출력 확인). 기본적으로 MobSF는 여러 흥미로운 Android Api 메서드를 trace합니다. -Once you have selected the auxiliary module you want to use you need to press "**Start Intrumentation**" and you will see all the outputs in "**Frida Live Logs**". +원하는 보조 모듈을 선택한 후 "**Start Intrumentation**"을 눌러야 하며 모든 출력은 "**Frida Live Logs**"에서 확인할 수 있습니다. **Shell** -Mobsf also brings you a shell with some **adb** commands, **MobSF commands**, and common **shell** **commands** at the bottom of the dynamic analysis page. Some interesting commands: +MobSF는 동적 분석 페이지 하단에 몇 가지 **adb** 명령, **MobSF commands**, 그리고 일반적인 **shell** **commands**를 포함한 셸을 제공합니다. 일부 흥미로운 명령: ```bash help shell ls @@ -651,13 +658,13 @@ receivers ``` **HTTP 도구** -When http traffic is capture you can see an ugly view of the captured traffic on "**HTTP(S) Traffic**" bottom or a nicer view in "**Start HTTPTools**" green bottom. From the second option, you can **send** the **captured requests** to **proxies** like Burp or Owasp ZAP.\ -To do so, _power on Burp -->_ _turn off Intercept --> in MobSB HTTPTools select the request_ --> press "**Send to Fuzzer**" --> _select the proxy address_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080)). +HTTP 트래픽을 캡처하면 "**HTTP(S) Traffic**" 버튼 하단에서 캡처된 트래픽의 거친 뷰를 보거나 "**Start HTTPTools**" 녹색 버튼에서 더 보기 좋은 뷰를 볼 수 있습니다. 두 번째 옵션에서는 캡처된 요청을 Burp나 Owasp ZAP 같은 proxies로 **보낼** 수 있습니다.\ +이를 위해, _Burp를 켜고 -->_ _Intercept를 끈 다음 --> MobSB HTTPTools에서 요청을 선택_ --> "**Send to Fuzzer**"를 누르고 --> _프록시 주소를 선택_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080)). -Once you finish the dynamic analysis with MobSF you can press on "**Start Web API Fuzzer**" to **fuzz http requests** an look for vulnerabilities. +MobSF로 동적 분석을 마치면 "**Start Web API Fuzzer**"를 눌러 http 요청을 **fuzz**하여 취약점을 찾아볼 수 있습니다. > [!TIP] -> After performing a dynamic analysis with MobSF the proxy settings me be misconfigured and you won't be able to fix them from the GUI. You can fix the proxy settings by doing: +> MobSF로 동적 분석을 수행한 후 프록시 설정이 잘못 구성되어 GUI에서 수정할 수 없게 될 수 있습니다. 프록시 설정은 다음 명령으로 수정할 수 있습니다: > > ``` > adb shell settings put global http_proxy :0 @@ -665,18 +672,18 @@ Once you finish the dynamic analysis with MobSF you can press on "**Start Web AP ### Assisted Dynamic Analysis with Inspeckage -You can get the tool from [**Inspeckage**](https://github.com/ac-pm/Inspeckage).\ -이 도구는 일부 **Hooks**를 사용하여 **dynamic analysis**를 수행하는 동안 애플리케이션에서 무슨 일이 일어나고 있는지 알려줍니다. +도구는 [**Inspeckage**](https://github.com/ac-pm/Inspeckage)에서 얻을 수 있습니다.\ +이 도구는 몇몇 **Hooks**를 사용하여 동적 분석을 수행하는 동안 애플리케이션에서 **무슨 일이 일어나는지** 알려줍니다. ### [Yaazhini](https://www.vegabird.com/yaazhini/) -This is a **great tool to perform static analysis with a GUI** +GUI로 정적 분석을 수행하기에 **훌륭한 도구**입니다 ![](<../../images/image (741).png>) ### [Qark](https://github.com/linkedin/qark) -This tool is designed to look for several **security related Android application vulnerabilities**, either in **source code** or **packaged APKs**. The tool is also **capable of creating a "Proof-of-Concept" deployable APK** and **ADB commands**, to exploit some of the found vulnerabilities (Exposed activities, intents, tapjacking...). As with Drozer, there is no need to root the test device. +이 도구는 소스 코드나 패키지된 APK에서 여러 **보안 관련 Android 애플리케이션 취약점**을 찾도록 설계되었습니다. 또한 이 도구는 발견된 일부 취약점(Exposed activities, intents, tapjacking...)을 악용하기 위한 "Proof-of-Concept" 배포 가능한 APK와 **ADB commands**를 생성할 수 있습니다. Drozer와 마찬가지로 테스트 디바이스를 루팅할 필요가 없습니다. ```bash pip3 install --user qark # --user is only needed if not using a virtualenv qark --apk path/to/my.apk @@ -685,20 +692,20 @@ qark --java path/to/specific/java/file.java ``` ### [**ReverseAPK**](https://github.com/1N3/ReverseAPK.git) -- 참고하기 쉽도록 추출된 모든 파일을 표시 +- 참조하기 쉽도록 추출된 모든 파일을 표시 - APK 파일을 자동으로 Java 및 Smali 형식으로 디컴파일 -- AndroidManifest.xml을 분석하여 일반적인 취약점 및 동작을 확인 -- 정적 소스 코드 분석을 통해 일반적인 취약점 및 동작을 확인 -- 장치 정보 -- 그리고 더 많은 기능 +- AndroidManifest.xml을 분석하여 일반적인 취약점과 동작 식별 +- 정적 소스 코드 분석을 통해 일반적인 취약점과 동작 검사 +- 기기 정보 +- 그 외 다양한 기능 ```bash reverse-apk relative/path/to/APP.apk ``` ### [SUPER Android Analyzer](https://github.com/SUPERAndroidAnalyzer/super) -SUPER는 Windows, MacOS X and Linux에서 사용할 수 있는 명령줄 애플리케이션으로, _.apk_ 파일을 취약점을 찾기 위해 분석합니다. 이는 APKs를 압축 해제하고 일련의 규칙을 적용하여 취약점을 탐지하는 방식으로 동작합니다. +SUPER는 Windows, MacOS X 및 Linux에서 사용할 수 있는 명령줄 애플리케이션으로, 취약점을 찾기 위해 _.apk_ 파일을 분석합니다. 이 프로그램은 APKs를 압축 해제하고 일련의 규칙을 적용하여 이러한 취약점을 탐지합니다. -모든 규칙은 `rules.json` 파일에 중심화되어 있으며, 각 회사나 테스터는 필요한 분석을 위해 자체 규칙을 생성할 수 있습니다. +All rules are centered in a `rules.json` file, and each company or tester could create its own rules to analyze what they need. 최신 바이너리는 [download page](https://superanalyzer.rocks/download.html)에서 다운로드하세요. ``` @@ -708,9 +715,9 @@ super-analyzer {apk_file} ![](<../../images/image (297).png>) -StaCoAn은 모바일 애플리케이션에서 [static code analysis](https://en.wikipedia.org/wiki/Static_program_analysis)를 수행하는 개발자, bugbounty hunters 및 ethical hackers를 돕는 **crossplatform** 도구입니다. +StaCoAn은 모바일 애플리케이션에서 [static code analysis](https://en.wikipedia.org/wiki/Static_program_analysis)를 수행하는 developers, bugbounty hunters and ethical hackers를 돕는 **crossplatform** 도구입니다. -작동 방식은 모바일 애플리케이션 파일(.apk 또는 .ipa 파일)을 StaCoAn 애플리케이션에 드래그 앤 드롭하면 시각적이고 휴대 가능한 리포트를 생성해 준다는 것입니다. 설정과 wordlists를 조정하여 맞춤형 경험을 얻을 수 있습니다. +개념은 모바일 애플리케이션 파일(.apk 또는 .ipa 파일)을 StaCoAn 애플리케이션에 드래그 앤 드롭하면 시각적이고 포터블한 보고서를 생성해 준다는 것입니다. 설정과 워드리스트를 조정하여 맞춤형 경험을 얻을 수 있습니다. 다운로드[ latest release](https://github.com/vincentcox/StaCoAn/releases): ``` @@ -718,7 +725,7 @@ StaCoAn은 모바일 애플리케이션에서 [static code analysis](https://en. ``` ### [AndroBugs](https://github.com/AndroBugs/AndroBugs_Framework) -AndroBugs Framework는 개발자 또는 hackers가 Android 애플리케이션의 잠재적인 보안 취약점을 찾아내는 데 도움을 주는 Android 취약점 분석 시스템입니다.\ +AndroBugs Framework는 개발자나 hackers가 Android 애플리케이션에서 잠재적인 보안 취약점을 찾도록 돕는 Android 취약점 분석 시스템입니다.\ [Windows releases](https://github.com/AndroBugs/AndroBugs_Framework/releases) ``` python androbugs.py -f [APK file] @@ -726,11 +733,11 @@ androbugs.exe -f [APK file] ``` ### [Androwarn](https://github.com/maaaaz/androwarn) -**Androwarn**은 Android 애플리케이션이 생성할 수 있는 잠재적 악성 동작을 탐지하고 사용자에게 경고하는 것을 주목적으로 하는 도구입니다. +**Androwarn**는 Android 애플리케이션이 개발한 잠재적 악성 동작을 탐지하고 사용자에게 경고하는 것을 주요 목적으로 하는 도구입니다. -감지는 [`androguard`](https://github.com/androguard/androguard) 라이브러리를 사용해 애플리케이션의 Dalvik bytecode로 표현된 **Smali**에 대해 **static analysis**를 수행함으로써 이루어집니다. +탐지는 애플리케이션의 Dalvik 바이트코드를 **Smali**로 표현한 것을 [`androguard`](https://github.com/androguard/androguard) 라이브러리를 사용한 **static analysis**로 수행됩니다. -이 도구는 다음과 같은 **'나쁜' 애플리케이션의 일반적인 동작**을 찾아냅니다: Telephony identifiers exfiltration, Audio/video flow interception, PIM data modification, Arbitrary code execution... +이 도구는 **"bad" 애플리케이션의 일반적인 동작**을 탐지하며, 예로 Telephony identifiers exfiltration, Audio/video flow interception, PIM data modification, Arbitrary code execution 등이 있습니다... ``` python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3 ``` @@ -738,82 +745,83 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3 ![](<../../images/image (595).png>) -**MARA**는 모바일 애플리케이션 역공학 및 분석 프레임워크입니다. 이 도구는 모바일 애플리케이션 역공학 및 분석에 자주 사용되는 도구들을 모아 OWASP 모바일 보안 위협에 대한 테스트를 지원합니다. 목적은 모바일 애플리케이션 개발자와 보안 전문가들이 이 작업을 더 쉽고 친화적으로 수행할 수 있게 하는 것입니다. +**MARA**는 **M**obile **A**pplication **R**everse engineering and **A**nalysis Framework입니다. 이 도구는 일반적으로 사용되는 모바일 애플리케이션 reverse engineering 및 analysis 도구들을 모아 OWASP 모바일 보안 위협에 대해 모바일 애플리케이션을 테스트하는 것을 돕습니다. 목적은 모바일 애플리케이션 개발자와 보안 전문가들이 이 작업을 더 쉽고 친근하게 수행할 수 있도록 하는 것입니다. -다음 작업을 수행할 수 있습니다: +다음 기능을 제공합니다: -- 다양한 도구를 사용해 Java 및 Smali 코드를 추출 -- APK를 분석: [smalisca](https://github.com/dorneanu/smalisca), [ClassyShark](https://github.com/google/android-classyshark), [androbugs](https://github.com/AndroBugs/AndroBugs_Framework), [androwarn](https://github.com/maaaaz/androwarn), [APKiD](https://github.com/rednaga/APKiD) -- regexps를 사용하여 APK에서 민감한 정보 추출 -- Manifest 분석 -- 발견된 도메인 분석: [pyssltest](https://github.com/moheshmohan/pyssltest), [testssl](https://github.com/drwetter/testssl.sh) 및 [whatweb](https://github.com/urbanadventurer/WhatWeb) -- [apk-deguard.com]을 통해 APK 난독화 해제 +- 다양한 도구를 사용하여 Java 및 Smali 코드를 추출합니다 +- 다음을 사용하여 APK를 분석합니다: [smalisca](https://github.com/dorneanu/smalisca), [ClassyShark](https://github.com/google/android-classyshark), [androbugs](https://github.com/AndroBugs/AndroBugs_Framework), [androwarn](https://github.com/maaaaz/androwarn), [APKiD](https://github.com/rednaga/APKiD) +- regexps를 사용하여 APK에서 private 정보를 추출합니다. +- Manifest를 분석합니다. +- 발견된 도메인을 다음으로 분석합니다: [pyssltest](https://github.com/moheshmohan/pyssltest), [testssl](https://github.com/drwetter/testssl.sh) 및 [whatweb](https://github.com/urbanadventurer/WhatWeb) +- [apk-deguard.com]을 통해 APK의 deobfuscation을 수행합니다 ### Koodous -악성코드 탐지에 유용: [https://koodous.com/](https://koodous.com/) +malware 탐지에 유용: [https://koodous.com/](https://koodous.com/) -## 코드 난독화/난독화 해제 +## Obfuscating/Deobfuscating code -사용하는 서비스와 구성에 따라, Secrets(민감정보)는 난독화되거나 그렇지 않을 수 있습니다. +사용하는 서비스와 구성에 따라 코드를 obfuscate할 때 비밀(Secrets)이 obfuscated된 상태로 남을 수도 있고 아닐 수도 있다는 점을 유의하세요. ### [ProGuard]() -위키피디아에 따르면([Wikipedia]()): **ProGuard**는 Java 코드를 축소(shrink), 최적화(optimize) 및 난독화(obfuscate)하는 오픈 소스 커맨드라인 도구입니다. 바이트코드(bytecode)를 최적화하고 사용되지 않는 명령어를 탐지 및 제거할 수 있습니다. ProGuard는 자유 소프트웨어이며 GNU GPL v2로 배포됩니다. +From [Wikipedia](): **ProGuard**는 Java 코드를 축소(shrink), 최적화(optimize)하고 obfuscate하는 오픈 소스 명령줄 도구입니다. 바이트코드를 최적화하고 사용되지 않는 명령을 탐지 및 제거할 수 있습니다. ProGuard는 자유 소프트웨어이며 GNU General Public License, version 2 하에 배포됩니다. -ProGuard는 Android SDK의 일부로 배포되며 release 모드로 애플리케이션을 빌드할 때 실행됩니다. +ProGuard는 Android SDK의 일부로 배포되며, 애플리케이션을 release 모드로 빌드할 때 실행됩니다. ### [DexGuard](https://www.guardsquare.com/dexguard) -APK 난독화 해제에 대한 단계별 가이드는 [https://blog.lexfo.fr/dexguard.html](https://blog.lexfo.fr/dexguard.html)에서 찾을 수 있습니다. +APK의 deobfuscate에 대한 단계별 가이드는 [https://blog.lexfo.fr/dexguard.html](https://blog.lexfo.fr/dexguard.html)에서 확인할 수 있습니다. -(해당 가이드에 따르면) 마지막으로 확인했을 때 Dexguard의 동작 방식은 다음과 같았습니다: +(해당 가이드에 따르면) 마지막으로 확인했을 때, Dexguard의 동작 방식은 다음과 같았습니다: -- 리소스를 InputStream으로 로드; -- 결과를 FilterInputStream을 상속한 클래스에 전달하여 복호화; -- 리버서의 시간을 낭비하기 위한 쓸모없는 난독화 수행; -- 복호화된 결과를 ZipInputStream에 전달하여 DEX 파일 획득; -- 마지막으로 결과 DEX를 `loadDex` 메서드를 사용해 Resource로 로드. +- 리소스를 InputStream으로 로드합니다; +- 결과를 FilterInputStream을 상속한 클래스에 전달하여 이를 decrypt합니다; +- 리버서의 시간을 낭비하기 위해 몇 분 정도 소모되는 쓸모없는 obfuscation을 수행합니다; +- 복호화된 결과를 ZipInputStream에 전달하여 DEX 파일을 얻습니다; +- 마지막으로 `loadDex` 메서드를 사용하여 결과 DEX를 Resource로 로드합니다. ### [DeGuard](http://apk-deguard.com) -**DeGuard는 Android 난독화 도구가 수행한 난독화 과정을 되돌립니다. 이를 통해 코드 검사 및 라이브러리 예측을 포함한 다양한 보안 분석이 가능해집니다.** +**DeGuard는 Android obfuscation 도구가 수행한 obfuscation 과정을 역으로 수행합니다. 이를 통해 코드 검사 및 라이브러리 예측을 포함한 다양한 보안 분석이 가능해집니다.** -난독화된 APK를 해당 플랫폼에 업로드할 수 있습니다. +obfuscated APK를 해당 플랫폼에 업로드할 수 있습니다. ### [Deobfuscate android App]https://github.com/In3tinct/deobfuscate-android-app -이는 android 앱의 잠재적 보안 취약점을 찾고 android 앱 코드를 deobfuscate하는 LLM 도구입니다. Google의 Gemini public API를 사용합니다. +This is a LLM tool to find any potential security vulnerabilities in android apps and deobfuscate android app code. Uses Google's Gemini public API. ### [Simplify](https://github.com/CalebFenton/simplify) -이는 일반적인 android deobfuscator입니다. Simplify는 앱을 가상으로 실행(virtually executes)하여 동작을 이해한 다음, 동일하게 동작하지만 사람이 이해하기 쉬운 코드로 최적화하려고 시도합니다. 각 최적화 유형은 단순하고 일반적이어서 특정 난독화 기법이 무엇인지와 무관합니다. +이는 generic android deobfuscator입니다. Simplify는 앱을 virtually executes하여 동작을 이해한 다음, 사람이 이해하기 쉽게 동작은 동일하게 유지하면서 코드를 최적화하려고 시도합니다. 각 최적화 유형은 단순하고 일반적이므로 어떤 특정한 obfuscation 유형이 사용되었는지는 중요하지 않습니다. ### [APKiD](https://github.com/rednaga/APKiD) -APKiD는 APK가 **어떻게 만들어졌는지**에 대한 정보를 제공합니다. 여러 **compilers**, **packers**, **obfuscators** 및 기타 이상한 것들을 식별합니다. Android용 [_PEiD_]입니다. +APKiD는 APK가 어떻게 만들어졌는지에 대한 정보를 제공합니다. 많은 compilers, packers, obfuscators 및 기타 이상한 요소들을 식별합니다. Android용 [_PEiD_](https://www.aldeid.com/wiki/PEiD)와 같습니다. ### Manual -[이 튜토리얼을 읽어 커스텀 난독화 역분석 방법에 대한 몇 가지 팁을 배우세요](manual-deobfuscation.md) +[Read this tutorial to learn some tricks on **how to reverse custom obfuscation**](manual-deobfuscation.md) ## Labs ### [Androl4b](https://github.com/sh4hin/Androl4b) -AndroL4b는 ubuntu-mate 기반의 Android 보안 가상 머신으로, reverse engineering 및 malware analysis를 위한 최신 프레임워크, 튜토리얼 및 실습(labs) 모음이 포함되어 있습니다. +AndroL4b는 ubuntu-mate 기반의 Android 보안 가상 머신으로, 최신 프레임워크, 튜토리얼 및 reverse engineering과 malware analysis를 위한 다양한 연구자 및 보안 애호가들의 실습 자료를 포함합니다. ## References - [https://owasp.org/www-project-mobile-app-security/](https://owasp.org/www-project-mobile-app-security/) -- [https://appsecwiki.com/#/](https://appsecwiki.com/#/) 훌륭한 리소스 목록 -- [https://maddiestone.github.io/AndroidAppRE/](https://maddiestone.github.io/AndroidAppRE/) Android 빠른 코스 +- [https://appsecwiki.com/#/](https://appsecwiki.com/#/) 훌륭한 자료 목록입니다 +- [https://maddiestone.github.io/AndroidAppRE/](https://maddiestone.github.io/AndroidAppRE/) Android 빠른 강좌 - [https://manifestsecurity.com/android-application-security/](https://manifestsecurity.com/android-application-security/) - [https://github.com/Ralireza/Android-Security-Teryaagh](https://github.com/Ralireza/Android-Security-Teryaagh) - [https://www.youtube.com/watch?v=PMKnPaGWxtg\&feature=youtu.be\&ab_channel=B3nacSec](https://www.youtube.com/watch?v=PMKnPaGWxtg&feature=youtu.be&ab_channel=B3nacSec) - [SSLPinDetect: Advanced SSL Pinning Detection for Android Security Analysis](https://petruknisme.medium.com/sslpindetect-advanced-ssl-pinning-detection-for-android-security-analysis-1390e9eca097) - [SSLPinDetect GitHub](https://github.com/aancw/SSLPinDetect) - [smali-sslpin-patterns](https://github.com/aancw/smali-sslpin-patterns) +- [Build a Repeatable Android Bug Bounty Lab: Emulator vs Magisk, Burp, Frida, and Medusa](https://www.yeswehack.com/learn-bug-bounty/android-lab-mobile-hacking-tools) ## Yet to try diff --git a/src/mobile-pentesting/android-app-pentesting/android-anti-instrumentation-and-ssl-pinning-bypass.md b/src/mobile-pentesting/android-app-pentesting/android-anti-instrumentation-and-ssl-pinning-bypass.md index 2e639e0b9..93929db75 100644 --- a/src/mobile-pentesting/android-app-pentesting/android-anti-instrumentation-and-ssl-pinning-bypass.md +++ b/src/mobile-pentesting/android-app-pentesting/android-anti-instrumentation-and-ssl-pinning-bypass.md @@ -2,9 +2,9 @@ {{#include ../../banners/hacktricks-training.md}} -이 페이지는 instrumentation을 탐지/차단하거나 TLS pinning을 적용하는 Android 앱에 대해 dynamic analysis를 다시 수행할 수 있도록 실용적인 워크플로우를 제공합니다. 빠른 분류, 흔한 탐지 기법, 그리고 가능하면 repacking 없이 우회할 수 있는 복사·붙여넣기 가능한 hooks/전술에 중점을 둡니다. +이 페이지는 instrumentation을 탐지하거나 루트 차단을 수행하거나 TLS pinning을 강제하는 Android 앱에 대해 dynamic analysis를 복원하기 위한 실용적인 워크플로를 제공합니다. 가능한 경우 재패키징 없이 우회할 수 있는 빠른 분류, 일반적인 탐지 항목, 복사-붙여넣기 가능한 hooks/tactics에 중점을 둡니다. -## Detection Surface (what apps check) +## Detection Surface (앱이 확인하는 항목) - Root checks: su binary, Magisk paths, getprop values, common root packages - Frida/debugger checks (Java): Debug.isDebuggerConnected(), ActivityManager.getRunningAppProcesses(), getRunningServices(), scanning /proc, classpath, loaded libs @@ -18,14 +18,14 @@ - Enable DenyList, add the target package - Reboot and retest -많은 앱은 su/Magisk 경로/getprop 같은 명확한 지표만 확인합니다. DenyList는 종종 이런 단순한 검사들을 무력화합니다. +많은 앱은 su/Magisk 경로/getprop 같은 명백한 지표만 확인합니다. DenyList는 종종 단순한 검사들을 무력화합니다. References: - Magisk (Zygisk & DenyList): https://github.com/topjohnwu/Magisk ## Step 2 — 30‑second Frida Codeshare tests -딥다이브 전에 흔히 쓰이는 drop‑in 스크립트를 먼저 시도해 보세요: +심층 분석에 들어가기 전에 자주 쓰이는 drop‑in 스크립트를 먼저 시도해보세요: - anti-root-bypass.js - anti-frida-detection.js @@ -35,33 +35,50 @@ Example: ```bash frida -U -f com.example.app -l anti-frida-detection.js ``` -이들은 일반적으로 Java의 root/debug checks, process/service scans, 그리고 native ptrace()를 스텁 처리합니다. 경미하게 보호된 앱에서 유용하지만, 강화된 대상은 맞춤형 훅이 필요할 수 있습니다. +이들은 일반적으로 Java의 root/debug checks, process/service scans, 그리고 네이티브 ptrace()를 스텁합니다. 보호가 약한 앱에서는 유용하지만, 강화된 대상은 맞춤형 hooks가 필요할 수 있습니다. - Codeshare: https://codeshare.frida.re/ -## Step 3 — init-time detectors를 늦게 attach하여 우회하기 +## Medusa로 자동화하기 (Frida framework) -많은 탐지들은 process spawn/onCreate() 동안에만 동작합니다. Spawn‑time injection (-f)이나 gadgets는 차단되므로, UI가 로드된 이후에 attach하면 우회할 수 있습니다. +Medusa는 SSL unpinning, root/emulator detection bypass, HTTP comms logging, crypto key interception 등 90개 이상의 기성 모듈을 제공합니다. +```bash +git clone https://github.com/Ch0pin/medusa +cd medusa +pip install -r requirements.txt +python medusa.py + +# Example interactive workflow +show categories +use http_communications/multiple_unpinner +use root_detection/universal_root_detection_bypass +run com.target.app +``` +팁: Medusa는 커스텀 hooks를 작성하기 전에 빠른 성과를 얻기에 좋습니다. 모듈을 선별해서 자신의 scripts와 결합할 수도 있습니다. + +## Step 3 — init-time 탐지기를 늦게 attach하여 우회하기 + +많은 탐지는 process spawn/onCreate() 동안에만 실행됩니다. Spawn‑time injection (-f)이나 gadgets는 잡히기 쉽고, UI가 로드된 이후에 attach하면 우회할 수 있습니다. ```bash # Launch the app normally (launcher/adb), wait for UI, then attach frida -U -n com.example.app # Or with Objection to attach to running process aobjection --gadget com.example.app explore # if using gadget ``` -이 방법이 작동하면 세션을 안정적으로 유지한 뒤 map 및 stub checks로 진행하세요. +이 방법이 작동하면 세션을 안정적으로 유지하고 매핑 및 스텁 검사로 진행하세요. -## Step 4 — Jadx와 string hunting을 통해 탐지 로직 매핑 +## 단계 4 — Jadx 및 문자열 검색을 통한 탐지 로직 매핑 -Static triage keywords in Jadx: +Jadx에서의 정적 트리아지 키워드: - "frida", "gum", "root", "magisk", "ptrace", "su", "getprop", "debugger" -Typical Java patterns: +일반적인 Java 패턴: ```java public boolean isFridaDetected() { return getRunningServices().contains("frida"); } ``` -검토/hook할 공통 API: +검토/hook할 일반 API: - android.os.Debug.isDebuggerConnected - android.app.ActivityManager.getRunningAppProcesses / getRunningServices - java.lang.System.loadLibrary / System.load (native bridge) @@ -70,7 +87,7 @@ return getRunningServices().contains("frida"); ## 5단계 — Runtime stubbing with Frida (Java) -repacking 없이 안전한 값을 반환하도록 커스텀 가드를 오버라이드: +커스텀 가드를 오버라이드하여 리패킹 없이 안전한 값을 반환하도록: ```js Java.perform(() => { const Checks = Java.use('com.example.security.Checks'); @@ -85,7 +102,7 @@ const AM = Java.use('android.app.ActivityManager'); AM.getRunningAppProcesses.implementation = function () { return java.util.Collections.emptyList(); }; }); ``` -초기 크래시를 분류하고 있나요? 앱이 죽기 직전에 classes를 덤프해서 탐지 가능성이 높은 네임스페이스를 찾아보세요: +초기 crashes를 분류하고 있나요? 종료되기 직전에 Dump classes를 해서 잠재적 detection namespaces를 찾아보세요: ```js Java.perform(() => { Java.enumerateLoadedClasses({ @@ -94,6 +111,14 @@ onComplete: () => console.log('Done') }); }); ``` +// Quick root detection stub example (adapt to target package/class names) +Java.perform(() => { +try { +const RootChecker = Java.use('com.target.security.RootCheck'); +RootChecker.isDeviceRooted.implementation = function () { return false; }; +} catch (e) {} +}); + 실행 흐름을 확인하기 위해 의심스러운 메서드를 로깅하고 무력화하세요: ```js Java.perform(() => { @@ -104,24 +129,65 @@ return false; }; }); ``` -## Step 6 — Java hooks가 실패할 때 JNI/native 경로를 따라가세요 +## 에뮬레이터/VM 탐지 우회 (Java stubs) -JNI entry points를 추적하여 native loaders와 detection init을 찾아보세요: +일반적인 휴리스틱: +Build.FINGERPRINT/MODEL/MANUFACTURER/HARDWARE에 generic/goldfish/ranchu/sdk 포함; QEMU 아티팩트 예: /dev/qemu_pipe, /dev/socket/qemud; 기본 MAC 02:00:00:00:00:00; 10.0.2.x NAT; telephony/sensors 없음. + +Build 필드를 빠르게 spoof: +```js +Java.perform(function(){ +var Build = Java.use('android.os.Build'); +Build.MODEL.value = 'Pixel 7 Pro'; +Build.MANUFACTURER.value = 'Google'; +Build.BRAND.value = 'google'; +Build.FINGERPRINT.value = 'google/panther/panther:14/UP1A.231105.003/1234567:user/release-keys'; +}); +``` +파일 존재 체크 및 식별자 (TelephonyManager.getDeviceId/SubscriberId, WifiInfo.getMacAddress, SensorManager.getSensorList)에 대한 스텁을 추가해 현실적인 값을 반환하도록 보완하세요. + +## SSL pinning bypass quick hook (Java) + +커스텀 TrustManagers를 무력화하고 permissive SSL contexts를 강제합니다: +```js +Java.perform(function(){ +var X509TrustManager = Java.use('javax.net.ssl.X509TrustManager'); +var SSLContext = Java.use('javax.net.ssl.SSLContext'); + +// No-op validations +X509TrustManager.checkClientTrusted.implementation = function(){ }; +X509TrustManager.checkServerTrusted.implementation = function(){ }; + +// Force permissive TrustManagers +var TrustManagers = [ X509TrustManager.$new() ]; +var SSLContextInit = SSLContext.init.overload('[Ljavax.net.ssl.KeyManager;','[Ljavax.net.ssl.TrustManager;','java.security.SecureRandom'); +SSLContextInit.implementation = function(km, tm, sr){ +return SSLContextInit.call(this, km, TrustManagers, sr); +}; +}); +``` +Notes +- OkHttp에 대해 확장: 필요에 따라 hook okhttp3.CertificatePinner 및 HostnameVerifier를 적용하거나, CodeShare의 범용 unpinning script를 사용하세요. +- 실행 예: `frida -U -f com.target.app -l ssl-bypass.js --no-pause` + +## 단계 6 — Java hooks가 실패할 때 JNI/native 트레일을 추적 + +JNI 진입점을 추적하여 native 로더와 탐지 초기화(detection init)를 찾아보세요: ```bash frida-trace -n com.example.app -i "JNI_OnLoad" ``` -번들된 .so 파일의 빠른 네이티브 분류: +번들된 .so 파일의 빠른 네이티브 선별: ```bash # List exported symbols & JNI nm -D libfoo.so | head objdump -T libfoo.so | grep Java_ strings -n 6 libfoo.so | egrep -i 'frida|ptrace|gum|magisk|su|root' ``` -인터랙티브/네이티브 reversing: +Interactive/native reversing: - Ghidra: https://ghidra-sre.org/ - r2frida: https://github.com/nowsecure/r2frida -예시: ptrace를 무력화하여 libc의 간단한 anti‑debug를 무력화: +예: neuter ptrace to defeat simple anti‑debug in libc: ```js const ptrace = Module.findExportByName(null, 'ptrace'); if (ptrace) { @@ -137,26 +203,28 @@ reversing-native-libraries.md ## 7단계 — Objection patching (embed gadget / strip basics) -repacking을 runtime hooks보다 선호한다면, 시도해보세요: +repacking을 runtime hooks 대신 선호한다면, 다음을 시도해보세요: ```bash objection patchapk --source app.apk ``` -참고: -- apktool이 필요합니다; 빌드 문제를 피하려면 공식 가이드에서 최신 버전을 사용하세요: https://apktool.org/docs/install -- Gadget injection은 root 없이 instrumentation을 가능하게 하지만 더 강력한 init‑time 검사에는 여전히 감지될 수 있습니다. +Notes: +- apktool 필요; 빌드 문제를 피하려면 공식 가이드에서 최신 버전을 사용하십시오: https://apktool.org/docs/install +- Gadget injection은 root 없이 instrumentation을 가능하게 하지만 더 강력한 init‑time 검사에 의해 여전히 탐지될 수 있습니다. -참조: +선택적으로, Zygisk 환경에서 더 강력한 root 숨김을 위해 LSPosed 모듈과 Shamiko를 추가하고, 자식 프로세스를 포함하도록 DenyList를 조정하세요. + +References: - Objection: https://github.com/sensepost/objection -## Step 8 — 대체 방법: 네트워크 가시성 확보를 위해 TLS pinning 패치 +## Step 8 — Fallback: Patch TLS pinning for network visibility -instrumentation이 차단된 경우, pinning을 정적으로 제거해서 트래픽을 여전히 검사할 수 있습니다: +If instrumentation is blocked, you can still inspect traffic by removing pinning statically: ```bash apk-mitm app.apk # Then install the patched APK and proxy via Burp/mitmproxy ``` - 도구: https://github.com/shroudedcode/apk-mitm -- 네트워크 구성 CA‑trust tricks (및 Android 7+ user CA trust)에 대해서는 다음을 참조: +- 네트워크 구성 CA‑trust 트릭(및 Android 7+ user CA trust)은 다음을 참조하세요: {{#ref}} make-apk-accept-ca-certificate.md @@ -186,10 +254,10 @@ apk-mitm app.apk ``` ## 팁 및 주의사항 -- 앱이 실행 시 crash할 경우 spawning 대신 attaching을 늦게 적용하는 것을 권장합니다 -- 일부 detections는 결제(payment), 인증(auth) 같은 중요한 흐름에서 재실행됩니다 — navigation 동안 hooks를 활성 상태로 유지하세요 -- static과 dynamic을 혼합하세요: Jadx에서 string hunt로 shortlist classes를 찾아낸 뒤 hook methods로 runtime에서 검증하세요 -- 하드닝된 앱은 packers와 native TLS pinning을 사용할 수 있으므로 native code를 reverse해야 할 것으로 예상하세요 +- 앱이 런치 시 크래시할 경우 spawn하기보다 늦게 attach하는 것이 좋다 +- 일부 detections는 중요한 흐름(예: payment, auth)에서 다시 실행될 수 있으므로 navigation 중에는 hooks를 활성 상태로 유지하라 +- static과 dynamic을 혼합하라: Jadx에서 string을 찾아 클래스를 추려낸 다음, runtime에서 검증하기 위해 메서드에 hook를 걸어라 +- 보안이 강화된 앱은 packers와 native TLS pinning을 사용할 수 있으므로 native 코드를 리버스해야 할 것으로 예상하라 ## References @@ -202,5 +270,7 @@ apk-mitm app.apk - [r2frida](https://github.com/nowsecure/r2frida) - [Apktool install guide](https://apktool.org/docs/install) - [Magisk](https://github.com/topjohnwu/Magisk) +- [Medusa (Android Frida framework)](https://github.com/Ch0pin/medusa) +- [Build a Repeatable Android Bug Bounty Lab: Emulator vs Magisk, Burp, Frida, and Medusa](https://www.yeswehack.com/learn-bug-bounty/android-lab-mobile-hacking-tools) {{#include ../../banners/hacktricks-training.md}} diff --git a/src/mobile-pentesting/android-app-pentesting/avd-android-virtual-device.md b/src/mobile-pentesting/android-app-pentesting/avd-android-virtual-device.md index d0f87ec0f..a68fcdf8f 100644 --- a/src/mobile-pentesting/android-app-pentesting/avd-android-virtual-device.md +++ b/src/mobile-pentesting/android-app-pentesting/avd-android-virtual-device.md @@ -2,25 +2,25 @@ {{#include ../../banners/hacktricks-training.md}} -이 콘텐츠를 만드는 데 도움을 주신 [**@offsecjay**](https://twitter.com/offsecjay)에게 매우 감사드립니다. +이 콘텐츠 작성에 도움을 주신 [**@offsecjay**](https://twitter.com/offsecjay)께 감사드립니다. -## What is +## 무엇인가 -Android Studio는 **APK를 테스트하는 데 사용할 수 있는 Android의 가상 머신을 실행할 수 있게 해줍니다**. 이를 사용하기 위해서는 다음이 필요합니다: +Android Studio는 Android 가상 머신을 **실행할 수 있게 해주며, 이를 통해 APKs를 테스트할 수 있습니다**. 이를 사용하려면 다음이 필요합니다: -- **Android SDK 도구** - [여기에서 다운로드](https://developer.android.com/studio/releases/sdk-tools). -- 또는 **Android Studio** (Android SDK 도구 포함) - [여기에서 다운로드](https://developer.android.com/studio). +- The **Android SDK tools** - [Download here](https://developer.android.com/studio/releases/sdk-tools). +- Or **Android Studio** (with Android SDK tools) - [Download here](https://developer.android.com/studio). -Windows에서는 (제 경우) **Android Studio를 설치한 후** **SDK 도구가**: `C:\Users\\AppData\Local\Android\Sdk\tools`에 설치되었습니다. +Windows(제 경우)에서 **Android Studio를 설치한 후** **SDK Tools는 다음 경로에 설치되어 있었습니다**: `C:\Users\\AppData\Local\Android\Sdk\tools` -mac에서는 **SDK 도구를 다운로드**하고 PATH에 추가할 수 있습니다: +mac에서는 **SDK tools를 다운로드**하고 PATH에 추가하려면 다음을 실행하세요: ```bash brew tap homebrew/cask brew install --cask android-sdk ``` -**Android Studio GUI**에서 [https://stackoverflow.com/questions/46402772/failed-to-install-android-sdk-java-lang-noclassdeffounderror-javax-xml-bind-a](https://stackoverflow.com/questions/46402772/failed-to-install-android-sdk-java-lang-noclassdeffounderror-javax-xml-bind-a)에서 언급된 대로 설치하면 `~/Library/Android/sdk/cmdline-tools/latest/bin/` 및 `~/Library/Android/sdk/platform-tools/` 및 `~/Library/Android/sdk/emulator/`에 설치됩니다. +또는 **Android Studio GUI**에서 [https://stackoverflow.com/questions/46402772/failed-to-install-android-sdk-java-lang-noclassdeffounderror-javax-xml-bind-a](https://stackoverflow.com/questions/46402772/failed-to-install-android-sdk-java-lang-noclassdeffounderror-javax-xml-bind-a)에 표시된 것처럼 설치할 수 있으며, 이는 `~/Library/Android/sdk/cmdline-tools/latest/bin/`와 `~/Library/Android/sdk/platform-tools/` 및 `~/Library/Android/sdk/emulator/`에 설치됩니다 -Java 문제에 대한: +Java 문제의 경우: ```java export JAVA_HOME=/Applications/Android\ Studio.app/Contents/jbr/Contents/Home ``` @@ -28,7 +28,7 @@ export JAVA_HOME=/Applications/Android\ Studio.app/Contents/jbr/Contents/Home ### 가상 머신 준비 -Android Studio를 설치했다면, 메인 프로젝트 뷰를 열고 다음 경로로 접근할 수 있습니다: _**Tools**_ --> _**AVD Manager.**_ +Android Studio를 설치했다면, 메인 프로젝트 뷰를 열고 다음으로 접근할 수 있습니다: _**Tools**_ --> _**AVD Manager.**_
@@ -36,38 +36,38 @@ Android Studio를 설치했다면, 메인 프로젝트 뷰를 열고 다음 경
-그런 다음, _**Create Virtual Device**_를 클릭합니다. +그런 다음 _**Create Virtual Device**_ 를 클릭하세요
-_**사용할** 전화기를 선택_하고 _**Next.**_를 클릭합니다. +_**사용할 phone을 선택하세요**_ 그리고 _**Next.**_ 를 클릭하세요 > [!WARNING] -> Play Store가 설치된 전화기가 필요하다면 Play Store 아이콘이 있는 것을 선택하세요! +> Play Store가 설치된 phone이 필요하면 Play Store 아이콘이 있는 항목을 선택하세요! > > -현재 뷰에서 **전화기가 실행할 Android 이미지를 선택하고 다운로드**할 수 있습니다: +현재 화면에서 **폰이 실행할 Android image를 선택하고 다운로드**할 수 있습니다:
-따라서 선택하고 다운로드되지 않았다면 이름 옆의 _**Download**_ 기호를 클릭하세요 (**이제 이미지가 다운로드될 때까지 기다리세요).**\ -이미지가 다운로드되면 **`Next`**와 **`Finish`**를 선택합니다. +이미지를 선택하고 아직 다운로드되지 않은 경우 이름 옆의 _**Download**_ 아이콘을 클릭하세요 (**이미지가 다운로드될 때까지 기다리세요).**\ +이미지가 다운로드되면 **`Next`** 와 **`Finish`** 를 선택하면 됩니다. -가상 머신이 생성됩니다. 이제 **AVD 관리자를 접근할 때마다 항상 존재할 것입니다**. +가상 머신이 생성됩니다. 이제 **AVD Manager에 접근할 때마다 해당 가상 머신이 표시됩니다**. ### 가상 머신 실행 -**실행**하려면 _**Start button**_을 누르세요. +실행하려면 _**Start button**_ 을 누르기만 하면 됩니다. ![](<../../images/image (518).png>) ## 명령줄 도구 > [!WARNING] -> macOS의 경우 `avdmanager` 도구는 `/Users//Library/Android/sdk/tools/bin/avdmanager`에, `emulator`는 `/Users//Library/Android/sdk/emulator/emulator`에 있습니다. 설치되어 있다면 찾을 수 있습니다. +> macOS의 경우 `avdmanager` 도구는 `/Users//Library/Android/sdk/tools/bin/avdmanager`에, `emulator`는 `/Users//Library/Android/sdk/emulator/emulator`에 있습니다(설치된 경우). -먼저 **사용할 전화기를 결정**해야 합니다. 가능한 전화기 목록을 보려면 다음을 실행하세요: +먼저 **어떤 phone을 사용할지 결정**해야 하므로, 사용 가능한 phone 목록을 보려면 실행하세요: ``` C:\Users\\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat list device @@ -95,16 +95,16 @@ Name: Nexus 10 OEM : Google [...] ``` -장치의 이름을 결정한 후, **이 장치에서 실행할 Android 이미지를 결정해야 합니다.**\ -`sdkmanager`를 사용하여 모든 옵션을 나열할 수 있습니다: +사용할 디바이스의 이름을 결정했으면, 이 디바이스에서 어떤 Android 이미지를 실행할지 **결정해야 합니다.**\ +모든 옵션은 `sdkmanager`를 사용해 나열할 수 있습니다: ```bash C:\Users\\AppData\Local\Android\Sdk\tools\bin\sdkmanager.bat --list ``` -그리고 **다운로드** 하세요 사용하고 싶은 것(또는 모두)을: +그리고 사용하려는 것(또는 모두)을 다음 명령으로 **다운로드**하세요: ```bash C:\Users\\AppData\Local\Android\Sdk\tools\bin\sdkmanager.bat "platforms;android-28" "system-images;android-28;google_apis;x86_64" ``` -다운로드한 Android 이미지를 사용하려면 다음 명령어로 **다운로드한 모든 Android 이미지를 나열할 수 있습니다**: +원하는 Android 이미지를 다운로드한 후 다음 명령어로 **다운로드된 모든 Android 이미지를 나열**할 수 있습니다: ``` C:\Users\\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat list target ---------- @@ -120,12 +120,12 @@ Type: Platform API level: 29 Revision: 4 ``` -이제 사용하려는 장치를 결정하고 Android 이미지를 다운로드했으므로 **다음과 같이 가상 머신을 생성할 수 있습니다**: +이제 사용할 디바이스를 결정하고 Android 이미지를 다운로드했으므로, **다음 방법으로 가상 머신을 생성할 수 있습니다**: ```bash C:\Users\\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat -v create avd -k "system-images;android-28;google_apis;x86_64" -n "AVD9" -d "Nexus 5X" ``` -마지막 명령어에서 **"_AVD9_"라는 이름의 VM을 생성했습니다** **"_Nexus 5X_"** **장치**와 **"_system-images;android-28;google_apis;x86_64_"** **안드로이드 이미지**를 사용하여.\ -이제 다음 명령어로 생성한 가상 머신을 **목록화할 수 있습니다**: +이전 명령에서 **VM 이름을 _AVD9_로 생성했습니다** **장치** "_Nexus 5X_" 및 **Android image** "_system-images;android-28;google_apis;x86_64_"를 사용하여.\ +이제 **생성한 virtual machines를 나열**하려면: ```bash C:\Users\\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat list avd @@ -143,73 +143,128 @@ Error: Google pixel_2 no longer exists as a device ### 가상 머신 실행 > [!WARNING] -> macOS의 경우 `/Users//Library/Android/sdk/tools/bin/avdmanager`에서 `avdmanager` 도구를 찾을 수 있으며, 설치되어 있다면 `/Users//Library/Android/sdk/emulator/emulator`에서 `emulator`를 찾을 수 있습니다. +> macOS의 경우, 설치되어 있다면 `avdmanager` 도구를 `/Users//Library/Android/sdk/tools/bin/avdmanager`에서, `emulator`를 `/Users//Library/Android/sdk/emulator/emulator`에서 찾을 수 있습니다. -우리는 이미 생성된 가상 머신을 나열하는 방법을 보았지만, **다음과 같이 나열할 수도 있습니다**: +생성된 가상 머신을 나열하는 방법은 이미 살펴보았지만, **다음 명령을 사용해 나열할 수도 있습니다**: ```bash C:\Users\\AppData\Local\Android\Sdk\tools\emulator.exe -list-avds AVD9 Pixel_2_API_27 ``` -당신은 다음을 사용하여 **생성된 모든 가상 머신을 간단히 실행할 수 있습니다**: +다음을 사용하여 생성된 **모든 가상 머신을 간단히 실행할 수 있습니다**: ```bash C:\Users\\AppData\Local\Android\Sdk\tools\emulator.exe -avd "VirtualMachineName" C:\Users\\AppData\Local\Android\Sdk\tools\emulator.exe -avd "AVD9" ``` -더 고급 옵션을 사용하여 다음과 같은 가상 머신을 실행할 수 있습니다: +또는 더 고급 옵션을 사용하면 다음과 같은 가상 머신을 실행할 수 있습니다: ```bash C:\Users\\AppData\Local\Android\Sdk\tools\emulator.exe -avd "AVD9" -http-proxy 192.168.1.12:8080 -writable-system ``` -### Command line options +### 명령줄 옵션 -그러나 **가상 머신을 시작하는 데 유용한 다양한 명령줄 옵션이 많이 있습니다**. 아래에서 몇 가지 흥미로운 옵션을 찾을 수 있지만 [**여기에서 전체 목록을 찾을 수 있습니다**](https://developer.android.com/studio/run/emulator-commandline) +하지만 VM을 시작할 때 사용할 수 있는 **다양한 유용한 명령줄 옵션이 많이 있습니다**. 아래에 몇 가지 흥미로운 옵션을 찾을 수 있으며, 전체 목록은 [**여기**](https://developer.android.com/studio/run/emulator-commandline)에서 확인할 수 있습니다. **Boot** -- `-snapshot name` : VM 스냅샷 시작 +- `-snapshot name` : VM 스냅샷을 시작 - `-snapshot-list -snapstorage ~/.android/avd/Nexus_5X_API_23.avd/snapshots-test.img` : 기록된 모든 스냅샷 나열 **Network** -- `-dns-server 192.0.2.0, 192.0.2.255` : VM에 DNS 서버를 쉼표로 구분하여 지정할 수 있습니다. -- **`-http-proxy 192.168.1.12:8080`** : 사용할 HTTP 프록시를 지정할 수 있습니다 (Burp를 사용하여 트래픽을 캡처하는 데 매우 유용함). -- 프록시 설정이 어떤 이유로 작동하지 않는 경우, 내부적으로 구성하거나 "Super Proxy" 또는 "ProxyDroid"와 같은 애플리케이션을 사용해 보십시오. -- `-netdelay 200` : 밀리초 단위로 네트워크 지연 에뮬레이션 설정. -- `-port 5556` : 콘솔 및 adb에 사용되는 TCP 포트 번호 설정. -- `-ports 5556,5559` : 콘솔 및 adb에 사용되는 TCP 포트 설정. -- **`-tcpdump /path/dumpfile.cap`** : 파일에 모든 트래픽 캡처 +- `-dns-server 192.0.2.0, 192.0.2.255` : 쉼표로 구분된 DNS 서버를 VM에 지정할 수 있음. +- **`-http-proxy 192.168.1.12:8080`** : 사용할 HTTP 프록시를 지정할 수 있음 (Burp로 트래픽을 캡처할 때 매우 유용) +- 프록시 설정이 어떤 이유로 작동하지 않으면, 내부에서 구성하거나 "Super Proxy"나 "ProxyDroid" 같은 애플리케이션을 사용해보세요. +- `-netdelay 200` : 네트워크 지연(에뮬레이션)을 밀리초 단위로 설정. +- `-port 5556` : 콘솔과 adb에 사용되는 TCP 포트 번호 설정. +- `-ports 5556,5559` : 콘솔과 adb에 사용되는 TCP 포트들 설정. +- **`-tcpdump /path/dumpfile.cap`** : 모든 트래픽을 파일로 캡처 **System** -- `-selinux {disabled|permissive}` : Linux 운영 체제에서 보안 강화 Linux 보안 모듈을 비활성화 또는 허용 모드로 설정. -- `-timezone Europe/Paris` : 가상 장치의 시간대 설정 +- `-selinux {disabled|permissive}` : Linux 운영체제에서 Security-Enhanced Linux 보안 모듈을 disabled 또는 permissive 모드로 설정. +- `-timezone Europe/Paris` : 가상 디바이스의 시간대 설정 - `-screen {touch(default)|multi-touch|o-touch}` : 에뮬레이션된 터치 스크린 모드 설정. -- **`-writable-system`** : 에뮬레이션 세션 동안 쓰기 가능한 시스템 이미지를 갖기 위해 이 옵션을 사용하십시오. `adb root; adb remount`도 실행해야 합니다. 이는 시스템에 새 인증서를 설치하는 데 매우 유용합니다. +- **`-writable-system`** : 에뮬레이션 세션 동안 시스템 이미지를 쓰기 가능하게 하려면 이 옵션을 사용하세요. 또한 `adb root; adb remount`를 실행해야 합니다. 시스템에 새 인증서를 설치할 때 매우 유용합니다. -## Rooting a Play Store device +## Linux CLI setup (SDK/AVD quickstart) -Play Store가 있는 장치를 다운로드한 경우 직접 루트 권한을 얻을 수 없으며, 다음과 같은 오류 메시지가 표시됩니다. +공식 CLI 도구를 사용하면 Android Studio 없이도 빠르고 디버깅 가능한 에뮬레이터를 쉽게 만들 수 있습니다. +```bash +# Directory layout +mkdir -p ~/Android/cmdline-tools/latest + +# Download commandline tools (Linux) +wget https://dl.google.com/android/repository/commandlinetools-linux-13114758_latest.zip -O /tmp/cmdline-tools.zip +unzip /tmp/cmdline-tools.zip -d ~/Android/cmdline-tools/latest +rm /tmp/cmdline-tools.zip + +# Env vars (add to ~/.bashrc or ~/.zshrc) +export ANDROID_HOME=$HOME/Android +export PATH=$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/platform-tools:$ANDROID_HOME/emulator:$PATH + +# Install core SDK components +sdkmanager --install "platform-tools" "emulator" + +# Install a debuggable x86_64 system image (Android 11 / API 30) +sdkmanager --install "system-images;android-30;google_apis;x86_64" + +# Create an AVD and run it with a writable /system & snapshot name +avdmanager create avd -n PixelRootX86 -k "system-images;android-30;google_apis;x86_64" -d "pixel" +emulator -avd PixelRootX86 -writable-system -snapshot PixelRootX86_snap + +# Verify root (debuggable images allow `adb root`) +adb root +adb shell whoami # expect: root +``` +노트 +- System image flavors: google_apis (디버그 가능, allows `adb root`), google_apis_playstore (not rootable), aosp/default (lightweight). +- Build types: userdebug often allows `adb root` on debug-capable images. Play Store images are production builds and block root. +- On x86_64 hosts, full-system ARM64 emulation is unsupported from API 28+. For Android 11+ use Google APIs/Play images that include per-app ARM-to-x86 translation to run many ARM-only apps quickly. + +### CLI에서의 스냅샷 +```bash +# Save a clean snapshot from the running emulator +adb -s emulator-5554 emu avd snapshot save my_clean_setup + +# Boot from a named snapshot (if it exists) +emulator -avd PixelRootX86 -writable-system -snapshot my_clean_setup +``` +## ARM→x86 바이너리 변환 (Android 11+) + +Android 11+의 Google APIs 및 Play Store images는 시스템의 나머지 부분은 네이티브 x86/x86_64로 유지하면서 프로세스별로 ARM 앱 바이너리를 번역할 수 있습니다. 이는 데스크탑에서 많은 ARM 전용 앱을 테스트하기에 대체로 충분히 빠릅니다. + +> 팁: pentests 동안 Google APIs x86/x86_64 images를 사용하는 것이 좋습니다. Play images는 편하지만 `adb root`을 차단합니다; Play services가 꼭 필요하고 root가 없는 것을 받아들일 때만 사용하세요. + +## Play Store 기기 루팅 + +Play Store가 포함된 기기를 다운로드했다면 직접 root를 얻을 수 없으며 다음과 같은 오류 메시지가 나타납니다 ``` $ adb root adbd cannot run as root in production builds ``` -Using [rootAVD](https://github.com/newbit1/rootAVD) with [Magisk](https://github.com/topjohnwu/Magisk) I was able to root it (follow for example [**this video**](https://www.youtube.com/watch?v=Wk0ixxmkzAI) **or** [**this one**](https://www.youtube.com/watch?v=qQicUW0svB8)). +Using [rootAVD](https://github.com/newbit1/rootAVD) with [Magisk](https://github.com/topjohnwu/Magisk) [rootAVD]와 [Magisk]를 사용하여 루팅할 수 있었습니다 (예: [**this video**](https://www.youtube.com/watch?v=Wk0ixxmkzAI) **또는** [**this one**](https://www.youtube.com/watch?v=qQicUW0svB8)). ## Burp 인증서 설치 -사용자 정의 CA 인증서를 설치하는 방법을 배우려면 다음 페이지를 확인하세요: +사용자 정의 CA 인증서를 설치하는 방법은 다음 페이지를 확인하세요: {{#ref}} install-burp-certificate.md {{#endref}} -## 멋진 AVD 옵션 +## 유용한 AVD 옵션 ### 스냅샷 찍기 -언제든지 VM의 스냅샷을 찍으려면 **GUI를 사용할 수 있습니다**: +언제든지 VM의 스냅샷을 **GUI를 사용하여** 찍을 수 있습니다: ![](<../../images/image (234).png>) +## 참고자료 + +- [Build a Repeatable Android Bug Bounty Lab: Emulator vs Magisk, Burp, Frida, and Medusa](https://www.yeswehack.com/learn-bug-bounty/android-lab-mobile-hacking-tools) +- [Android Emulator command line](https://developer.android.com/studio/run/emulator-commandline) +- [Run ARM apps on the Android Emulator (x86 translation)](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html) + {{#include ../../banners/hacktricks-training.md}} diff --git a/src/mobile-pentesting/android-app-pentesting/frida-tutorial/README.md b/src/mobile-pentesting/android-app-pentesting/frida-tutorial/README.md index 9aee58db1..e141f07d0 100644 --- a/src/mobile-pentesting/android-app-pentesting/frida-tutorial/README.md +++ b/src/mobile-pentesting/android-app-pentesting/frida-tutorial/README.md @@ -1,54 +1,107 @@ -# Frida Tutorial +# Frida 튜토리얼 {{#include ../../../banners/hacktricks-training.md}} -## Installation +## 설치 -**frida tools**를 설치하세요: +다음 항목을 설치하세요: **frida tools** ```bash pip install frida-tools pip install frida ``` -**안드로이드에** **frida server**를 **다운로드하고 설치**하세요 ([최신 릴리스 다운로드](https://github.com/frida/frida/releases)).\ -adb를 루트 모드로 재시작하고, 연결하고, frida-server를 업로드하고, 실행 권한을 부여한 후 백그라운드에서 실행하는 원라이너: +**다운로드 및 설치** 안드로이드에 **frida server** ([Download the latest release](https://github.com/frida/frida/releases)).\ +adb를 root 모드로 재시작하고 연결한 뒤 frida-server를 업로드하고 실행 권한을 부여한 다음 백그라운드에서 실행하는 원라이너: ```bash adb root; adb connect localhost:6000; sleep 1; adb push frida-server /data/local/tmp/; adb shell "chmod 755 /data/local/tmp/frida-server"; adb shell "/data/local/tmp/frida-server &" ``` -**작동하는지 확인하세요**: +**확인**: 이것이 **작동**하는지: ```bash frida-ps -U #List packages and processes frida-ps -U | grep -i #Get all the package name ``` -## 튜토리얼 +## Frida server vs. Gadget (root vs. no-root) -### [튜토리얼 1](frida-tutorial-1.md) +Frida로 Android 앱을 계측하는 두 가지 일반적인 방법: + +- Frida server (rooted devices): 네이티브 daemon을 push하고 실행하여 어떤 process에도 attach할 수 있게 해줍니다. +- Frida Gadget (no root): Frida를 shared library로 APK 내부에 번들하고 target process 내에서 자동으로 로드합니다. + +Frida server (rooted) +```bash +# Download the matching frida-server binary for your device's arch +# https://github.com/frida/frida/releases +adb root +adb push frida-server--android- /data/local/tmp/frida-server +adb shell chmod 755 /data/local/tmp/frida-server +adb shell /data/local/tmp/frida-server & # run at boot via init/magisk if desired + +# From host, list processes and attach +frida-ps -Uai +frida -U -n com.example.app +``` +Frida Gadget (no-root) + +1) APK의 압축을 풀고, gadget .so와 config를 추가: +- libfrida-gadget.so를 lib//에 배치하세요 (예: lib/arm64-v8a/) +- 스크립트 로딩 설정을 포함한 assets/frida-gadget.config 파일을 생성하세요 + +Example frida-gadget.config +```json +{ +"interaction": { "type": "script", "path": "/sdcard/ssl-bypass.js" }, +"runtime": { "logFile": "/sdcard/frida-gadget.log" } +} +``` +2) gadget을 참조/로드하여 조기에 초기화되도록 합니다: +- 가장 쉬운 방법: Application.onCreate()에 System.loadLibrary("frida-gadget")를 호출하는 작은 Java 스텁을 추가하거나, 이미 존재하는 네이티브 라이브러리 로딩을 사용하세요. + +3) APK를 재패키징하고 서명한 다음 설치: +```bash +apktool d app.apk -o app_m +# ... add gadget .so and config ... +apktool b app_m -o app_gadget.apk +uber-apk-signer -a app_gadget.apk -o out_signed +adb install -r out_signed/app_gadget-aligned-debugSigned.apk +``` +4) host에서 gadget process에 Attach: +```bash +frida-ps -Uai +frida -U -n com.example.app +``` +참고 +- Gadget은 일부 보호 기능에 의해 탐지됩니다; 필요하면 이름/경로를 은폐하고 늦게/조건부로 로드하세요. +- 보호가 강화된 앱에서는 rooted testing을 server + late attach로 수행하거나 Magisk/Zygisk 숨김과 결합하는 것을 권장합니다. + +## Tutorials + +### [Tutorial 1](frida-tutorial-1.md) **출처**: [https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1](https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1)\ **APK**: [https://github.com/t0thkr1s/frida-demo/releases](https://github.com/t0thkr1s/frida-demo/releases)\ -**소스 코드**: [https://github.com/t0thkr1s/frida-demo](https://github.com/t0thkr1s/frida-demo) +**Source Code**: [https://github.com/t0thkr1s/frida-demo](https://github.com/t0thkr1s/frida-demo) -**[링크를 따라 읽어보세요](frida-tutorial-1.md).** +**읽으려면 [link to read it](frida-tutorial-1.md)를 따라가세요.** -### [튜토리얼 2](frida-tutorial-2.md) +### [Tutorial 2](frida-tutorial-2.md) -**출처**: [https://11x256.github.io/Frida-hooking-android-part-2/](https://11x256.github.io/Frida-hooking-android-part-2/) (파트 2, 3 & 4)\ -**APK 및 소스 코드**: [https://github.com/11x256/frida-android-examples](https://github.com/11x256/frida-android-examples) +**출처**: [https://11x256.github.io/Frida-hooking-android-part-2/](https://11x256.github.io/Frida-hooking-android-part-2/) (Parts 2, 3 & 4)\ +**APKs and Source code**: [https://github.com/11x256/frida-android-examples](https://github.com/11x256/frida-android-examples) -**[링크를 따라 읽어보세요.](frida-tutorial-2.md)** +**읽으려면[ link to read it.](frida-tutorial-2.md)** -### [튜토리얼 3](owaspuncrackable-1.md) +### [Tutorial 3](owaspuncrackable-1.md) **출처**: [https://joshspicer.com/android-frida-1](https://joshspicer.com/android-frida-1)\ **APK**: [https://github.com/OWASP/owasp-mstg/blob/master/Crackmes/Android/Level_01/UnCrackable-Level1.apk](https://github.com/OWASP/owasp-mstg/blob/master/Crackmes/Android/Level_01/UnCrackable-Level1.apk) -**[링크를 따라 읽어보세요](owaspuncrackable-1.md).** +**읽으려면 [link to read it](owaspuncrackable-1.md)를 따라가세요.** -**더 많은 멋진 Frida 스크립트를 여기에서 찾을 수 있습니다:** [**https://codeshare.frida.re/**](https://codeshare.frida.re) +**You can find more Awesome Frida scripts here:** [**https://codeshare.frida.re/**](https://codeshare.frida.re) ## 빠른 예제 -### 명령줄에서 Frida 호출하기 +### 커맨드라인에서 Frida 호출 ```bash frida-ps -U @@ -61,7 +114,7 @@ frida -U --no-pause -l disableRoot.js -f owasp.mstg.uncrackable1 #frozen so that the instrumentation can occur, and the automatically #continue execution with our modified code. ``` -### 기본 Python 스크립트 +### 기본 Python Script ```python import frida, sys @@ -72,9 +125,9 @@ print('[ * ] Running Frida Demo application') script.load() sys.stdin.read() ``` -### 매개변수 없이 함수 훅킹 +### Hooking functions — 매개변수 없음 -클래스 `sg.vantagepoint.a.c`의 함수 `a()`를 훅킹합니다. +클래스 `sg.vantagepoint.a.c`의 함수 `a()`를 Hook하세요. ```javascript Java.perform(function () { ; rootcheck1.a.overload().implementation = function() { @@ -84,14 +137,14 @@ return false; }; }); ``` -자바 `exit()` 후킹 +java `exit()` 후킹 ```javascript var sysexit = Java.use("java.lang.System") sysexit.exit.overload("int").implementation = function (var_0) { send("java.lang.System.exit(I)V // We avoid exiting the application :)") } ``` -MainActivity의 `.onStart()` 및 `.onCreate()` 훅 +Hook MainActivity `.onStart()` 및 `.onCreate()` ```javascript var mainactivity = Java.use("sg.vantagepoint.uncrackable1.MainActivity") mainactivity.onStart.overload().implementation = function () { @@ -105,7 +158,7 @@ send("MainActivity.onCreate() HIT!!!") var ret = this.onCreate.overload("android.os.Bundle").call(this, var_0) } ``` -안드로이드 `.onCreate()` 훅 +android `.onCreate()` 훅 ```javascript var activity = Java.use("android.app.Activity") activity.onCreate.overload("android.os.Bundle").implementation = function ( @@ -115,9 +168,9 @@ send("Activity HIT!!!") var ret = this.onCreate.overload("android.os.Bundle").call(this, var_0) } ``` -### 매개변수가 있는 함수 후킹 및 값 검색 +### Hooking 함수의 매개변수와 반환값 가져오기 -복호화 함수를 후킹합니다. 입력을 출력하고, 원래 함수를 호출하여 입력을 복호화한 다음, 평문 데이터를 출력합니다: +복호화 함수에 Hooking하기. 입력을 출력하고, 원본 함수를 호출해 입력을 복호화한 다음, 평문 데이터를 출력합니다: ```javascript function getString(data) { var ret = "" @@ -142,9 +195,9 @@ send("Decrypted flag: " + flag) return ret //[B } ``` -### 함수 후킹 및 입력으로 호출하기 +### Hooking functions 및 우리 입력으로 호출하기 -문자열을 받는 함수를 후킹하고 다른 문자열로 호출하기 (from [here](https://11x256.github.io/Frida-hooking-android-part-2/)) +string을 받는 function을 Hook하여 다른 string으로 호출한다 (from [here](https://11x256.github.io/Frida-hooking-android-part-2/)) ```javascript var string_class = Java.use("java.lang.String") // get a JS wrapper for java's String class @@ -157,11 +210,11 @@ console.log("Return value: " + ret) return ret } ``` -### 이미 생성된 클래스 객체 가져오기 +### 이미 생성된 클래스의 객체 가져오기 -생성된 객체의 일부 속성을 추출하려면 다음을 사용할 수 있습니다. +이미 생성된 객체의 속성 일부를 추출하려면 이 방법을 사용할 수 있습니다. -이 예제에서는 my_activity 클래스의 객체를 가져오는 방법과 객체의 비공개 속성을 출력하는 .secret() 함수를 호출하는 방법을 보여줍니다: +이 예제에서는 클래스 my_activity의 객체를 얻는 방법과, 해당 객체의 private 속성을 출력하는 .secret() 함수를 호출하는 방법을 보여줍니다: ```javascript Java.choose("com.example.a11x256.frida_test.my_activity", { onMatch: function (instance) { @@ -172,10 +225,16 @@ console.log("Result of secret func: " + instance.secret()) onComplete: function () {}, }) ``` -## 다른 Frida 튜토리얼 +## 기타 Frida 튜토리얼 - [https://github.com/DERE-ad2001/Frida-Labs](https://github.com/DERE-ad2001/Frida-Labs) -- [고급 Frida 사용 블로그 시리즈 1부: IOS 암호화 라이브러리](https://8ksec.io/advanced-frida-usage-part-1-ios-encryption-libraries-8ksec-blogs/) +- [Part 1 of Advanced Frida Usage blog series: IOS Encryption Libraries](https://8ksec.io/advanced-frida-usage-part-1-ios-encryption-libraries-8ksec-blogs/) +## 참고 자료 + +- [Build a Repeatable Android Bug Bounty Lab: Emulator vs Magisk, Burp, Frida, and Medusa](https://www.yeswehack.com/learn-bug-bounty/android-lab-mobile-hacking-tools) +- [Frida Gadget documentation](https://frida.re/docs/gadget/) +- [Frida releases (server binaries)](https://github.com/frida/frida/releases) + {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/mobile-pentesting/android-app-pentesting/install-burp-certificate.md b/src/mobile-pentesting/android-app-pentesting/install-burp-certificate.md index b3fd0a3e1..56e1a0a95 100644 --- a/src/mobile-pentesting/android-app-pentesting/install-burp-certificate.md +++ b/src/mobile-pentesting/android-app-pentesting/install-burp-certificate.md @@ -3,18 +3,30 @@ {{#include ../../banners/hacktricks-training.md}} +## ADB를 통한 시스템 전체 프록시 + +전역 HTTP 프록시를 구성하여 모든 앱이 트래픽을 interceptor (Burp/mitmproxy)를 통해 라우팅하도록 합니다: +```bash +# Set proxy (device/emulator must reach your host IP) +adb shell settings put global http_proxy 192.168.1.2:8080 + +# Clear proxy +adb shell settings put global http_proxy :0 +``` +팁: Burp에서 리스너를 0.0.0.0에 바인드하면 LAN의 디바이스들이 연결할 수 있습니다 (Proxy -> Options -> Proxy Listeners). + ## 가상 머신에서 -먼저 Burp에서 Der 인증서를 다운로드해야 합니다. 이는 _**Proxy**_ --> _**Options**_ --> _**Import / Export CA certificate**_에서 할 수 있습니다. +먼저 Burp에서 Der 인증서를 다운로드해야 합니다. _**Proxy**_ --> _**Options**_ --> _**Import / Export CA certificate**_에서 할 수 있습니다. ![](<../../images/image (367).png>) -**Der 형식으로 인증서를 내보내고** 이를 **Android**가 **이해할 수 있는 형태로 변환**합시다. **AVD의 Android 머신에서 burp 인증서를 구성하려면** 이 머신을 **`-writable-system`** 옵션과 함께 **실행해야 합니다.**\ +**Der 형식으로 인증서를 내보내기**한 다음 **변환**하여 **Android**가 **이해할 수 있는** 형태로 만듭니다. **AVD의 Android 머신에 burp 인증서를 구성하려면** 이 머신을 **`-writable-system`** 옵션과 **함께** **실행**해야 한다는 점을 유의하세요.\ 예를 들어 다음과 같이 실행할 수 있습니다: ```bash C:\Users\\AppData\Local\Android\Sdk\tools\emulator.exe -avd "AVD9" -http-proxy 192.168.1.12:8080 -writable-system ``` -그런 다음 **burp의 인증서를 구성하려면**: +그런 다음, **burps 인증서를 구성하려면**: ```bash openssl x509 -inform DER -in burp_cacert.der -out burp_cacert.pem CERTHASHNAME="`openssl x509 -inform PEM -subject_hash_old -in burp_cacert.pem | head -1`.0" @@ -25,39 +37,43 @@ adb shell mv /sdcard/$CERTHASHNAME /system/etc/security/cacerts/ #Move to correc adb shell chmod 644 /system/etc/security/cacerts/$CERTHASHNAME #Assign privileges adb reboot #Now, reboot the machine ``` -기계가 **재부팅을 마치면** burp 인증서가 사용됩니다! +머신이 **재부팅을 마치면** Burp certificate가 사용됩니다! ## Magisc 사용하기 -장치를 **Magisc로 루팅한 경우** (아마도 에뮬레이터일 수 있음) 이전 **단계를 따라할 수 없다면** Burp 인증서를 설치하기 위해 **파일 시스템이 읽기 전용**이고 이를 쓰기 가능으로 다시 마운트할 수 없는 경우, 다른 방법이 있습니다. +만약 당신이 **Magisc로 기기를 루트(root)화했다**(에뮬레이터일 수 있음)면, 이전에 Burp cert를 설치하는 **단계들**을 따라할 수 없고 그 이유가 **파일시스템이 읽기 전용(read-only)**이라 remount로 쓰기 가능하게 만들 수 없다면, 다른 방법이 있습니다. -[**이 비디오**](https://www.youtube.com/watch?v=qQicUW0svB8)에서 설명된 대로 다음을 수행해야 합니다: +[**this video**](https://www.youtube.com/watch?v=qQicUW0svB8)에 설명된 것처럼, 다음을 수행해야 합니다: -1. **CA 인증서 설치**: DER Burp 인증서를 **드래그 앤 드롭**하여 모바일에서 **확장자를** `.crt`로 변경하여 Downloads 폴더에 저장하고 `Install a certificate` -> `CA certificate`로 이동합니다. +1. **CA certificate 설치**: DER Burp certificate 파일의 확장자를 `.crt`로 **변경한 후** 모바일로 **드래그&드롭**하여 Downloads 폴더에 저장하고 `Install a certificate` -> `CA certificate`로 이동합니다
-- `Trusted credentials` -> `USER`로 이동하여 인증서가 올바르게 저장되었는지 확인합니다. +- 인증서가 제대로 저장되었는지 `Trusted credentials` -> `USER`로 이동해 확인하세요
-2. **시스템 신뢰로 만들기**: Magisc 모듈 [MagiskTrustUserCerts](https://github.com/NVISOsecurity/MagiskTrustUserCerts) (zip 파일)를 다운로드하고, **드래그 앤 드롭**하여 전화기에 넣고, 전화기의 **Magics 앱**에서 **`Modules`** 섹션으로 이동하여 **`Install from storage`**를 클릭하고, `.zip` 모듈을 선택한 후 설치가 완료되면 **재부팅**합니다: +2. **System trusted로 만들기**: Magisc 모듈 [MagiskTrustUserCerts](https://github.com/NVISOsecurity/MagiskTrustUserCerts) (.zip 파일)를 다운로드한 뒤, 폰에 **드래그&드롭**하고 폰의 **Magics app**에서 **`Modules`** 섹션으로 들어가 **`Install from storage`**를 클릭해 `.zip` 모듈을 선택하여 설치한 다음 폰을 **재부팅**합니다:
-- 재부팅 후 `Trusted credentials` -> `SYSTEM`으로 이동하여 Postswigger 인증서가 있는지 확인합니다. +- 재부팅 후 `Trusted credentials` -> `SYSTEM`로 이동해 Postswigger cert가 있는지 확인하세요
+### Magisc 모듈 만드는 법 배우기 + +다음 링크를 확인하세요: https://medium.com/@justmobilesec/magisk-for-mobile-pentesting-rooting-android-devices-and-building-custom-modules-part-ii-22badc498437 + ## Android 14 이후 -최신 Android 14 릴리스에서는 시스템 신뢰 CA 인증서 처리 방식에 중대한 변화가 관찰되었습니다. 이전에는 이러한 인증서가 **`/system/etc/security/cacerts/`**에 저장되어 루트 권한을 가진 사용자가 접근하고 수정할 수 있었으며, 이를 통해 시스템 전반에 즉시 적용할 수 있었습니다. 그러나 Android 14에서는 저장 위치가 **`/apex/com.android.conscrypt/cacerts`**로 이동하였으며, 이는 본질적으로 변경 불가능한 **`/apex`** 경로 내의 디렉토리입니다. +최신 Android 14 릴리스에서는 system-trusted Certificate Authority (CA) 인증서 처리 방식에 큰 변화가 있었습니다. 이전에는 이 인증서들이 **`/system/etc/security/cacerts/`**에 위치해 있어 root 권한이 있는 사용자가 접근·수정할 수 있었고 시스템 전체에 즉시 적용되었습니다. 그러나 Android 14에서는 저장 위치가 **`/apex/com.android.conscrypt/cacerts`**로 이동했으며, 이는 **`/apex`** 경로 내의 디렉토리로 본질적으로 변경 불가능(immutable)합니다. -**APEX cacerts 경로**를 쓰기 가능으로 다시 마운트하려는 시도는 실패로 돌아가며, 시스템은 이러한 작업을 허용하지 않습니다. 임시 파일 시스템(tmpfs)으로 디렉토리를 언마운트하거나 오버레이하려는 시도조차 불변성을 우회하지 못하며, 애플리케이션은 파일 시스템 수준의 변경과 관계없이 원래 인증서 데이터에 계속 접근합니다. 이러한 회복력은 **`/apex`** 마운트가 PRIVATE 전파로 구성되어 있어 **`/apex`** 디렉토리 내의 수정이 다른 프로세스에 영향을 미치지 않도록 보장합니다. +**APEX cacerts path**를 쓰기 가능하도록 remount하려는 시도는 시스템에서 허용되지 않아 실패합니다. 디렉토리를 언마운트하거나 tmpfs로 오버레이해도 불변성을 우회하지 못하며, 파일시스템 수준에서 변경을 가해도 애플리케이션은 여전히 원본 인증서 데이터를 참조합니다. 이는 **`/apex`** 마운트가 PRIVATE propagation으로 설정되어 있어 **`/apex`** 내의 변경이 다른 프로세스에 영향을 주지 않도록 하기 때문입니다. -Android 초기화는 `init` 프로세스를 포함하며, 운영 체제를 시작할 때 Zygote 프로세스도 시작됩니다. 이 프로세스는 새로운 마운트 네임스페이스를 포함하여 애플리케이션 프로세스를 시작하는 역할을 하며, 여기에는 개인 **`/apex`** 마운트가 포함되어 있어 이 디렉토리의 변경 사항이 다른 프로세스와 격리됩니다. +Android 초기화는 `init` 프로세스가 운영체제를 시작하면서 Zygote 프로세스를 기동하는 과정을 포함합니다. Zygote는 새로운 마운트 네임스페이스를 가진 애플리케이션 프로세스를 시작하는 역할을 하며, 이 네임스페이스에는 private **`/apex`** 마운트가 포함되어 있어 해당 디렉토리에 대한 변경이 다른 프로세스와 격리됩니다. -그럼에도 불구하고 **`/apex`** 디렉토리 내의 시스템 신뢰 CA 인증서를 수정해야 하는 경우 우회 방법이 존재합니다. 이는 PRIVATE 전파를 제거하기 위해 **`/apex`**를 수동으로 다시 마운트하여 쓰기 가능하게 만드는 것을 포함합니다. 이 과정은 **`/apex/com.android.conscrypt`**의 내용을 다른 위치로 복사하고, 읽기 전용 제약을 제거하기 위해 **`/apex/com.android.conscrypt`** 디렉토리를 언마운트한 후, 내용을 원래 위치인 **`/apex`**로 복원하는 것을 포함합니다. 이 접근 방식은 시스템 충돌을 피하기 위해 신속한 조치를 요구합니다. 이러한 변경 사항이 시스템 전반에 적용되도록 하려면 `system_server`를 재시작하는 것이 좋으며, 이는 모든 애플리케이션을 효과적으로 재시작하고 시스템을 일관된 상태로 만듭니다. +그럼에도 불구하고 **`/apex`** 디렉토리 내의 system-trusted CA 인증서를 수정해야 하는 경우에 대한 우회 방법이 있습니다. 이 방법은 **`/apex`**의 PRIVATE propagation을 제거하기 위해 수동으로 remount하는 것으로, 이렇게 하면 쓰기가 가능해집니다. 절차는 **`/apex/com.android.conscrypt`**의 내용을 다른 위치로 복사하고, **`/apex/com.android.conscrypt`** 디렉토리를 언마운트하여 읽기 전용 제약을 제거한 뒤, 내용을 원래의 **`/apex`** 위치로 복원하는 것입니다. 이 과정은 시스템 크래시를 피하기 위해 빠르게 진행해야 합니다. 변경사항을 시스템 전반에 적용하려면 모든 애플리케이션을 사실상 재시작하는 `system_server`를 재시작하는 것이 권장됩니다. ```bash # Create a separate temp directory, to hold the current certificates # Otherwise, when we add the mount we can't read the current certs anymore. @@ -115,28 +131,28 @@ wait # Launched in parallel - wait for completion here echo "System certificate injected" ``` -### Bind-mounting through NSEnter +### NSEnter를 통한 Bind-mounting -1. **쓰기 가능한 디렉토리 설정**: 처음에, 기존의 비-APEX 시스템 인증서 디렉토리 위에 `tmpfs`를 마운트하여 쓰기 가능한 디렉토리를 설정합니다. 이는 다음 명령어로 수행됩니다: +1. **쓰기 가능한 디렉터리 설정**: 처음에는 기존의 non-APEX 시스템 인증서 디렉터리 위에 `tmpfs`를 마운트하여 쓰기 가능한 디렉터리를 생성합니다. 이는 다음 명령어로 수행됩니다: ```bash mount -t tmpfs tmpfs /system/etc/security/cacerts ``` -2. **CA 인증서 준비**: 쓰기 가능한 디렉토리를 설정한 후, 사용하려는 CA 인증서를 이 디렉토리에 복사해야 합니다. 이는 `/apex/com.android.conscrypt/cacerts/`에서 기본 인증서를 복사하는 것을 포함할 수 있습니다. 이러한 인증서의 권한 및 SELinux 레이블을 적절히 조정하는 것이 중요합니다. -3. **Zygote에 대한 바인드 마운트**: `nsenter`를 사용하여 Zygote의 마운트 네임스페이스에 들어갑니다. Zygote는 Android 애플리케이션을 시작하는 프로세스이므로, 이후 시작되는 모든 애플리케이션이 새로 구성된 CA 인증서를 사용하도록 이 단계를 수행해야 합니다. 사용되는 명령은: +2. **CA 인증서 준비**: 쓰기 가능한 디렉터리 설정 후, 사용하려는 CA 인증서를 이 디렉터리로 복사해야 합니다. 여기에는 `/apex/com.android.conscrypt/cacerts/`에서 기본 인증서를 복사하는 작업이 포함될 수 있습니다. 이러한 인증서들의 권한과 SELinux 라벨을 적절히 조정하는 것이 필수적입니다. +3. **Zygote를 위한 바인드 마운트**: `nsenter`를 사용하여 Zygote의 마운트 네임스페이스로 들어갑니다. Zygote는 Android 애플리케이션을 실행하는 프로세스이므로, 이후 시작되는 모든 애플리케이션이 새로 구성한 CA 인증서를 사용하도록 하기 위해 이 단계가 필요합니다. 사용되는 명령은: ```bash nsenter --mount=/proc/$ZYGOTE_PID/ns/mnt -- /bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts ``` -이것은 시작되는 모든 새로운 앱이 업데이트된 CA 인증서 설정을 준수하도록 보장합니다. +이렇게 하면 새로 시작되는 모든 앱이 업데이트된 CA 인증서 설정을 따르도록 보장됩니다. -4. **실행 중인 앱에 변경 사항 적용**: 이미 실행 중인 애플리케이션에 변경 사항을 적용하기 위해, `nsenter`를 다시 사용하여 각 앱의 네임스페이스에 개별적으로 들어가 유사한 바인드 마운트를 수행합니다. 필요한 명령은: +4. **실행 중인 앱에 변경사항 적용**: 이미 실행 중인 애플리케이션에 변경사항을 적용하려면, `nsenter`를 다시 사용하여 각 앱의 네임스페이스에 개별적으로 들어가 유사한 bind mount를 수행합니다. 필요한 명령은 다음과 같습니다: ```bash nsenter --mount=/proc/$APP_PID/ns/mnt -- /bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts ``` -5. **대체 접근법 - 소프트 재부팅**: 대체 방법은 `init` 프로세스(PID 1)에서 바인드 마운트를 수행한 다음 `stop && start` 명령어로 운영 체제를 소프트 재부팅하는 것입니다. 이 접근법은 모든 네임스페이스에 걸쳐 변경 사항을 전파하여 각 실행 중인 앱을 개별적으로 처리할 필요가 없습니다. 그러나 이 방법은 재부팅의 불편함으로 인해 일반적으로 덜 선호됩니다. +5. **대체 방법 - 소프트 리부트**: 대체 방법으로는 `init` 프로세스 (PID 1)에 bind mount를 수행한 후 `stop && start` 명령으로 운영체제를 소프트 리부트하는 방식이 있습니다. 이 방법은 변경사항을 모든 네임스페이스에 전파하여 실행 중인 각 앱을 개별적으로 처리할 필요를 없애줍니다. 그러나 재부팅의 불편함 때문에 일반적으로 선호되지는 않습니다. -## References - -- [https://httptoolkit.com/blog/android-14-install-system-ca-certificate/](https://httptoolkit.com/blog/android-14-install-system-ca-certificate/) +## 참고 자료 +- [Android 14: Install a system CA certificate on a rooted device](https://httptoolkit.com/blog/android-14-install-system-ca-certificate/) +- [Build a Repeatable Android Bug Bounty Lab: Emulator vs Magisk, Burp, Frida, and Medusa](https://www.yeswehack.com/learn-bug-bounty/android-lab-mobile-hacking-tools) {{#include ../../banners/hacktricks-training.md}}