From 4643e5ccd68d91292e745940350c6a7b1dbebbec Mon Sep 17 00:00:00 2001 From: Translator Date: Thu, 21 Aug 2025 04:10:58 +0000 Subject: [PATCH] Translated ['src/mobile-pentesting/android-app-pentesting/android-anti-i --- src/SUMMARY.md | 1 + .../android-app-pentesting/README.md | 126 +++++------ ...-instrumentation-and-ssl-pinning-bypass.md | 203 ++++++++++++++++++ 3 files changed, 270 insertions(+), 60 deletions(-) create mode 100644 src/mobile-pentesting/android-app-pentesting/android-anti-instrumentation-and-ssl-pinning-bypass.md diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 432bf44fc..e7e49e187 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -326,6 +326,7 @@ - [Android APK Checklist](mobile-pentesting/android-checklist.md) - [Android Applications Pentesting](mobile-pentesting/android-app-pentesting/README.md) - [Accessibility Services Abuse](mobile-pentesting/android-app-pentesting/accessibility-services-abuse.md) + - [Android Anti Instrumentation And Ssl Pinning Bypass](mobile-pentesting/android-app-pentesting/android-anti-instrumentation-and-ssl-pinning-bypass.md) - [Android Applications Basics](mobile-pentesting/android-app-pentesting/android-applications-basics.md) - [Android Task Hijacking](mobile-pentesting/android-app-pentesting/android-task-hijacking.md) - [ADB Commands](mobile-pentesting/android-app-pentesting/adb-commands.md) diff --git a/src/mobile-pentesting/android-app-pentesting/README.md b/src/mobile-pentesting/android-app-pentesting/README.md index fd052100e..7df7244d6 100644 --- a/src/mobile-pentesting/android-app-pentesting/README.md +++ b/src/mobile-pentesting/android-app-pentesting/README.md @@ -25,7 +25,7 @@ android-applications-basics.md ## Other interesting tricks - [Play Store에서 위치 스푸핑하기](spoofing-your-location-in-play-store.md) -- [Shizuku Privileged API (ADB 기반 비루트 권한 접근)](shizuku-privileged-api.md) +- [Shizuku Privileged API (ADB 기반 비루트 특권 접근)](shizuku-privileged-api.md) - [불안전한 인앱 업데이트 메커니즘 악용하기](insecure-in-app-update-rce.md) - [접근성 서비스 악용하기 (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) @@ -80,7 +80,7 @@ APK의 **문자열**을 살펴보면 **비밀번호**, **URL** ([https://github. - **디버깅 가능한 애플리케이션**: _Manifest.xml_ 파일에서 디버깅 가능(`debuggable="true"`)으로 설정된 애플리케이션은 연결을 허용하여 악용될 위험이 있습니다. 디버깅 가능한 애플리케이션을 찾고 악용하는 방법에 대한 튜토리얼을 참조하세요. - **백업 설정**: 민감한 정보를 다루는 애플리케이션의 경우 `android:allowBackup="false"` 속성을 명시적으로 설정하여 adb를 통한 무단 데이터 백업을 방지해야 합니다. 특히 USB 디버깅이 활성화된 경우에 그렇습니다. - **네트워크 보안**: _res/xml/_의 사용자 지정 네트워크 보안 구성(`android:networkSecurityConfig="@xml/network_security_config"`)은 인증서 핀 및 HTTP 트래픽 설정과 같은 보안 세부정보를 지정할 수 있습니다. 예를 들어 특정 도메인에 대해 HTTP 트래픽을 허용하는 것입니다. -- **내보내기된 활동 및 서비스**: 매니페스트에서 내보내기된 활동 및 서비스를 식별하면 악용될 수 있는 구성 요소를 강조할 수 있습니다. 동적 테스트 중 추가 분석을 통해 이러한 구성 요소를 악용하는 방법을 밝혀낼 수 있습니다. +- **내보낸 활동 및 서비스**: 매니페스트에서 내보낸 활동 및 서비스를 식별하면 악용될 수 있는 구성 요소를 강조할 수 있습니다. 동적 테스트 중 추가 분석을 통해 이러한 구성 요소를 악용하는 방법을 밝혀낼 수 있습니다. - **콘텐츠 제공자 및 파일 제공자**: 노출된 콘텐츠 제공자는 무단 데이터 접근 또는 수정이 가능할 수 있습니다. 파일 제공자의 구성도 면밀히 검토해야 합니다. - **브로드캐스트 수신기 및 URL 스킴**: 이러한 구성 요소는 악용될 수 있으며, 입력 취약점에 대한 URL 스킴 관리 방법에 특히 주의해야 합니다. - **SDK 버전**: `minSdkVersion`, `targetSDKVersion`, `maxSdkVersion` 속성은 지원되는 Android 버전을 나타내며, 보안상의 이유로 구식의 취약한 Android 버전을 지원하지 않는 것이 중요합니다. @@ -100,7 +100,7 @@ tapjacking.md ### 작업 탈취 -**`launchMode`**가 **`singleTask`**로 설정되고 **`taskAffinity`**가 정의되지 않은 **활동**은 작업 탈취에 취약합니다. 이는 **애플리케이션**이 설치될 수 있으며, 실제 애플리케이션보다 먼저 실행되면 **실제 애플리케이션의 작업을 탈취할 수 있습니다**(즉, 사용자가 **악의적인 애플리케이션과 상호작용하고 있다고 생각하게 됩니다**). +**`launchMode`**가 **`singleTask`**로 설정되고 `taskAffinity`가 정의되지 않은 **활동**은 작업 탈취에 취약합니다. 이는 **애플리케이션**이 설치되고 실제 애플리케이션보다 먼저 실행될 경우 **실제 애플리케이션의 작업을 탈취할 수 있음을 의미합니다**(따라서 사용자는 **악의적인 애플리케이션과 상호작용하고 있다고 생각하게 됩니다**). 자세한 내용은 다음에서 확인하세요: @@ -115,9 +115,9 @@ android-task-hijacking.md Android에서 **내부** 저장소에 **저장된** 파일은 **생성한 앱**만 **접근할 수 있도록 설계**되었습니다. 이 보안 조치는 Android 운영 체제에 의해 **강제**되며, 대부분의 애플리케이션의 보안 요구 사항에 일반적으로 적합합니다. 그러나 개발자는 때때로 `MODE_WORLD_READABLE` 및 `MODE_WORLD_WRITABLE`와 같은 모드를 사용하여 파일이 서로 다른 애플리케이션 간에 **공유**될 수 있도록 합니다. 그러나 이러한 모드는 **다른 애플리케이션**(악의적인 애플리케이션 포함)에서 이러한 파일에 대한 접근을 **제한하지 않습니다**. 1. **정적 분석:** -- `MODE_WORLD_READABLE` 및 `MODE_WORLD_WRITABLE`의 사용이 **면밀히 검토**되어야 합니다. 이러한 모드는 **원치 않거나 무단 접근**에 파일을 노출할 수 있습니다. +- `MODE_WORLD_READABLE` 및 `MODE_WORLD_WRITABLE`의 사용이 **신중하게 검토**되어야 합니다. 이러한 모드는 **원치 않거나 무단 접근**을 **노출할 수 있습니다**. 2. **동적 분석:** -- 앱에서 생성된 파일에 설정된 **권한**을 **확인**합니다. 특히, 파일이 **전 세계적으로 읽거나 쓸 수 있도록 설정되어 있는지** 확인합니다. 이는 **어떤 애플리케이션**이든 장치에 설치된 경우, 출처나 의도에 관계없이 이러한 파일을 **읽거나 수정**할 수 있게 하여 상당한 보안 위험을 초래할 수 있습니다. +- 앱에서 생성된 파일에 설정된 **권한**을 **확인**하세요. 특히, 파일이 **전 세계적으로 읽거나 쓸 수 있도록 설정되어 있는지** 확인하세요. 이는 **어떤 애플리케이션**이든 장치에 설치된 애플리케이션이 이 파일을 **읽거나 수정**할 수 있게 하여 상당한 보안 위험을 초래할 수 있습니다. **외부 저장소** @@ -129,14 +129,14 @@ Android에서 **내부** 저장소에 **저장된** 파일은 **생성한 앱** - 접근이 용이하므로 **민감한 정보를 외부 저장소에 저장하지 않는 것이 좋습니다**. - 외부 저장소는 제거되거나 모든 애플리케이션에 의해 접근될 수 있어 보안성이 떨어집니다. 3. **외부 저장소에서 데이터 처리**: -- 외부 저장소에서 검색한 데이터에 대해 항상 **입력 유효성 검사를 수행**합니다. 이는 데이터가 신뢰할 수 없는 출처에서 온 것이기 때문에 중요합니다. +- 외부 저장소에서 검색한 데이터에 대해 항상 **입력 유효성 검사를 수행**하세요. 이는 데이터가 신뢰할 수 없는 출처에서 온 것이기 때문에 중요합니다. - 외부 저장소에 실행 파일이나 클래스 파일을 저장하여 동적으로 로드하는 것은 강력히 권장되지 않습니다. -- 애플리케이션이 외부 저장소에서 실행 파일을 검색해야 하는 경우, 이러한 파일이 **서명되고 암호학적으로 검증**된 후 동적으로 로드되도록 해야 합니다. 이 단계는 애플리케이션의 보안 무결성을 유지하는 데 중요합니다. +- 애플리케이션이 외부 저장소에서 실행 파일을 검색해야 하는 경우, 이러한 파일이 **서명되고 암호학적으로 검증**되었는지 확인한 후 동적으로 로드해야 합니다. 이 단계는 애플리케이션의 보안 무결성을 유지하는 데 중요합니다. -외부 저장소는 `/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 카드에는 **앱 전용 디렉토리로의 접근을 제한하는 디렉토리 구조**가 있습니다. 이는 악의적인 애플리케이션이 다른 앱의 파일에 대한 읽기 또는 쓰기 접근을 얻는 것을 방지합니다. **명확한 텍스트로 저장된 민감한 데이터** @@ -162,11 +162,11 @@ A good way to test this is to try to capture the traffic using some proxy like B **Use of Insecure and/or Deprecated Algorithms** -개발자는 **deprecated algorithms**를 사용하여 **checks**를 수행하거나 **store** 또는 **send** 데이터를 전송해서는 안 됩니다. 이러한 알고리즘에는 RC4, MD4, MD5, SHA1 등이 포함됩니다. 예를 들어 **hashes**를 사용하여 비밀번호를 저장하는 경우, salt와 함께 brute-force **resistant** 해시를 사용해야 합니다. +개발자는 **권장되지 않는 알고리즘**을 사용하여 **검증**을 수행하거나 **데이터를 저장**하거나 **전송**해서는 안 됩니다. 이러한 알고리즘에는 RC4, MD4, MD5, SHA1 등이 포함됩니다. 예를 들어 **해시**를 사용하여 비밀번호를 저장하는 경우, 소금을 사용하여 해시 브루트 포스에 **저항**할 수 있어야 합니다. ### Other checks -- 공격자가 리버스 엔지니어링 작업을 어렵게 하기 위해 **APK를 난독화**하는 것이 좋습니다. +- **APK를 난독화**하여 공격자가 리버스 엔지니어링 작업을 어렵게 만드는 것이 좋습니다. - 앱이 민감한 경우(예: 은행 앱) **모바일이 루팅되었는지 확인하는 자체 검사를 수행**하고 그에 따라 행동해야 합니다. - 앱이 민감한 경우(예: 은행 앱) **에뮬레이터**가 사용되고 있는지 확인해야 합니다. - 앱이 민감한 경우(예: 은행 앱) **실행하기 전에 자체 무결성을 확인**하여 수정되었는지 확인해야 합니다. @@ -279,7 +279,7 @@ You need to activate the **debugging** options and it will be cool if you can ** **Logging** -개발자는 **debugging information**을 공개적으로 노출하는 것에 주의해야 하며, 이는 민감한 데이터 유출로 이어질 수 있습니다. 애플리케이션 로그를 모니터링하여 민감한 정보를 식별하고 보호하기 위해 [**pidcat**](https://github.com/JakeWharton/pidcat) 및 `adb logcat` 도구를 사용하는 것이 좋습니다. **Pidcat**은 사용 용이성과 가독성 때문에 선호됩니다. +개발자는 **디버깅 정보**를 공개적으로 노출하는 것에 주의해야 하며, 이는 민감한 데이터 유출로 이어질 수 있습니다. 애플리케이션 로그를 모니터링하여 민감한 정보를 식별하고 보호하기 위해 [**pidcat**](https://github.com/JakeWharton/pidcat) 및 `adb logcat` 도구를 권장합니다. **Pidcat**은 사용 용이성과 가독성 때문에 선호됩니다. > [!WARNING] > **Android 4.0** 이후 버전에서는 **응용 프로그램이 자신의 로그에만 접근할 수 있습니다**. 따라서 응용 프로그램은 다른 앱의 로그에 접근할 수 없습니다.\ @@ -291,40 +291,40 @@ Android의 **클립보드 기반** 프레임워크는 앱에서 복사-붙여넣 **Crash Logs** -애플리케이션이 **crash**하고 **logs**를 저장하는 경우, 이러한 로그는 공격자에게 도움이 될 수 있으며, 특히 애플리케이션을 리버스 엔지니어링할 수 없는 경우 더욱 그렇습니다. 이 위험을 완화하기 위해, 크래시 시 로그를 남기지 않도록 하고, 로그를 네트워크를 통해 전송해야 하는 경우 SSL 채널을 통해 전송되도록 해야 합니다. +애플리케이션이 **충돌**하고 **로그를 저장**하는 경우, 이러한 로그는 공격자에게 도움이 될 수 있으며, 특히 애플리케이션을 리버스 엔지니어링할 수 없는 경우 더욱 그렇습니다. 이 위험을 완화하기 위해 충돌 시 로그를 남기지 않도록 하고, 로그를 네트워크를 통해 전송해야 하는 경우 SSL 채널을 통해 전송되도록 해야 합니다. 펜테스터로서, **이 로그를 살펴보는 것을 시도해 보세요**. **Analytics Data Sent To 3rd Parties** -애플리케이션은 종종 Google Adsense와 같은 서비스를 통합하여 개발자의 부적절한 구현으로 인해 민감한 데이터가 **유출될 수 있습니다**. 잠재적인 데이터 유출을 식별하기 위해, **애플리케이션의 트래픽을 가로채고** 제3자 서비스에 전송되는 민감한 정보가 있는지 확인하는 것이 좋습니다. +애플리케이션은 종종 Google Adsense와 같은 서비스를 통합하여 개발자의 부적절한 구현으로 인해 민감한 데이터가 **유출될 수 있습니다**. 잠재적인 데이터 유출을 식별하기 위해 **애플리케이션의 트래픽을 가로채고** 제3자 서비스에 전송되는 민감한 정보가 있는지 확인하는 것이 좋습니다. ### SQLite DBs -대부분의 애플리케이션은 정보를 저장하기 위해 **내부 SQLite 데이터베이스**를 사용합니다. 펜테스트 중에 생성된 **데이터베이스**, **테이블** 및 **열**의 이름과 저장된 모든 **데이터**를 살펴보아야 합니다. 왜냐하면 **민감한 정보**(취약점이 될 수 있음)를 찾을 수 있기 때문입니다.\ +대부분의 애플리케이션은 정보를 저장하기 위해 **내부 SQLite 데이터베이스**를 사용합니다. 펜테스트 중에 생성된 **데이터베이스**, **테이블** 및 **열**의 이름과 저장된 모든 **데이터**를 살펴보아야 하며, 여기서 **민감한 정보**를 발견할 수 있습니다(이는 취약점이 될 수 있습니다).\ 데이터베이스는 `/data/data/the.package.name/databases`에 위치해야 하며, 예를 들어 `/data/data/com.mwr.example.sieve/databases`와 같습니다. -데이터베이스가 기밀 정보를 저장하고 **암호화**되어 있지만 애플리케이션 내에서 **비밀번호**를 찾을 수 있다면 여전히 **취약점**입니다. +데이터베이스가 기밀 정보를 저장하고 **암호화**되어 있지만 애플리케이션 내에서 **비밀번호**를 **찾을 수 있다면** 여전히 **취약점**입니다. `.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**하는 데 유용한 도구입니다. +Drozer는 **내보낸 활동, 내보낸 서비스 및 콘텐츠 제공자**를 **악용**하는 데 유용한 도구입니다. ### Exploiting exported Activities [**Read this if you want to refresh what is an Android Activity.**](android-applications-basics.md#launcher-activity-and-other-activities)\ -또한 액티비티의 코드는 **`onCreate`** 메서드에서 시작된다는 것을 기억하세요. +또한 활동의 코드는 **`onCreate`** 메서드에서 시작된다는 것을 기억하세요. **Authorisation bypass** -액티비티가 export되면 외부 앱에서 해당 화면을 호출할 수 있습니다. 따라서 **민감한 정보**가 **exported**된 액티비티가 있는 경우 **인증** 메커니즘을 **우회**하여 접근할 수 있습니다. +활동이 내보내지면 외부 앱에서 해당 화면을 호출할 수 있습니다. 따라서 **민감한 정보**가 **내보내진** 활동이 있는 경우 **인증** 메커니즘을 **우회**하여 접근할 수 있습니다. [**Learn how to exploit exported activities with Drozer.**](drozer-tutorial/index.html#activities) -adb에서 export된 액티비티를 시작할 수도 있습니다: +adb에서 내보낸 활동을 시작할 수도 있습니다: - PackageName은 com.example.demo입니다. - Exported ActivityName은 com.example.test.MainActivity입니다. @@ -334,7 +334,7 @@ adb shell am start -n com.example.demo/com.example.test.MainActivity **NOTE**: MobSF는 활동에서 `android:launchMode`로 _**singleTask/singleInstance**_를 사용할 경우 악성으로 감지하지만, [이것](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750) 때문에, 이는 구버전(API 버전 < 21)에서만 위험한 것으로 보입니다. > [!TIP] -> 권한 우회가 항상 취약점은 아니라는 점에 유의해야 하며, 이는 우회가 어떻게 작동하는지와 어떤 정보가 노출되는지에 따라 다릅니다. +> 권한 우회가 항상 취약점이 되는 것은 아니며, 이는 우회가 어떻게 작동하는지와 어떤 정보가 노출되는지에 따라 다릅니다. **민감한 정보 유출** @@ -342,39 +342,39 @@ adb shell am start -n com.example.demo/com.example.test.MainActivity #### Tapjacking -Tapjacking이 방지되지 않으면, 내보내기된 활동을 악용하여 **사용자가 예상치 못한 행동을 하도록 만들 수 있습니다**. [**Tapjacking이 무엇인지에 대한 더 많은 정보는 링크를 따라가세요**](#tapjacking). +Tapjacking이 방지되지 않으면, 내보내기된 활동을 악용하여 **사용자가 예상치 못한 행동을 하도록 만들 수 있습니다**. [**Tapjacking이 무엇인지에 대한 더 많은 정보는 링크를 따르세요**](#tapjacking). ### 콘텐츠 제공자 악용 - 민감한 정보 접근 및 조작 -[**콘텐츠 제공자가 무엇인지 새롭게 알고 싶다면 이 내용을 읽어보세요.**](android-applications-basics.md#content-provider)\ +[**콘텐츠 제공자가 무엇인지 새롭게 알고 싶다면 이걸 읽어보세요.**](android-applications-basics.md#content-provider)\ 콘텐츠 제공자는 기본적으로 **데이터를 공유하는** 데 사용됩니다. 앱에 사용 가능한 콘텐츠 제공자가 있다면, 그로부터 **민감한** 데이터를 **추출**할 수 있을지도 모릅니다. 또한 **SQL 인젝션** 및 **경로 탐색**을 테스트하는 것도 흥미롭습니다. 이들은 취약할 수 있습니다. [**Drozer로 콘텐츠 제공자를 악용하는 방법을 배우세요.**](drozer-tutorial/index.html#content-providers) ### **서비스 악용** -[**서비스가 무엇인지 새롭게 알고 싶다면 이 내용을 읽어보세요.**](android-applications-basics.md#services)\ -서비스의 동작은 `onStartCommand` 메서드에서 시작된다는 점을 기억하세요. +[**서비스가 무엇인지 새롭게 알고 싶다면 이걸 읽어보세요.**](android-applications-basics.md#services)\ +서비스의 동작은 `onStartCommand` 메서드에서 시작된다는 것을 기억하세요. -서비스는 기본적으로 **데이터를 수신하고**, **처리**하며 **응답**(또는 하지 않을 수 있음)을 **반환**할 수 있는 것입니다. 따라서 애플리케이션이 일부 서비스를 내보내고 있다면, **코드**를 **확인**하여 그것이 무엇을 하는지 이해하고, **민감한 정보를 추출하기 위해 동적으로** **테스트**해야 합니다, 인증 수단을 우회하는 등의 작업을 위해...\ +서비스는 기본적으로 **데이터를 수신하고**, **처리**하며 **응답**(또는 하지 않을 수 있음)을 **반환**할 수 있는 것입니다. 따라서 애플리케이션이 일부 서비스를 내보내고 있다면, **코드를 확인**하여 그것이 무엇을 하는지 이해하고 **민감한 정보를 추출하기 위해 동적으로 테스트**해야 합니다, 인증 수단을 우회하는 등의 작업을 위해...\ [**Drozer로 서비스를 악용하는 방법을 배우세요.**](drozer-tutorial/index.html#services) ### **브로드캐스트 수신기 악용** -[**브로드캐스트 수신기가 무엇인지 새롭게 알고 싶다면 이 내용을 읽어보세요.**](android-applications-basics.md#broadcast-receivers)\ -브로드캐스트 수신기의 동작은 `onReceive` 메서드에서 시작된다는 점을 기억하세요. +[**브로드캐스트 수신기가 무엇인지 새롭게 알고 싶다면 이걸 읽어보세요.**](android-applications-basics.md#broadcast-receivers)\ +브로드캐스트 수신기의 동작은 `onReceive` 메서드에서 시작된다는 것을 기억하세요. 브로드캐스트 수신기는 특정 유형의 메시지를 기다리고 있습니다. 수신기가 메시지를 처리하는 방식에 따라 취약할 수 있습니다.\ [**Drozer로 브로드캐스트 수신기를 악용하는 방법을 배우세요.**](#exploiting-broadcast-receivers) ### **스킴 / 딥 링크 악용** -MobSF와 같은 도구나 [이 스크립트](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py)와 같은 스크립트를 사용하여 딥 링크를 수동으로 찾을 수 있습니다.\ +MobSF와 같은 도구나 [이 스크립트](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py)를 사용하여 딥 링크를 수동으로 찾을 수 있습니다.\ **adb** 또는 **브라우저**를 사용하여 선언된 **스킴**을 **열 수 있습니다**: ```bash adb shell am start -a android.intent.action.VIEW -d "scheme://hostname/path?param=value" [your.package.name] ``` -_패키지 이름을 **생략할 수** 있으며, 모바일은 해당 링크를 열어야 하는 앱을 자동으로 호출합니다._ +_패키지 이름을 **생략할 수** 있으며, 모바일은 자동으로 해당 링크를 열어야 하는 앱을 호출합니다._ ```html Click me @@ -402,7 +402,7 @@ _패키지 이름을 **생략할 수** 있으며, 모바일은 해당 링크를 ### 전송 계층 검사 및 검증 실패 -- **인증서는 Android 애플리케이션에서 항상 제대로 검사되지 않습니다.** 이러한 애플리케이션이 경고를 무시하고 자체 서명된 인증서를 수락하거나, 경우에 따라 HTTP 연결로 되돌아가는 것이 일반적입니다. +- **인증서는 Android 애플리케이션에서 항상 제대로 검사되지 않습니다.** 이러한 애플리케이션이 경고를 무시하고 자체 서명된 인증서를 수락하거나, 경우에 따라 HTTP 연결로 되돌아가는 경우가 흔합니다. - **SSL/TLS 핸드셰이크 중 협상이 때때로 약합니다.** 안전하지 않은 암호 모음을 사용하는 경우가 있습니다. 이 취약점은 연결을 중간자(MITM) 공격에 취약하게 만들어 공격자가 데이터를 복호화할 수 있게 합니다. - **민감한 정보 유출**은 애플리케이션이 안전한 채널을 사용하여 인증하지만 다른 거래에 대해 비안전한 채널을 통해 통신할 때 위험이 있습니다. 이 접근 방식은 세션 쿠키나 사용자 세부정보와 같은 민감한 데이터를 악의적인 엔티티의 가로채기로부터 보호하지 못합니다. @@ -420,7 +420,7 @@ HTTP 트래픽을 검사하려면 **프록시 도구의 인증서를 설치해 **API Level 24 이상**을 대상으로 하는 애플리케이션은 프록시의 CA 인증서를 수락하도록 네트워크 보안 구성을 수정해야 합니다. 이 단계는 암호화된 트래픽을 검사하는 데 중요합니다. 네트워크 보안 구성을 수정하는 방법에 대한 지침은 [**이 튜토리얼**](make-apk-accept-ca-certificate.md)을 참조하세요. -**Flutter**를 사용하는 경우 [**이 페이지**](flutter.md)의 지침을 따라야 합니다. 이는 인증서를 저장소에 추가하는 것만으로는 작동하지 않기 때문입니다. Flutter는 자체 유효한 CA 목록을 가지고 있습니다. +**Flutter**를 사용하는 경우 [**이 페이지**](flutter.md)의 지침을 따라야 합니다. Flutter는 자체 유효한 CA 목록을 가지고 있기 때문에 인증서를 저장소에 추가하는 것만으로는 작동하지 않습니다. #### SSL 핀닝 우회 @@ -448,11 +448,17 @@ Android 애플리케이션을 펜테스트하려면 Frida를 사용하는 방법 - 여기에서 멋진 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를 로드하여 안티 디버깅 / 안티 Frida 메커니즘을 우회해 보세요(도구 [linjector](https://github.com/erfur/linjector-rs)). +#### 안티 계측 및 SSL 핀닝 우회 워크플로우 + +{{#ref}} +android-anti-instrumentation-and-ssl-pinning-bypass.md +{{#endref}} + ### **메모리 덤프 - Fridump** -애플리케이션이 비밀번호나 암기구문과 같은 민감한 정보를 메모리에 저장하고 있지 않은지 확인하세요. +애플리케이션이 비밀번호나 암기구와 같은 민감한 정보를 메모리에 저장하고 있지 않은지 확인하세요. -[**Fridump3**](https://github.com/rootbsd/fridump3)를 사용하여 앱의 메모리를 덤프할 수 있습니다: +[**Fridump3**](https://github.com/rootbsd/fridump3)를 사용하여 다음과 같이 앱의 메모리를 덤프할 수 있습니다: ```bash # With PID python3 fridump3.py -u @@ -467,7 +473,7 @@ strings * | grep -E "^[a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a ``` ### **Keystore의 민감한 데이터** -Android에서 Keystore는 민감한 데이터를 저장하기에 가장 좋은 장소이지만, 충분한 권한이 있으면 여전히 **접근할 수 있습니다**. 애플리케이션이 여기에서 **명확한 텍스트로 민감한 데이터를 저장하는 경향이 있기 때문에** 루트 사용자로서 또는 장치에 물리적으로 접근할 수 있는 사람이 이 데이터를 훔칠 수 있는지 확인해야 합니다. +Android에서 Keystore는 민감한 데이터를 저장하기에 가장 좋은 장소이지만, 충분한 권한이 있으면 여전히 **접근할 수 있습니다**. 애플리케이션이 여기에서 **명확한 텍스트로 민감한 데이터를 저장하는 경향이 있기 때문에** 펜테스트는 이를 확인해야 하며, 루트 사용자나 장치에 물리적으로 접근할 수 있는 사람이 이 데이터를 훔칠 수 있습니다. 앱이 keystore에 데이터를 저장하더라도, 데이터는 암호화되어야 합니다. @@ -477,13 +483,13 @@ frida -U -f com.example.app -l frida-scripts/tracer-cipher.js ``` ### **지문/생체 인식 우회** -다음 Frida 스크립트를 사용하면 **지문 인증을 우회**할 수 있을 수 있습니다. Android 애플리케이션이 **특정 민감한 영역을 보호하기 위해 수행할 수 있습니다:** +다음 Frida 스크립트를 사용하면 **지문 인증을 우회**할 수 있을 수 있으며, Android 애플리케이션이 **특정 민감한 영역을 보호하기 위해 수행할 수 있습니다:** ```bash frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f ``` ### **배경 이미지** -애플리케이션을 백그라운드에 두면, Android는 **애플리케이션의 스냅샷**을 저장하므로 포그라운드로 복구될 때 앱보다 이미지를 먼저 로드하여 앱이 더 빨리 로드된 것처럼 보입니다. +애플리케이션을 백그라운드에 두면, Android는 **애플리케이션의 스냅샷**을 저장하여 포그라운드로 복구될 때 앱보다 이미지를 먼저 로드하여 앱이 더 빨리 로드된 것처럼 보이게 합니다. 그러나 이 스냅샷에 **민감한 정보**가 포함되어 있다면, 스냅샷에 접근할 수 있는 사람은 **그 정보를 훔칠 수 있습니다** (접근하려면 루트 권한이 필요합니다). @@ -499,7 +505,7 @@ getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE); ### 인텐트 주입 -개발자는 종종 이러한 인텐트를 처리하고 `startActivity(...)` 또는 `sendBroadcast(...)`와 같은 메서드로 전달하는 프록시 구성 요소인 액티비티, 서비스 및 브로드캐스트 수신기를 생성합니다. 이는 위험할 수 있습니다. +개발자는 종종 이러한 인텐트를 처리하고 `startActivity(...)` 또는 `sendBroadcast(...)`와 같은 메서드로 전달하는 프록시 구성 요소인 활동, 서비스 및 브로드캐스트 수신기를 생성합니다. 이는 위험할 수 있습니다. 위험은 공격자가 이러한 인텐트를 잘못 유도하여 비공개 앱 구성 요소를 트리거하거나 민감한 콘텐츠 제공자에 접근할 수 있도록 허용하는 데 있습니다. 주목할 만한 예는 `WebView` 구성 요소가 URL을 `Intent` 객체로 변환하는 `Intent.parseUri(...)`를 통해 이를 실행하여 악의적인 인텐트 주입으로 이어질 수 있는 경우입니다. @@ -536,7 +542,7 @@ docker pull opensecurity/mobile-security-framework-mobsf docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest ``` MobSF는 **Android**(apk)**, IOS**(ipa) **및 Windows**(apx) 애플리케이션을 분석할 수 있습니다 (_Windows 애플리케이션은 Windows 호스트에 설치된 MobSF에서 분석해야 합니다_).\ -또한, **Android** 또는 **IOS** 앱의 소스 코드로 **ZIP** 파일을 생성하면 (애플리케이션의 루트 폴더로 가서 모든 것을 선택하고 ZIP 파일을 생성), 그것도 분석할 수 있습니다. +또한, **Android** 또는 **IOS** 앱의 소스 코드로 **ZIP** 파일을 생성하면 (애플리케이션의 루트 폴더로 이동하여 모든 것을 선택하고 ZIP 파일을 생성), 그것도 분석할 수 있습니다. MobSF는 **diff/Compare** 분석을 허용하고 **VirusTotal**와 통합할 수 있습니다 (API 키를 _MobSF/settings.py_에 설정하고 활성화해야 합니다: `VT_ENABLED = TRUE` `VT_API_KEY = ` `VT_UPLOAD = TRUE`). `VT_UPLOAD`를 `False`로 설정하면 **해시**가 파일 대신 **업로드**됩니다. @@ -545,7 +551,7 @@ MobSF는 **diff/Compare** 분석을 허용하고 **VirusTotal**와 통합할 수 **MobSF**는 **Android**에서 **동적 분석**에 매우 유용할 수 있지만, 이 경우 MobSF와 **genymotion**을 호스트에 설치해야 합니다 (VM이나 Docker는 작동하지 않습니다). _참고: **먼저 genymotion에서 VM을 시작한 후** MobSF를 시작해야 합니다._\ **MobSF 동적 분석기**는 다음을 수행할 수 있습니다: -- **애플리케이션 데이터 덤프** (URL, 로그, 클립보드, 사용자가 만든 스크린샷, "**Exported Activity Tester**"가 만든 스크린샷, 이메일, SQLite 데이터베이스, XML 파일 및 기타 생성된 파일). 이 모든 것은 자동으로 수행되지만 스크린샷은 사용자가 원할 때 눌러야 하며, 모든 내보낸 활동의 스크린샷을 얻으려면 "**Exported Activity Tester**"를 눌러야 합니다. +- **애플리케이션 데이터 덤프** (URL, 로그, 클립보드, 사용자가 만든 스크린샷, "**Exported Activity Tester**"가 만든 스크린샷, 이메일, SQLite 데이터베이스, XML 파일 및 기타 생성된 파일). 이 모든 것은 자동으로 수행되며, 스크린샷은 원할 때 눌러야 하거나 "**Exported Activity Tester**"를 눌러 모든 내보낸 활동의 스크린샷을 얻어야 합니다. - **HTTPS 트래픽 캡처** - **Frida**를 사용하여 **런타임** **정보**를 얻기 @@ -553,7 +559,7 @@ Android **버전 > 5**에서는 **Frida**를 **자동으로 시작**하고 **트 **Frida** -기본적으로 SSL 핀닝, **루트 탐지** 및 **디버거 탐지**를 우회하고 **흥미로운 API**를 모니터링하기 위해 일부 Frida 스크립트를 사용합니다.\ +기본적으로 SSL 핀닝, **루트 탐지** 및 **디버거 탐지**를 **우회**하고 **흥미로운 API**를 **모니터링**하기 위해 일부 Frida 스크립트를 사용합니다.\ MobSF는 또한 **내보낸 활동을 호출**하고, 그 스크린샷을 **캡처**하여 보고서에 **저장**할 수 있습니다. 동적 테스트를 **시작**하려면 초록색 버튼: "**Start Instrumentation**"을 누릅니다. "**Frida Live Logs**"를 눌러 Frida 스크립트에 의해 생성된 로그를 보고, "**Live API Monitor**"를 눌러 후킹된 메서드에 대한 모든 호출, 전달된 인수 및 반환 값을 확인합니다 (이것은 "Start Instrumentation"을 누른 후에 나타납니다).\ @@ -570,7 +576,7 @@ MobSF는 또한 자신의 **Frida 스크립트**를 로드할 수 있습니다 ( - **클래스 패턴 검색**: 패턴으로 클래스를 검색합니다. - **클래스 메서드 추적**: **전체 클래스**를 **추적**합니다 (클래스의 모든 메서드의 입력 및 출력을 확인합니다). 기본적으로 MobSF는 여러 흥미로운 Android API 메서드를 추적합니다. -사용할 보조 모듈을 선택한 후 "**Start Instrumentation**"을 누르면 "**Frida Live Logs**"에서 모든 출력을 볼 수 있습니다. +사용할 보조 모듈을 선택한 후 "**Start Instrumentation**"을 눌러야 하며, 모든 출력은 "**Frida Live Logs**"에서 볼 수 있습니다. **Shell** @@ -585,13 +591,13 @@ receivers ``` **HTTP 도구** -HTTP 트래픽이 캡처되면 "**HTTP(S) Traffic**" 하단에서 캡처된 트래픽의 보기 좋지 않은 형태를 볼 수 있으며, "**Start HTTPTools**" 녹색 버튼에서 더 나은 보기를 볼 수 있습니다. 두 번째 옵션에서 **캡처된 요청**을 Burp 또는 Owasp ZAP과 같은 **프록시**로 **전송**할 수 있습니다.\ +HTTP 트래픽이 캡처되면 "**HTTP(S) Traffic**" 하단에서 캡처된 트래픽의 보기 좋지 않은 형태를 볼 수 있으며, "**Start HTTPTools**" 녹색 버튼에서 더 나은 보기를 볼 수 있습니다. 두 번째 옵션에서 **캡처된 요청**을 **프록시**인 Burp 또는 Owasp ZAP으로 **전송**할 수 있습니다.\ 이를 위해, _Burp 켜기 -->_ _Intercept 끄기 --> MobSB HTTPTools에서 요청 선택_ --> "**Send to Fuzzer**" 버튼을 누르세요 --> _프록시 주소 선택_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080)). MobSF로 동적 분석을 마친 후 "**Start Web API Fuzzer**"를 눌러 **HTTP 요청을 퍼징**하고 취약점을 찾아보세요. > [!TIP] -> MobSF로 동적 분석을 수행한 후 프록시 설정이 잘못 구성될 수 있으며 GUI에서 이를 수정할 수 없습니다. 다음을 수행하여 프록시 설정을 수정할 수 있습니다: +> MobSF로 동적 분석을 수행한 후 프록시 설정이 잘못 구성될 수 있으며 GUI에서 수정할 수 없습니다. 다음을 수행하여 프록시 설정을 수정할 수 있습니다: > > ``` > adb shell settings put global http_proxy :0 @@ -600,11 +606,11 @@ MobSF로 동적 분석을 마친 후 "**Start Web API Fuzzer**"를 눌러 **HTTP ### Inspeckage를 이용한 보조 동적 분석 [**Inspeckage**](https://github.com/ac-pm/Inspeckage)에서 도구를 받을 수 있습니다.\ -이 도구는 **동적 분석**을 수행하는 동안 **애플리케이션에서 무슨 일이 일어나고 있는지** 알리기 위해 몇 가지 **Hooks**를 사용합니다. +이 도구는 **동적 분석**을 수행하는 동안 **애플리케이션에서 무슨 일이 일어나고 있는지** 알리기 위해 몇 가지 **후크**를 사용합니다. ### [Yaazhini](https://www.vegabird.com/yaazhini/) -이것은 **GUI를 사용한 정적 분석을 수행하기 위한 훌륭한 도구입니다.** +이것은 **GUI를 사용한 정적 분석을 수행하기 위한 훌륭한 도구**입니다. ![](<../../images/image (741).png>) @@ -632,7 +638,7 @@ reverse-apk relative/path/to/APP.apk SUPER는 Windows, MacOS X 및 Linux에서 사용할 수 있는 명령줄 애플리케이션으로, _.apk_ 파일을 분석하여 취약점을 찾습니다. 이는 APK를 압축 해제하고 일련의 규칙을 적용하여 이러한 취약점을 감지합니다. -모든 규칙은 `rules.json` 파일에 중심을 두고 있으며, 각 회사나 테스터는 필요에 따라 분석할 규칙을 생성할 수 있습니다. +모든 규칙은 `rules.json` 파일에 중심을 두고 있으며, 각 회사나 테스터는 필요에 따라 분석할 규칙을 만들 수 있습니다. 최신 바이너리는 [download page](https://superanalyzer.rocks/download.html)에서 다운로드하세요. ``` @@ -660,7 +666,7 @@ androbugs.exe -f [APK file] ``` ### [Androwarn](https://github.com/maaaaz/androwarn) -**Androwarn**는 Android 애플리케이션에서 발생할 수 있는 악의적인 행동을 감지하고 사용자에게 경고하는 것을 주요 목표로 하는 도구입니다. +**Androwarn**는 Android 애플리케이션이 개발한 잠재적인 악성 행동을 감지하고 사용자에게 경고하는 것을 주요 목표로 하는 도구입니다. 감지는 애플리케이션의 Dalvik 바이트코드에 대한 **정적 분석**을 통해 수행되며, 이는 **Smali**로 표현됩니다. [`androguard`](https://github.com/androguard/androguard) 라이브러리를 사용합니다. @@ -685,35 +691,35 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3 ### Koodous -악성 소프트웨어를 탐지하는 데 유용합니다: [https://koodous.com/](https://koodous.com) +악성코드를 탐지하는 데 유용합니다: [https://koodous.com/](https://koodous.com) -## 코드 난독화/디오브스큐레이션 +## 코드 오브스큐레이션/디오브스큐레이션 -코드를 난독화하는 데 사용하는 서비스와 구성에 따라 비밀이 난독화될 수도 있고 그렇지 않을 수도 있습니다. +코드를 오브스큐레이션하는 데 사용하는 서비스와 구성에 따라 비밀이 오브스큐레이션될 수도 있고 그렇지 않을 수도 있습니다. ### [ProGuard]() -[위키백과](): **ProGuard**는 Java 코드를 축소, 최적화 및 난독화하는 오픈 소스 명령줄 도구입니다. 바이트코드를 최적화하고 사용되지 않는 명령어를 감지 및 제거할 수 있습니다. ProGuard는 무료 소프트웨어이며 GNU 일반 공용 라이선스 버전 2에 따라 배포됩니다. +[위키백과](): **ProGuard**는 Java 코드를 축소, 최적화 및 오브스큐레이션하는 오픈 소스 명령줄 도구입니다. 바이트코드를 최적화하고 사용되지 않는 명령어를 감지 및 제거할 수 있습니다. ProGuard는 무료 소프트웨어이며 GNU 일반 공용 라이선스 버전 2에 따라 배포됩니다. ProGuard는 Android SDK의 일부로 배포되며 애플리케이션을 릴리스 모드로 빌드할 때 실행됩니다. ### [DexGuard](https://www.guardsquare.com/dexguard) -[https://blog.lexfo.fr/dexguard.html](https://blog.lexfo.fr/dexguard.html)에서 APK를 디오브스큐레이션하는 단계별 가이드를 찾으세요. +APK를 디오브스큐레이션하는 단계별 가이드를 [https://blog.lexfo.fr/dexguard.html](https://blog.lexfo.fr/dexguard.html)에서 찾을 수 있습니다. (그 가이드에서) 마지막으로 확인했을 때, Dexguard의 작동 모드는 다음과 같았습니다: - 리소스를 InputStream으로 로드합니다; - 결과를 FilterInputStream에서 상속받은 클래스에 제공하여 복호화합니다; -- 리버서의 시간을 몇 분 낭비하기 위해 쓸모없는 난독화를 수행합니다; +- 리버서의 시간을 낭비하기 위해 쓸모없는 오브스큐레이션을 수행합니다; - 복호화된 결과를 ZipInputStream에 제공하여 DEX 파일을 가져옵니다; - 마지막으로 `loadDex` 메서드를 사용하여 결과 DEX를 리소스로 로드합니다. ### [DeGuard](http://apk-deguard.com) -**DeGuard는 Android 난독화 도구가 수행한 난독화 프로세스를 역전시킵니다. 이를 통해 코드 검사 및 라이브러리 예측을 포함한 수많은 보안 분석이 가능합니다.** +**DeGuard는 Android 오브스큐레이션 도구가 수행한 오브스큐레이션 프로세스를 역전시킵니다. 이를 통해 코드 검사 및 라이브러리 예측을 포함한 수많은 보안 분석이 가능합니다.** -난독화된 APK를 그들의 플랫폼에 업로드할 수 있습니다. +오브스큐레이션된 APK를 그들의 플랫폼에 업로드할 수 있습니다. ### [Deobfuscate android App](https://github.com/In3tinct/deobfuscate-android-app) @@ -721,21 +727,21 @@ ProGuard는 Android SDK의 일부로 배포되며 애플리케이션을 릴리 ### [Simplify](https://github.com/CalebFenton/simplify) -이는 **일반 Android 디오브스큐레이터**입니다. Simplify는 **앱을 가상 실행**하여 그 동작을 이해하고, **코드를 최적화**하여 동일하게 동작하지만 사람이 이해하기 쉽게 만듭니다. 각 최적화 유형은 간단하고 일반적이므로 사용된 특정 난독화 유형은 중요하지 않습니다. +이는 **일반 Android 디오브스큐레이터**입니다. Simplify는 **앱을 가상 실행**하여 그 동작을 이해하고, **코드를 최적화하려고 시도**하여 동일하게 동작하지만 사람이 이해하기 더 쉽게 만듭니다. 각 최적화 유형은 간단하고 일반적이므로 사용된 특정 오브스큐레이션 유형은 중요하지 않습니다. ### [APKiD](https://github.com/rednaga/APKiD) -APKiD는 **APK가 어떻게 만들어졌는지**에 대한 정보를 제공합니다. 많은 **컴파일러**, **패커**, **난독화 도구** 및 기타 이상한 것들을 식별합니다. Android용 [_PEiD_](https://www.aldeid.com/wiki/PEiD)입니다. +APKiD는 **APK가 어떻게 만들어졌는지**에 대한 정보를 제공합니다. 많은 **컴파일러**, **패커**, **오브스큐레이터** 및 기타 이상한 것들을 식별합니다. Android용 [_PEiD_](https://www.aldeid.com/wiki/PEiD)입니다. ### Manual -[사용자 정의 난독화를 리버스하는 방법에 대한 몇 가지 요령을 배우려면 이 튜토리얼을 읽으세요](manual-deobfuscation.md) +[사용자 정의 오브스큐레이션을 리버스하는 방법에 대한 몇 가지 요령을 배우려면 이 튜토리얼을 읽으세요](manual-deobfuscation.md) ## Labs ### [Androl4b](https://github.com/sh4hin/Androl4b) -AndroL4b는 Ubuntu-mate를 기반으로 한 Android 보안 가상 머신으로, 리버스 엔지니어링 및 악성 소프트웨어 분석을 위한 다양한 보안 전문가와 연구자들의 최신 프레임워크, 튜토리얼 및 실습을 포함합니다. +AndroL4b는 우분투-메이트를 기반으로 한 Android 보안 가상 머신으로, 리버스 엔지니어링 및 악성코드 분석을 위한 다양한 보안 전문가와 연구자들의 최신 프레임워크, 튜토리얼 및 실험실을 포함합니다. ## References 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 new file mode 100644 index 000000000..39a4a94d4 --- /dev/null +++ b/src/mobile-pentesting/android-app-pentesting/android-anti-instrumentation-and-ssl-pinning-bypass.md @@ -0,0 +1,203 @@ +# Android Anti-Instrumentation & SSL Pinning Bypass (Frida/Objection) + +{{#include ../../banners/hacktricks-training.md}} + +이 페이지는 Android 앱이 감지/루트 차단 기법을 탐지하거나 TLS 핀닝을 시행할 때 동적 분석을 재개하기 위한 실용적인 워크플로를 제공합니다. 빠른 분류, 일반적인 탐지 및 가능한 경우 재포장 없이 우회할 수 있는 복사-붙여넣기 가능한 훅/전술에 중점을 둡니다. + +## Detection Surface (앱이 확인하는 것) + +- 루트 확인: su 바이너리, Magisk 경로, getprop 값, 일반적인 루트 패키지 +- Frida/디버거 확인 (Java): Debug.isDebuggerConnected(), ActivityManager.getRunningAppProcesses(), getRunningServices(), /proc 스캔, classpath, 로드된 라이브러리 +- 네이티브 안티-디버그: ptrace(), 시스템 호출, anti-attach, 중단점, 인라인 훅 +- 초기화 확인: Application.onCreate() 또는 기기가 존재할 경우 충돌하는 프로세스 시작 훅 +- TLS 핀닝: 사용자 정의 TrustManager/HostnameVerifier, OkHttp CertificatePinner, Conscrypt 핀닝, 네이티브 핀 + +## Step 1 — 빠른 승리: Magisk DenyList로 루트 숨기기 + +- Magisk에서 Zygisk 활성화 +- DenyList 활성화, 대상 패키지 추가 +- 재부팅 및 재테스트 + +많은 앱은 명백한 지표(su/Magisk 경로/getprop)만 확인합니다. DenyList는 종종 단순한 확인을 무력화합니다. + +References: +- Magisk (Zygisk & DenyList): https://github.com/topjohnwu/Magisk + +## Step 2 — 30초 Frida Codeshare 테스트 + +깊이 파고들기 전에 일반적인 드롭인 스크립트를 시도해 보세요: + +- anti-root-bypass.js +- anti-frida-detection.js +- hide_frida_gum.js + +예: +```bash +frida -U -f com.example.app -l anti-frida-detection.js +``` +이들은 일반적으로 Java 루트/디버그 검사, 프로세스/서비스 스캔 및 네이티브 ptrace()를 스텁합니다. 보호가 약한 앱에서 유용하며, 강화된 타겟은 맞춤형 후크가 필요할 수 있습니다. + +- Codeshare: https://codeshare.frida.re/ + +## Step 3 — 초기 탐지기를 늦게 연결하여 우회하기 + +많은 탐지는 프로세스 생성/onCreate() 중에만 실행됩니다. 생성 시 주입(-f) 또는 가젯이 포착되며, UI 로드 후에 연결하면 우회할 수 있습니다. +```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 +``` +이 작업이 성공하면 세션을 안정적으로 유지하고 매핑 및 스텁 검사를 진행합니다. + +## 4단계 — Jadx를 통한 탐지 로직 매핑 및 문자열 탐색 + +Jadx의 정적 분류 키워드: +- "frida", "gum", "root", "magisk", "ptrace", "su", "getprop", "debugger" + +일반적인 Java 패턴: +```java +public boolean isFridaDetected() { +return getRunningServices().contains("frida"); +} +``` +Common APIs to review/hook: +- android.os.Debug.isDebuggerConnected +- android.app.ActivityManager.getRunningAppProcesses / getRunningServices +- java.lang.System.loadLibrary / System.load (native bridge) +- java.lang.Runtime.exec / ProcessBuilder (probing commands) +- android.os.SystemProperties.get (root/emulator heuristics) + +## Step 5 — Runtime stubbing with Frida (Java) + +커스텀 가드를 재포장 없이 안전한 값을 반환하도록 오버라이드: +```js +Java.perform(() => { +const Checks = Java.use('com.example.security.Checks'); +Checks.isFridaDetected.implementation = function () { return false; }; + +// Neutralize debugger checks +const Debug = Java.use('android.os.Debug'); +Debug.isDebuggerConnected.implementation = function () { return false; }; + +// Example: kill ActivityManager scans +const AM = Java.use('android.app.ActivityManager'); +AM.getRunningAppProcesses.implementation = function () { return java.util.Collections.emptyList(); }; +}); +``` +조기 크래시를 분류하나요? 죽기 직전에 클래스 덤프를 생성하여 감지 가능성이 높은 네임스페이스를 찾아보세요: +```js +Java.perform(() => { +Java.enumerateLoadedClasses({ +onMatch: n => console.log(n), +onComplete: () => console.log('Done') +}); +}); +``` +의심스러운 메서드를 기록하고 중립화하여 실행 흐름을 확인합니다: +```js +Java.perform(() => { +const Det = Java.use('com.example.security.DetectionManager'); +Det.checkFrida.implementation = function () { +console.log('checkFrida() called'); +return false; +}; +}); +``` +## Step 6 — Java 훅이 실패할 때 JNI/네이티브 경로를 따라가세요 + +JNI 진입점을 추적하여 네이티브 로더와 탐지 초기화를 찾습니다: +```bash +frida-trace -n com.example.app -i "JNI_OnLoad" +``` +번들된 .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' +``` +인터랙티브/네이티브 리버싱: +- Ghidra: https://ghidra-sre.org/ +- r2frida: https://github.com/nowsecure/r2frida + +예시: libc에서 간단한 안티 디버그를 무력화하기 위해 ptrace를 중립화: +```js +const ptrace = Module.findExportByName(null, 'ptrace'); +if (ptrace) { +Interceptor.replace(ptrace, new NativeCallback(function () { +return -1; // pretend failure +}, 'int', ['int', 'int', 'pointer', 'pointer'])); +} +``` +See also: {{#ref}} +reversing-native-libraries.md +{{#endref}} + +## Step 7 — Objection patching (embed gadget / strip basics) + +런타임 훅보다 리패킹을 선호할 때, 시도해 보세요: +```bash +objection patchapk --source app.apk +``` +노트: +- apktool이 필요합니다; 빌드 문제를 피하기 위해 공식 가이드에서 최신 버전을 확인하세요: https://apktool.org/docs/install +- Gadget injection은 루트 없이도 instrumentation을 가능하게 하지만, 더 강력한 init‑time 체크에 의해 여전히 감지될 수 있습니다. + +참조: +- Objection: https://github.com/sensepost/objection + +## 8단계 — 대체: 네트워크 가시성을 위한 TLS pinning 패치 + +instrumentation이 차단된 경우, pinning을 정적으로 제거하여 여전히 트래픽을 검사할 수 있습니다: +```bash +apk-mitm app.apk +# Then install the patched APK and proxy via Burp/mitmproxy +``` +- 도구: https://github.com/shroudedcode/apk-mitm +- 네트워크 구성 CA‑trust 트릭(및 Android 7+ 사용자 CA 신뢰)에 대한 내용은 다음을 참조하세요: +{{#ref}} +make-apk-accept-ca-certificate.md +{{#endref}} +{{#ref}} +install-burp-certificate.md +{{#endref}} + +## 유용한 명령어 치트 시트 +```bash +# List processes and attach +frida-ps -Uai +frida -U -n com.example.app + +# Spawn with a script (may trigger detectors) +frida -U -f com.example.app -l anti-frida-detection.js + +# Trace native init +frida-trace -n com.example.app -i "JNI_OnLoad" + +# Objection runtime +objection --gadget com.example.app explore + +# Static TLS pinning removal +apk-mitm app.apk +``` +## Tips & caveats + +- 앱이 시작할 때 충돌할 경우, 생성하는 것보다 늦게 연결하는 것을 선호하세요. +- 일부 탐지는 중요한 흐름(예: 결제, 인증)에서 다시 실행됩니다 — 탐색 중에 후크를 활성 상태로 유지하세요. +- 정적 및 동적 혼합: Jadx에서 문자열 검색하여 클래스를 선별한 후, 런타임에 검증하기 위해 메서드를 후킹하세요. +- 강화된 앱은 패커와 네이티브 TLS 핀닝을 사용할 수 있습니다 — 네이티브 코드를 리버스 엔지니어링할 것으로 예상하세요. + +## References + +- [Reversing Android Apps: Bypassing Detection Like a Pro](https://www.kayssel.com/newsletter/issue-12/) +- [Frida Codeshare](https://codeshare.frida.re/) +- [Objection](https://github.com/sensepost/objection) +- [apk-mitm](https://github.com/shroudedcode/apk-mitm) +- [Jadx](https://github.com/skylot/jadx) +- [Ghidra](https://ghidra-sre.org/) +- [r2frida](https://github.com/nowsecure/r2frida) +- [Apktool install guide](https://apktool.org/docs/install) +- [Magisk](https://github.com/topjohnwu/Magisk) + +{{#include ../../banners/hacktricks-training.md}}