mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-22 20:53:37 +00:00
819 lines
60 KiB
Markdown
819 lines
60 KiB
Markdown
# 안드로이드 애플리케이션 펜테스팅
|
|
|
|
<details>
|
|
|
|
<summary><strong>htARTE (HackTricks AWS Red Team Expert)를 통해 제로부터 영웅이 될 때까지 AWS 해킹을 배우세요</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
|
|
|
HackTricks를 지원하는 다른 방법:
|
|
|
|
* **회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드하길 원한다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
|
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
|
|
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
|
|
* **다음에 참여하세요** 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass) 또는 **트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를** 팔로우하세요.
|
|
* **해킹 트릭을 공유하세요.** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출함으로써
|
|
|
|
</details>
|
|
|
|
<figure><img src="../../.gitbook/assets/image (380).png" alt=""><figcaption></figcaption></figure>
|
|
|
|
경험 많은 해커 및 버그 바운티 헌터들과 소통하려면 [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) 서버에 가입하세요!
|
|
|
|
**해킹 통찰력**\
|
|
해킹의 스릴과 도전에 대해 파고드는 콘텐츠와 상호 작용하세요
|
|
|
|
**실시간 해킹 뉴스**\
|
|
빠르게 변화하는 해킹 세계의 실시간 뉴스와 통찰력을 유지하세요
|
|
|
|
**최신 공지**\
|
|
출시되는 최신 버그 바운티 및 중요한 플랫폼 업데이트에 대해 알아두세요
|
|
|
|
**우리와 함께** [**Discord**](https://discord.com/invite/N3FrSbmwdy)에 참여하여 오늘 최고의 해커들과 협업을 시작하세요!
|
|
|
|
## 안드로이드 애플리케이션 기초
|
|
|
|
**안드로이드 보안과 안드로이드 애플리케이션의 가장 위험한 구성 요소에 관한 가장 중요한 부분을 알아보기 위해** 이 페이지를 읽기를 강력히 권장합니다:
|
|
|
|
{% content-ref url="android-applications-basics.md" %}
|
|
[android-applications-basics.md](android-applications-basics.md)
|
|
{% endcontent-ref %}
|
|
|
|
## ADB (Android Debug Bridge)
|
|
|
|
이것은 안드로이드 장치(에뮬레이션 또는 물리적)에 연결하는 데 필요한 주요 도구입니다.\
|
|
**ADB**는 컴퓨터에서 장치를 **USB** 또는 **네트워크**를 통해 제어할 수 있습니다. 이 유틸리티는 파일을 **양방향으로 복사**, 앱을 **설치** 및 **제거**, 셸 명령을 **실행**, 데이터를 **백업**, 로그를 **읽기** 등의 기능을 가능하게 합니다.
|
|
|
|
ADB를 사용하는 방법을 배우기 위해 [**ADB Commands**](adb-commands.md) 목록을 확인하세요.
|
|
|
|
## Smali
|
|
|
|
가끔은 **애플리케이션 코드를 수정**하여 **숨겨진 정보**(아마도 잘 난독화된 비밀번호 또는 플래그)에 액세스하는 것이 흥미로울 수 있습니다. 그런 다음 apk를 디컴파일하여 코드를 수정하고 다시 컴파일하는 것이 흥미로울 수 있습니다.\
|
|
[**이 튜토리얼**에서는 **APK를 디컴파일하고, Smali 코드를 수정하고 새 기능이 추가된 APK를 다시 컴파일하는 방법**을 배울 수 있습니다](smali-changes.md). 이것은 **동적 분석 중에 여러 테스트를 위한 대안으로 매우 유용**할 수 있습니다. 그러므로 **언제나 이 가능성을 염두**에 두세요.
|
|
|
|
## 다른 흥미로운 트릭
|
|
|
|
* [Play Store에서 위치 위조하기](spoofing-your-location-in-play-store.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 추출:
|
|
```bash
|
|
adb shell pm list packages
|
|
com.android.insecurebankv2
|
|
|
|
adb shell pm path com.android.insecurebankv2
|
|
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
|
|
```
|
|
* [APKEditor](https://github.com/REAndroid/APKEditor)를 사용하여 모든 분할된 APK 및 기본 APK를 병합하세요:
|
|
```bash
|
|
mkdir splits
|
|
adb shell pm path com.android.insecurebankv2 | cut -d ':' -f 1 | xargs -n1 -i adb pull {} splits
|
|
java -jar ../APKEditor.jar m -i splits/ -o merged.apk
|
|
|
|
# after merging, you will need to align and sign the apk, personally, I like to use the uberapksigner
|
|
java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed
|
|
```
|
|
## 정적 분석
|
|
|
|
우선, APK를 분석하기 위해 **디컴파일러를 사용하여 Java 코드를 살펴봐야**합니다.\
|
|
[**여기를 읽어서 다양한 사용 가능한 디컴파일러에 대한 정보를 찾으세요**](apk-decompilers.md).
|
|
|
|
### 흥미로운 정보 찾기
|
|
|
|
APK의 **문자열**을 살펴보기만 해도 **비밀번호**, **URL**, **API** 키, **암호화**, **블루투스 UUID**, **토큰** 및 흥미로운 모든 것을 검색할 수 있습니다... 코드 실행 **백도어**나 인증 백도어(앱에 하드코딩된 관리자 자격 증명)를 찾아보세요.
|
|
|
|
**Firebase**
|
|
|
|
**Firebase URL**에 특별히 주의를 기울이고 잘못 구성되었는지 확인하세요. [Firebase가 무엇이며 어떻게 악용할 수 있는지에 대한 자세한 정보는 여기에서 확인하세요.](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md)
|
|
|
|
### 애플리케이션의 기본 이해 - Manifest.xml, strings.xml
|
|
|
|
애플리케이션의 **_Manifest.xml_** 및 **_strings.xml_** 파일을 조사하면 잠재적인 보안 취약점을 발견할 수 있습니다. 이러한 파일은 디컴파일러를 사용하거나 APK 파일 확장자를 .zip으로 변경한 다음 압축 해제하여 액세스할 수 있습니다.
|
|
|
|
**Manifest.xml**에서 식별된 **취약점**은 다음과 같습니다:
|
|
|
|
* **디버깅 가능한 애플리케이션**: _Manifest.xml_ 파일에서 디버깅 가능으로 설정된 애플리케이션(`debuggable="true"`)은 연결을 허용하여 악용으로 이어질 수 있으므로 위험합니다. 디버깅 가능한 애플리케이션을 악용하는 방법에 대한 자세한 내용은 기기에서 디버깅 가능한 애플리케이션을 찾고 악용하는 튜토리얼을 참조하세요.
|
|
* **백업 설정**: 민감한 정보를 다루는 애플리케이션의 경우 `android:allowBackup="false"` 속성을 명시적으로 설정하여 adb를 통한 무단 데이터 백업을 방지해야 합니다. 특히 USB 디버깅이 활성화된 경우 더욱 중요합니다.
|
|
* **네트워크 보안**: _res/xml/_에 있는 사용자 정의 네트워크 보안 구성(`android:networkSecurityConfig="@xml/network_security_config"`)은 인증서 핀 및 HTTP 트래픽 설정과 같은 보안 세부 정보를 지정할 수 있습니다. 특정 도메인에 대한 HTTP 트래픽을 허용하는 예시가 있습니다.
|
|
* **공개된 활동 및 서비스**: Manifest에서 공개된 활동 및 서비스를 식별하면 오용될 수 있는 구성 요소를 강조할 수 있습니다. 동적 테스트 중에 이러한 구성 요소를 어떻게 악용할지 밝혀낼 수 있습니다.
|
|
* **콘텐츠 제공자 및 파일 제공자**: 노출된 콘텐츠 제공자는 데이터에 대한 무단 액세스 또는 수정을 허용할 수 있습니다. FileProvider의 구성도 면밀히 살펴봐야 합니다.
|
|
* **브로드캐스트 수신기 및 URL 스키마**: 이러한 구성 요소는 악용에 활용될 수 있으며 URL 스키마가 입력 취약점을 위해 어떻게 관리되는지에 특히 주의를 기울여야 합니다.
|
|
* **SDK 버전**: `minSdkVersion`, `targetSDKVersion`, `maxSdkVersion` 속성은 지원되는 Android 버전을 나타내며, 보안상의 이유로 오래된 취약한 Android 버전을 지원하지 않는 것이 중요함을 강조합니다.
|
|
|
|
**strings.xml** 파일에서 API 키, 사용자 정의 스키마 및 기타 개발자 노트와 같은 민감한 정보를 발견할 수 있으므로 이러한 리소스를 주의 깊게 검토해야 합니다.
|
|
|
|
### Tapjacking
|
|
|
|
**Tapjacking**은 **악성 애플리케이션이 피해 애플리케이션 위에 위치하도록 하여** 사용자를 속이는 공격입니다. 피해 애플리케이션이 시각적으로 가려지면 사용자 인터페이스가 사용자를 속이기 위해 설계되어 있으며, 사용자가 상호 작용하는 것처럼 보이지만 실제로는 피해 애플리케이션에서 작업을 수행하게 합니다.\
|
|
사용자가 실제로 피해 애플리케이션에서 작업을 수행하고 있다는 사실을 모르게 만들어 **사용자를 속이는** 효과가 있습니다.
|
|
|
|
더 많은 정보는 다음에서 확인하세요:
|
|
|
|
{% content-ref url="tapjacking.md" %}
|
|
[tapjacking.md](tapjacking.md)
|
|
{% endcontent-ref %}
|
|
|
|
### 작업 탈취
|
|
|
|
`launchMode`가 **`singleTask`로 설정되어 있지만 `taskAffinity`가 정의되지 않은** **액티비티**는 작업 탈취에 취약합니다. 이는 **애플리케이션이 설치되고 실제 애플리케이션이 실행되기 전에 시작되면** 실제 애플리케이션의 작업을 탈취할 수 있음을 의미합니다(따라서 사용자는 실제 애플리케이션을 사용 중이라고 생각하면서 악성 애플리케이션과 상호 작용할 것입니다).
|
|
|
|
자세한 정보는 다음에서 확인하세요:
|
|
|
|
{% content-ref url="android-task-hijacking.md" %}
|
|
[android-task-hijacking.md](android-task-hijacking.md)
|
|
{% endcontent-ref %}
|
|
|
|
### 보안되지 않은 데이터 저장
|
|
|
|
**내부 저장소**
|
|
|
|
Android에서 **내부 저장소에 저장된 파일**은 **생성한 앱만이** 액세스할 수 있도록 설계되어 있습니다. 이 보안 조치는 Android 운영 체제에 의해 강제되며 대부분의 애플리케이션의 보안 요구를 충족하는 데 일반적으로 충분합니다. 그러나 개발자는 때로 `MODE_WORLD_READABLE` 및 `MODE_WORLD_WRITABLE`과 같은 모드를 사용하여 파일을 다른 애플리케이션 간에 **공유**할 수 있습니다. 그러나 이러한 모드는 이러한 파일에 대한 액세스를 다른 애플리케이션(잠재적으로 악의적인 애플리케이션 포함)에 제한하지 않습니다.
|
|
|
|
1. **정적 분석:**
|
|
* `MODE_WORLD_READABLE` 및 `MODE_WORLD_WRITABLE` 사용이 **주의 깊게 검토**되었는지 확인하세요. 이러한 모드는 파일을 **의도하지 않은 또는 무단 액세스에 노출**시킬 수 있습니다.
|
|
2. **동적 분석:**
|
|
* 앱이 생성한 파일에 설정된 **권한**을 확인하세요. 특히 파일이 **전 세계에서 읽거나 쓰기 가능하도록 설정**되어 있는지 확인하세요. 이는 잠재적으로 모든 애플리케이션이 이러한 파일을 읽거나 수정할 수 있게 하므로 중요한 보안 위험을 초래할 수 있습니다.
|
|
|
|
**외부 저장소**
|
|
|
|
외부 저장소(예: SD 카드)의 파일을 다룰 때는 특정 주의사항이 필요합니다:
|
|
|
|
1. **접근성**:
|
|
* 외부 저장소의 파일은 **전역적으로 읽기 및 쓰기 가능**합니다. 이는 모든 애플리케이션이나 사용자가 이러한 파일에 액세스할 수 있다는 것을 의미합니다.
|
|
2. **보안 문제**:
|
|
* 액세스 용이성을 고려하여 외부 저장소에 **민감한 정보를 저장하지 않는 것이 좋습니다**.
|
|
* 외부 저장소는 제거되거나 모든 애플리케이션이 액세스할 수 있으므로 덜 안전합니다.
|
|
3. **외부 저장소에서 데이터 처리**:
|
|
* 외부 저장소에서 검색된 데이터에 대해 **입력 유효성 검사**를 항상 수행하세요. 이는 신뢰할 수 없는 소스에서 데이터를 가져왔기 때문에 중요합니다.
|
|
* 외부 저장소에 실행 파일이나 클래스 파일을 저장하여 동적으로 로드하는 것은 강력히 권장되지 않습니다.
|
|
* 애플리케이션이 외부 저장소에서 실행 파일을 검색해야 하는 경우, 이러한 파일이 동적으로 로드되기 전에 **서명되고 암호화가 확인**되도록 보장하세요. 이 단계는 애플리케이션의 보안 무결성을 유지하는 데 중요합니다.
|
|
|
|
외부 저장소는 `/storage/emulated/0`, `/sdcard`, `/mnt/sdcard`에서 **액세스**할 수 있습니다.
|
|
|
|
{% hint style="info" %}
|
|
Android 4.4(API 17)부터 SD 카드에는 앱에 특정으로 지정된 디렉토리에 대한 앱의 디렉토리 구조가 있습니다. 이는 악성 애플리케이션이 다른 앱의 파일을 읽거나 쓰는 것을 방지합니다.
|
|
{% endhint %}
|
|
|
|
**평문으로 저장된 민감한 데이터**
|
|
|
|
* **공유 환경 설정**: Android는 각 애플리케이션이 `/data/data/<패키지명>/shared_prefs/` 경로에 XML 파일을 쉽게 저장할 수 있도록 허용하며 때로는 해당 폴더에서 평문으로 민감한 정보를 찾을 수 있습니다.
|
|
* **데이터베이스**: Android는 각 애플리케이션이 `/data/data/<패키지명>/databases/` 경로에 SQLite 데이터베이스를 쉽게 저장할 수 있도록 허용하며 때로는 해당 폴더에서 평문으로 민감한 정보를 찾을 수 있습니다.
|
|
|
|
### TLS 깨진 경우
|
|
|
|
**모든 인증서 수락**
|
|
|
|
가끔 개발자들은 호스트 이름이 일치하지 않아도 모든 인증서를 수락하는 경우가 있습니다. 예를 들어 다음과 같은 코드 라인과 같이:
|
|
```java
|
|
SSLSocketFactory sf = new cc(trustStore);
|
|
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
|
|
```
|
|
### 취약한 암호화
|
|
|
|
**암호화 키 관리 프로세스의 결함**
|
|
|
|
일부 개발자는 민감한 데이터를 로컬 저장소에 저장하고 코드 내에서 하드코딩/예측 가능한 키로 암호화합니다. 이렇게 하면 공격자가 기밀 정보를 추출할 수 있게 될 수 있으므로 이는 피해야 합니다.
|
|
|
|
**안전하지 않거나 사용이 중단된 알고리즘의 사용**
|
|
|
|
개발자는 **사용되지 않는 알고리즘**을 사용하여 **인가 확인**, **저장** 또는 **데이터 전송**을 수행해서는 안 됩니다. 이러한 알고리즘 중 일부는 다음과 같습니다: RC4, MD4, MD5, SHA1... 예를 들어 암호를 저장하기 위해 **해시**가 사용된다면, 솔트와 함께 해시 무력화가 사용되어야 합니다.
|
|
|
|
### 기타 확인 사항
|
|
|
|
* APK를 **난독화**하는 것이 좋습니다. 이렇게 하면 역공학 작업을 어렵게 할 수 있습니다.
|
|
* 앱이 민감한 경우(은행 앱 등), 모바일이 루팅되었는지 확인하고 그에 따라 조치를 취해야 합니다.
|
|
* 앱이 민감한 경우(은행 앱 등), 에뮬레이터를 사용하는지 확인해야 합니다.
|
|
* 앱이 민감한 경우(은행 앱 등), 실행 전에 **자체 무결성을 확인**해야 합니다.
|
|
* APK를 빌드하는 데 사용된 컴파일러/패커/난독화기를 확인하기 위해 [**APKiD**](https://github.com/rednaga/APKiD)를 사용하세요.
|
|
|
|
### 리액트 네이티브 애플리케이션
|
|
|
|
리액트 애플리케이션의 자바스크립트 코드에 쉽게 액세스하는 방법을 알아보려면 다음 페이지를 읽어보세요:
|
|
|
|
{% content-ref url="react-native-application.md" %}
|
|
[react-native-application.md](react-native-application.md)
|
|
{% endcontent-ref %}
|
|
|
|
### 자마린 애플리케이션
|
|
|
|
자마린 애플리케이션의 C# 코드에 쉽게 액세스하는 방법을 알아보려면 다음 페이지를 읽어보세요:
|
|
|
|
{% content-ref url="../xamarin-apps.md" %}
|
|
[xamarin-apps.md](../xamarin-apps.md)
|
|
{% endcontent-ref %}
|
|
|
|
### 슈퍼팩킹된 애플리케이션
|
|
|
|
이 [**블로그 게시물**](https://clearbluejar.github.io/posts/desuperpacking-meta-superpacked-apks-with-github-actions/)에 따르면, 슈퍼팩킹은 애플리케이션의 내용을 하나의 파일로 압축하는 메타 알고리즘입니다. 이 블로그는 이러한 종류의 앱을 해제하는 앱을 만들 수 있는 가능성에 대해 이야기하며... 그리고 **애플리케이션을 실행하고 파일 시스템에서 해제된 파일을 수집하는 더 빠른 방법**에 대해 설명합니다.
|
|
|
|
### 자동 정적 코드 분석
|
|
|
|
도구 [**mariana-trench**](https://github.com/facebook/mariana-trench)은 애플리케이션의 코드를 **스캔**하여 **취약점**을 찾을 수 있습니다. 이 도구에는 **알려진 소스**(입력이 사용자에 의해 제어되는 위치를 도구에 알려주는 것), **싱크**(악의적 사용자 입력이 피해를 일으킬 수 있는 위험한 위치를 도구에 알려주는 것) 및 **규칙**이 포함되어 있습니다. 이러한 규칙은 취약점을 나타내는 **소스-싱크**의 조합을 나타냅니다.
|
|
|
|
이 지식을 바탕으로 **mariana-trench는 코드를 검토하고 가능한 취약점을 찾을 것**입니다.
|
|
|
|
### 누출된 비밀
|
|
|
|
애플리케이션에는 (API 키, 비밀번호, 숨겨진 URL, 서브도메인 등) 발견할 수 있는 비밀이 포함될 수 있습니다. [https://github.com/dwisiswant0/apkleaks](https://github.com/dwisiswant0/apkleaks)와 같은 도구를 사용하여 이를 발견할 수 있습니다.
|
|
|
|
### 생체 인증 우회
|
|
|
|
{% content-ref url="bypass-biometric-authentication-android.md" %}
|
|
[bypass-biometric-authentication-android.md](bypass-biometric-authentication-android.md)
|
|
{% endcontent-ref %}
|
|
|
|
### 기타 흥미로운 기능
|
|
|
|
* **코드 실행**: `Runtime.exec(), ProcessBuilder(), native code:system()`
|
|
* **SMS 전송**: `sendTextMessage, sendMultipartTestMessage`
|
|
* `native`로 선언된 **네이티브 함수**: `public native, System.loadLibrary, System.load`
|
|
* **네이티브 함수를 반전하는 방법**을 알아보려면 [여기를 읽으세요](reversing-native-libraries.md)
|
|
|
|
### **기타 트릭**
|
|
|
|
{% content-ref url="content-protocol.md" %}
|
|
[content-protocol.md](content-protocol.md)
|
|
{% endcontent-ref %}
|
|
|
|
***
|
|
|
|
<figure><img src="../../.gitbook/assets/image (380).png" alt=""><figcaption></figcaption></figure>
|
|
|
|
[**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) 서버에 가입하여 경험 많은 해커 및 버그 바운티 헌터와 소통하세요!
|
|
|
|
**해킹 통찰력**\
|
|
해킹의 즐거움과 도전에 대해 탐구하는 콘텐츠와 상호 작용하세요
|
|
|
|
**실시간 해킹 뉴스**\
|
|
실시간 뉴스와 통찰력을 통해 빠른 속도로 변화하는 해킹 세계를 따라가세요
|
|
|
|
**최신 공지**\
|
|
출시되는 최신 버그 바운티 및 중요한 플랫폼 업데이트에 대해 알아보세요
|
|
|
|
**[Discord](https://discord.com/invite/N3FrSbmwdy)**에 가입하여 최고의 해커들과 협업을 시작하세요!
|
|
|
|
***
|
|
|
|
## 동적 분석
|
|
|
|
> 먼저, 애플리케이션을 설치하고 모든 환경(Burp CA 인증서, Drozer 및 Frida 주로)를 설치할 수 있는 환경이 필요합니다. 따라서 루팅된 장치(가상 또는 아님)를 권장합니다.
|
|
|
|
### 온라인 동적 분석
|
|
|
|
[https://appetize.io/](https://appetize.io)에서 **무료 계정**을 만들 수 있습니다. 이 플랫폼을 사용하면 APK를 **업로드**하고 **실행**할 수 있으므로 APK의 작동 방식을 확인하는 데 유용합니다.
|
|
|
|
웹에서 애플리케이션의 로그를 **볼 수** 있고 **adb**를 통해 연결할 수도 있습니다.
|
|
|
|
![](<../../.gitbook/assets/image (831).png>)
|
|
|
|
ADB 연결을 통해 에뮬레이터 내에서 **Drozer** 및 **Frida**를 사용할 수 있습니다.
|
|
|
|
### 로컬 동적 분석
|
|
|
|
#### 에뮬레이터 사용
|
|
|
|
* [**Android Studio**](https://developer.android.com/studio) (x86 및 arm 장치를 만들 수 있으며, [**최신 x86**](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html) 버전은 느린 arm 에뮬레이터 없이 ARM 라이브러리를 지원합니다).
|
|
* 이 페이지에서 설정 방법을 배우세요:
|
|
|
|
{% content-ref url="avd-android-virtual-device.md" %}
|
|
[avd-android-virtual-device.md](avd-android-virtual-device.md)
|
|
{% endcontent-ref %}
|
|
|
|
* [**Genymotion**](https://www.genymotion.com/fun-zone/) **(무료 버전:** Personal Edition, 계정을 만들어야 합니다. _잠재적인 오류를 피하기 위해_ _**VirtualBox**가 포함된 버전을 **다운로드**하는 것이 좋습니다._)
|
|
* [**Nox**](https://es.bignox.com) (무료, 하지만 Frida 또는 Drozer를 지원하지 않음).
|
|
|
|
{% hint style="info" %}
|
|
어떤 플랫폼에서든 새로운 에뮬레이터를 만들 때 화면이 클수록 에뮬레이터가 느려집니다. 가능하면 작은 화면을 선택하세요.
|
|
{% endhint %}
|
|
|
|
Genymotion에서 **AppStore**와 같은 구글 서비스를 설치하려면 다음 이미지의 빨간 표시된 버튼을 클릭해야 합니다:
|
|
|
|
![](<../../.gitbook/assets/image (277).png>)
|
|
|
|
또한, Genymotion의 **Android VM 구성**에서 **Bridge Network mode**를 선택할 수 있습니다(다른 VM에서 도구를 사용하여 Android VM에 연결할 경우 유용합니다).
|
|
|
|
#### 실제 장치 사용
|
|
|
|
디버깅 옵션을 활성화하고 가능하면 루팅하는 것이 좋습니다:
|
|
|
|
1. **설정**.
|
|
2. (Android 8.0부터) **시스템** 선택.
|
|
3. **휴대폰 정보** 선택.
|
|
4. **빌드 번호**를 7번 누릅니다.
|
|
5. 뒤로 가서 **개발자 옵션**을 찾을 수 있습니다.
|
|
|
|
> 애플리케이션을 설치한 후에 해야 할 첫 번째 작업은 앱을 시험해보고 작동 방식을 조사하고 익숙해지는 것입니다.\
|
|
> MobSF 동적 분석 + pidcat을 사용하여 **초기 동적 분석을 수행**하는 것을 제안합니다. 이렇게 하면 MobSF가 나중에 검토할 수 있는 많은 **흥미로운 데이터를 캡처**하면서 애플리케이션의 작동 방식을 배울 수 있습니다.
|
|
### 의도하지 않은 데이터 누출
|
|
|
|
**로깅**
|
|
|
|
개발자는 **디버깅 정보**가 공개되지 않도록 주의해야 합니다. 이는 민감한 데이터 누출로 이어질 수 있습니다. [**pidcat**](https://github.com/JakeWharton/pidcat) 및 `adb logcat` 도구를 사용하여 애플리케이션 로그를 모니터링하여 민감한 정보를 식별하고 보호하는 것이 권장됩니다. **Pidcat**은 사용하기 쉽고 가독성이 좋아 선호됩니다.
|
|
|
|
{% hint style="warning" %}
|
|
**Android 4.0 이후의 최신 버전**에서는 **애플리케이션은 자체 로그에만 액세스**할 수 있습니다. 따라서 애플리케이션은 다른 앱의 로그에 액세스할 수 없습니다.\
|
|
그래도 **민감한 정보를 기록하지 않는 것**이 좋습니다.
|
|
{% endhint %}
|
|
|
|
**복사/붙여넣기 버퍼 캐싱**
|
|
|
|
Android의 **클립보드 기반** 프레임워크는 앱에서 복사 및 붙여넣기 기능을 가능하게 하지만, **다른 애플리케이션**이 클립보드에 **액세스**할 수 있어 민감한 데이터가 노출될 수 있습니다. 애플리케이션의 민감한 섹션(예: 신용 카드 정보)에 대해 복사/붙여넣기 기능을 **비활성화**하여 데이터 누출을 방지해야 합니다.
|
|
|
|
**크래시 로그**
|
|
|
|
애플리케이션이 **크래시**하고 **로그를 저장**하는 경우, 이러한 로그는 특히 애플리케이션이 역공학화되지 않을 때 공격자를 지원할 수 있습니다. 이러한 위험을 줄이기 위해 크래시 시 로깅을 피하고, 로그를 네트워크를 통해 전송해야 하는 경우 SSL 채널을 통해 안전하게 전송되도록 해야 합니다.
|
|
|
|
펜테스터로서 **이러한 로그를 살펴보세요**.
|
|
|
|
**3rd 파티에 전송된 분석 데이터**
|
|
|
|
애플리케이션은 종종 Google Adsense와 같은 서비스를 통합하는데, 개발자의 부적절한 구현으로 인해 민감한 데이터가 **누출**될 수 있습니다. 잠재적인 데이터 누출을 식별하기 위해 애플리케이션의 트래픽을 **가로채어** 제3자 서비스로 전송되는 민감한 정보를 확인하는 것이 좋습니다.
|
|
|
|
### SQLite DBs
|
|
|
|
대부분의 애플리케이션은 정보를 저장하기 위해 **내부 SQLite 데이터베이스**를 사용합니다. 펜테스트 중에는 생성된 **데이터베이스**, **테이블 및 열의 이름** 및 저장된 **모든 데이터**를 확인해야 합니다. 왜냐하면 **민감한 정보**(취약점이 될 수 있는)를 발견할 수도 있기 때문입니다.\
|
|
데이터베이스는 `/data/data/the.package.name/databases`에 위치해야 하며 `/data/data/com.mwr.example.sieve/databases`와 같이 될 것입니다.
|
|
|
|
데이터베이스가 기밀 정보를 저장하고 **암호화**되어 있지만 애플리케이션 내에서 **암호**를 **찾을 수** 있다면 여전히 **취약점**입니다.
|
|
|
|
`.tables`를 사용하여 테이블을 나열하고 `.schema <table_name>`을 사용하여 테이블의 열을 나열하세요.
|
|
|
|
### Drozer (Exploit Activities, Content Providers and Services)
|
|
|
|
[Drozer 문서](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf)에 따르면 **Drozer**를 사용하면 Android 앱의 역할을 **가정**하고 다른 앱과 상호 작용할 수 있습니다. Android의 프로세스 간 통신(IPC) 메커니즘을 활용하고 기본 운영 체제와 상호 작용하는 등 설치된 애플리케이션이 할 수 있는 모든 작업을 수행할 수 있습니다.\
|
|
Drozer는 내보낸 활동, 내보낸 서비스 및 콘텐츠 제공자를 **악용**하는 데 유용한 도구입니다.
|
|
|
|
### 내보낸 활동 악용
|
|
|
|
[**Android 활동이 무엇인지 다시 확인하려면 여기를 읽어보세요.**](android-applications-basics.md#launcher-activity-and-other-activities)\
|
|
또한 활동의 코드는 **`onCreate`** 메서드에서 시작됨을 기억하세요.
|
|
|
|
**인증 우회**
|
|
|
|
활동이 내보내어지면 외부 앱에서 해당 화면을 호출할 수 있습니다. 따라서 **민감한 정보**가 있는 활동이 **내보내어진** 경우 **인증** 메커니즘을 **우회**하여 **액세스**할 수 있습니다.
|
|
|
|
[Drozer를 사용하여 내보낸 활동을 악용하는 방법을 배우세요.](drozer-tutorial/#activities)
|
|
|
|
또한 adb에서 내보낸 활동을 시작할 수 있습니다:
|
|
|
|
* 패키지 이름은 com.example.demo입니다.
|
|
* 내보낸 활동 이름은 com.example.test.MainActivity입니다.
|
|
```bash
|
|
adb shell am start -n com.example.demo/com.example.test.MainActivity
|
|
```
|
|
**참고**: MobSF는 활동에서 `android:launchMode`로 _**singleTask/singleInstance**_를 사용하는 것을 악성으로 감지할 것이지만, [여기](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750)에 따르면 이는 이전 버전(API 버전 < 21)에서만 위험하다고 합니다.
|
|
|
|
{% hint style="info" %}
|
|
인가 우회(authorisation bypass)가 항상 취약점은 아닙니다. 우회가 작동하는 방식과 노출되는 정보에 따라 다를 것입니다.
|
|
{% endhint %}
|
|
|
|
**민감한 정보 누출**
|
|
|
|
**활동은 결과를 반환할 수도 있습니다**. 내보내고 보호되지 않은 활동을 찾아 **`setResult`** 메서드를 호출하고 **민감한 정보를 반환**하는 경우 민감한 정보 누출이 발생합니다.
|
|
|
|
#### 탭재킹
|
|
|
|
탭재킹을 방지하지 않으면 내보낸 활동을 악용하여 **사용자가 예상치 못한 작업을 수행**하게 할 수 있습니다. [**탭재킹이란 무엇인지 알아보려면 링크를 따르세요**](./#tapjacking).
|
|
|
|
### 콘텐츠 제공자 악용 - 민감한 정보 접근 및 조작
|
|
|
|
[**콘텐츠 제공자가 무엇인지 다시 확인하려면 이 문서를 읽으세요.**](android-applications-basics.md#content-provider)\
|
|
콘텐츠 제공자는 기본적으로 **데이터를 공유**하는 데 사용됩니다. 앱에 사용 가능한 콘텐츠 제공자가 있다면 거기서 **민감한** 데이터를 **추출**할 수 있을 수도 있습니다. 가능한 **SQL 인젝션** 및 **경로 탐색**을 테스트하는 것도 흥미로울 수 있습니다.
|
|
|
|
[Drozer로 콘텐츠 제공자를 악용하는 방법을 배우세요.](drozer-tutorial/#content-providers)
|
|
|
|
### **서비스 악용**
|
|
|
|
[**서비스가 무엇인지 다시 확인하려면 이 문서를 읽으세요.**](android-applications-basics.md#services)\
|
|
서비스의 작업은 기본적으로 `onStartCommand` 메서드에서 시작됩니다.
|
|
|
|
서비스는 기본적으로 **데이터를 수신**하고 **처리**하여 응답을 **반환**하거나 그렇지 않을 수 있습니다. 따라서 애플리케이션이 일부 서비스를 내보내고 있다면 해당 **코드**를 확인하여 무엇을 하는지 이해하고, 기밀 정보를 추출하거나 인증 조치를 우회하는 등의 **동적 테스트**를 수행해야 합니다.\
|
|
[Drozer로 서비스를 악용하는 방법을 배우세요.](drozer-tutorial/#services)
|
|
|
|
### **브로드캐스트 수신기 악용**
|
|
|
|
[**브로드캐스트 수신기가 무엇인지 다시 확인하려면 이 문서를 읽으세요.**](android-applications-basics.md#broadcast-receivers)\
|
|
브로드캐스트 수신기의 작업은 기본적으로 `onReceive` 메서드에서 시작됩니다.
|
|
|
|
브로드캐스트 수신기는 특정 유형의 메시지를 기다리고 있을 것입니다. 수신기가 메시지를 처리하는 방식에 따라 취약할 수 있습니다.\
|
|
[Drozer로 브로드캐스트 수신기를 악용하는 방법을 배우세요.](./#exploiting-broadcast-receivers)
|
|
|
|
### **스키마 / 딥 링크 악용**
|
|
|
|
MobSF와 같은 도구를 사용하여 수동으로 딥 링크를 찾을 수 있습니다. 또는 [이 스크립트](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py)와 같은 스크립트를 사용할 수도 있습니다.\
|
|
선언된 **스키마**를 **adb** 또는 **브라우저**를 사용하여 **열 수** 있습니다:
|
|
|
|
{% code overflow="wrap" %}
|
|
```bash
|
|
adb shell am start -a android.intent.action.VIEW -d "scheme://hostname/path?param=value" [your.package.name]
|
|
```
|
|
{% endcode %}
|
|
|
|
_패키지 이름을 **생략할 수 있다는 점**을 유의하십시오. 모바일은 자동으로 해당 링크를 열어야 할 앱을 호출할 것입니다._
|
|
|
|
{% code overflow="wrap" %}
|
|
```markup
|
|
<!-- 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>
|
|
```
|
|
{% endcode %}
|
|
|
|
**실행된 코드**
|
|
|
|
**앱에서 실행될 코드를 찾으려면** 딥링크로 호출된 activity로 이동하여 **`onNewIntent`** 함수를 찾으세요.
|
|
|
|
![](<../../.gitbook/assets/image (436) (1) (1) (1).png>)
|
|
|
|
**민감한 정보**
|
|
|
|
딥링크를 찾을 때마다 **URL 매개변수를 통해 민감한 데이터(예: 비밀번호)를 받지 않는지** 확인하세요. 다른 애플리케이션이 딥링크를 흉내내어 해당 데이터를 훔칠 수 있습니다!
|
|
|
|
**경로 내 매개변수**
|
|
|
|
URL의 경로 내에 매개변수를 사용하는 딥링크가 있는지도 확인해야 합니다. 예를 들어 `https://api.example.com/v1/users/{username}`와 같은 경우, `example://app/users?username=../../unwanted-endpoint%3fparam=value`와 같이 경로 순회를 강제할 수 있습니다.\
|
|
애플리케이션 내에서 올바른 엔드포인트를 찾으면 **Open Redirect**(일부 경로가 도메인 이름으로 사용될 경우), **계정 탈취**(CSRF 토큰 없이 사용자 세부 정보를 수정할 수 있고 취약한 엔드포인트가 올바른 방법을 사용했을 경우) 및 기타 취약점을 유발할 수 있습니다. [여기에서 자세한 정보 확인](http://dphoeniixx.com/2020/12/13-2/).
|
|
|
|
**추가 예시**
|
|
|
|
링크에 관한 [흥미로운 버그 바운티 보고서](https://hackerone.com/reports/855618)입니다.
|
|
|
|
### 전송 계층 검사 및 인증 실패
|
|
|
|
* Android 애플리케이션에서는 **인증서를 항상 제대로 검사하지 않는 경우**가 있습니다. 이러한 애플리케이션에서는 경고를 무시하고 자체 서명된 인증서를 수락하거나 경우에 따라 HTTP 연결을 사용하도록 되돌아갈 수 있습니다.
|
|
* SSL/TLS 핸드셰이크 중 협상이 때로는 취약하며, 보안되지 않은 암호 스위트를 사용합니다. 이 취약점으로 인해 연결이 중간자 공격에 취약해져 데이터를 해독할 수 있습니다.
|
|
* 응용 프로그램이 안전한 채널을 통해 인증한 후 다른 트랜잭션에 대해 비보안 채널을 통해 통신하는 경우 **개인 정보 누출**이 발생할 수 있습니다. 이 방법은 세션 쿠키나 사용자 세부 정보와 같은 민감한 데이터를 악의적인 주체가 가로채는 것을 방지하지 못합니다.
|
|
|
|
#### 인증서 확인
|
|
|
|
**인증서 확인**에 중점을 둘 것입니다. 서버의 인증서 무결성을 확인하여 보안을 강화해야 합니다. 이는 보안되지 않은 TLS 구성 및 민감한 데이터의 암호화되지 않은 채널을 통한 전송이 중요한 위험을 초래할 수 있기 때문입니다. 서버 인증서를 확인하고 취약점을 해결하기 위한 자세한 단계에 대한 안내는 [**이 리소스**](https://manifestsecurity.com/android-application-security-part-10/)에서 포괄적인 지침을 제공합니다.
|
|
|
|
#### SSL Pinning
|
|
|
|
SSL Pinning은 애플리케이션이 알려진 복사본과 서버의 인증서를 확인하는 보안 조치입니다. 이 방법은 MITM 공격을 방지하는 데 필수적입니다. 민감한 정보를 처리하는 애플리케이션에 대해 SSL Pinning을 구현하는 것이 강력히 권장됩니다.
|
|
|
|
#### 트래픽 검사
|
|
|
|
HTTP 트래픽을 검사하려면 프록시 도구의 인증서를 **설치해야** 합니다(예: Burp). 이 인증서를 설치하지 않으면 암호화된 트래픽이 프록시를 통해 보이지 않을 수 있습니다. 사용자 정의 CA 인증서를 설치하는 방법에 대한 안내는 [**여기를 클릭하세요**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine).
|
|
|
|
**API 레벨 24 이상을 대상으로 하는** 애플리케이션은 네트워크 보안 구성을 수정하여 프록시의 CA 인증서를 수락해야 합니다. 이 단계는 암호화된 트래픽을 검사하는 데 중요합니다. 네트워크 보안 구성을 수정하는 방법에 대한 지침은 [**이 튜토리얼을 참조하세요**](make-apk-accept-ca-certificate.md).
|
|
|
|
#### SSL Pinning 우회
|
|
|
|
SSL Pinning이 구현된 경우 HTTPS 트래픽을 검사하기 위해 우회하는 것이 필요할 수 있습니다. 이를 위해 다음과 같은 다양한 방법이 있습니다:
|
|
|
|
* [**apk-mitm**](https://github.com/shroudedcode/apk-mitm)를 사용하여 SSLPinning을 우회하는 **apk를 자동으로 수정**할 수 있습니다. 이 방법의 가장 큰 장점은 SSL Pinning을 우회하기 위해 루트가 필요하지 않지만, 애플리케이션을 삭제하고 새로 설치해야 하며 항상 작동하지는 않습니다.
|
|
* 이 보호를 우회하기 위해 **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 동적 분석**을 사용하여 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)
|
|
|
|
#### 일반 웹 취약점 찾기
|
|
|
|
애플리케이션 내에서 일반적인 웹 취약점을 찾는 것도 중요합니다. 이러한 취약점을 식별하고 완화하는 자세한 정보는 이 요약의 범위를 벗어나지만 다른 곳에서 상세히 다루고 있습니다.
|
|
|
|
### Frida
|
|
|
|
[Frida](https://www.frida.re)는 개발자, 역공학자 및 보안 연구원을 위한 동적 계기화 툴킷입니다.\
|
|
**실행 중인 애플리케이션에 액세스하고 실행 시간에 메서드를 후킹하여 동작을 변경하거나 값 변경, 값 추출, 다른 코드 실행 등을 할 수 있습니다.**\
|
|
Android 애플리케이션을 펜테스트하려면 Frida 사용 방법을 알아야 합니다.
|
|
|
|
* Frida 사용 방법 익히기: [**Frida 튜토리얼**](frida-tutorial/)
|
|
* Frida 작업을 자동화하는 데 좋은 Ojection: [**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를 로드하여 안티 디버깅 / 안티 Frida 메커니즘을 우회하려면 [https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace)에 나와 있는 대로 Frida를 로드하면 됩니다(도구 [linjector](https://github.com/erfur/linjector-rs) 사용)
|
|
|
|
### **메모리 덤프 - Fridump**
|
|
|
|
애플리케이션이 암호나 니모닉과 같은 민감한 정보를 저장해서는 안 되는 메모리 내에 저장하는지 확인하세요.
|
|
|
|
[**Fridump3**](https://github.com/rootbsd/fridump3)를 사용하여 앱의 메모리를 덤프할 수 있습니다:
|
|
```bash
|
|
# With PID
|
|
python3 fridump3.py -u <PID>
|
|
|
|
# With name
|
|
frida-ps -Uai
|
|
python3 fridump3.py -u "<Name>"
|
|
```
|
|
이 명령은 ./dump 폴더에 메모리를 덤프하며, 거기에서 다음과 같이 grep을 사용할 수 있습니다:
|
|
|
|
{% code overflow="wrap" %}
|
|
```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]+$"
|
|
```
|
|
{% endcode %}
|
|
|
|
### **Keystore에 있는 민감한 데이터**
|
|
|
|
Android에서 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)
|
|
```bash
|
|
frida -U -f com.example.app -l frida-scripts/tracer-cipher.js
|
|
```
|
|
### **지문/생체 인증 우회**
|
|
|
|
다음 Frida 스크립트를 사용하면 Android 애플리케이션이 **특정 민감한 영역을 보호하기 위해 수행할 수 있는 지문 인증 우회**가 가능할 수 있습니다:
|
|
|
|
{% code overflow="wrap" %}
|
|
```bash
|
|
frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f <app.package>
|
|
```
|
|
{% endcode %}
|
|
|
|
### **배경 이미지**
|
|
|
|
애플리케이션을 백그라운드로 전환하면 Android는 앱이 다시 포그라운드로 복원될 때 앱보다 먼저 이미지를 로드하여 앱이 더 빨리 로드된 것처럼 보이도록 **애플리케이션의 스냅샷**을 저장합니다.
|
|
|
|
그러나 이 스냅샷에 **민감한 정보**가 포함되어 있다면, 스냅샷에 액세스 권한이 있는 사람은 그 정보를 **도용**할 수 있습니다 (스냅샷에 액세스하려면 루트 액세스가 필요합니다).
|
|
|
|
스냅샷은 일반적으로 다음 위치에 저장됩니다: **`/data/system_ce/0/snapshots`**
|
|
|
|
Android는 **FLAG\_SECURE 레이아웃 매개변수를 설정함으로써 스크린샷 캡처를 방지**할 수 있는 방법을 제공합니다. 이 플래그를 사용하면 창 내용이 안전하게 처리되어 스크린샷에 나타나지 않거나 안전하지 않은 디스플레이에서 볼 수 없게 됩니다.
|
|
```bash
|
|
getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
|
|
```
|
|
### **Android 애플리케이션 분석기**
|
|
|
|
이 도구는 동적 분석 중에 다양한 도구를 관리하는 데 도움이 될 수 있습니다: [https://github.com/NotSoSecure/android\_application\_analyzer](https://github.com/NotSoSecure/android\_application\_analyzer)
|
|
|
|
### Intent 삽입
|
|
|
|
개발자들은 종종 이러한 Intents를 처리하고 `startActivity(...)` 또는 `sendBroadcast(...)`와 같은 메서드로 전달하는 활동, 서비스 및 브로드캐스트 수신기와 같은 프록시 구성 요소를 만듭니다. 이는 공격자가 이러한 Intents를 잘못된 방향으로 전환하여 미노출된 앱 구성 요소를 트리거하거나 민감한 콘텐츠 제공자에 액세스할 수 있도록 허용하는 위험을 안고 있습니다. 주목할만한 예는 `WebView` 구성 요소가 URL을 `Intent.parseUri(...)`를 통해 `Intent` 객체로 변환한 다음 실행하여 악의적인 Intent 삽입으로 이어질 수 있습니다.
|
|
|
|
### 주요 포인트
|
|
|
|
* **Intent 삽입**은 웹의 Open Redirect 문제와 유사합니다.
|
|
* 악용은 `Intent` 객체를 추가로 전달하여 안전하지 않은 작업을 실행할 수 있도록 리디렉션하는 것을 포함합니다.
|
|
* 미노출된 구성 요소 및 콘텐츠 제공자를 공격자에게 노출시킬 수 있습니다.
|
|
* `WebView`의 URL을 `Intent`로 변환하는 것은 의도하지 않은 작업을 용이하게 할 수 있습니다.
|
|
|
|
### Android 클라이언트 측 삽입 및 기타
|
|
|
|
아마도 웹에서 이러한 종류의 취약점에 대해 알고 있을 것입니다. Android 애플리케이션에서 이러한 취약점에 특히 주의해야 합니다:
|
|
|
|
* **SQL Injection:** 동적 쿼리나 콘텐츠 제공자를 다룰 때는 매개변수화된 쿼리를 사용하는지 확인하십시오.
|
|
* **JavaScript Injection (XSS):** 모든 WebViews에 대해 JavaScript 및 플러그인 지원이 비활성화되어 있는지 확인하십시오 (기본적으로 비활성화됨). [자세한 정보는 여기를 참조하십시오](webview-attacks.md#javascript-enabled).
|
|
* **로컬 파일 포함:** WebViews는 파일 시스템에 액세스할 수 없도록 설정되어 있어야 합니다 (기본적으로 활성화됨) - `(webview.getSettings().setAllowFileAccess(false);)`. [자세한 정보는 여기를 참조하십시오](webview-attacks.md#javascript-enabled).
|
|
* **영구 쿠키**: Android 애플리케이션이 세션을 종료할 때 쿠키가 취소되지 않거나 디스크에 저장될 수도 있습니다.
|
|
* [쿠키의 **Secure Flag**](../../pentesting-web/hacking-with-cookies/#cookies-flags)
|
|
|
|
***
|
|
|
|
<figure><img src="../../.gitbook/assets/image (380).png" alt=""><figcaption></figcaption></figure>
|
|
|
|
[**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) 서버에 가입하여 경험 많은 해커 및 버그 바운티 헌터와 소통하세요!
|
|
|
|
**해킹 통찰**\
|
|
해킹의 스릴과 도전에 대해 탐구하는 콘텐츠와 상호 작용하세요
|
|
|
|
**실시간 해킹 뉴스**\
|
|
실시간 뉴스와 통찰을 통해 빠른 속도의 해킹 세계를 따라가세요
|
|
|
|
**최신 공지**\
|
|
최신 버그 바운티 출시 및 중요한 플랫폼 업데이트에 대해 알아두세요
|
|
|
|
**[Discord](https://discord.com/invite/N3FrSbmwdy)에서** 함께하여 최고의 해커들과 협업을 시작하세요!
|
|
|
|
## 자동 분석
|
|
|
|
### [MobSF](https://github.com/MobSF/Mobile-Security-Framework-MobSF)
|
|
|
|
**정적 분석**
|
|
|
|
![](<../../.gitbook/assets/image (866).png>)
|
|
|
|
**웹 기반의 멋진 프론트엔드를 사용하여 애플리케이션의 취약점 평가**. 동적 분석도 수행할 수 있습니다 (환경을 준비해야 함).
|
|
```bash
|
|
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 파일을 만듭니다), MobSF가 분석할 수도 있습니다.
|
|
|
|
MobSF는 **diff/비교** 분석 및 **VirusTotal** 통합도 가능합니다 (MobSF/settings.py에서 API 키를 설정하고 활성화해야 합니다: `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 동적 분석기**는 다음을 수행할 수 있습니다:
|
|
|
|
* **애플리케이션 데이터 덤프** (URL, 로그, 클립보드, 사용자가 캡처한 스크린샷, "**Exported Activity Tester**"가 캡처한 스크린샷, 이메일, SQLite 데이터베이스, XML 파일 및 기타 생성된 파일). 스크린샷을 제외한 모든 작업은 자동으로 수행되며, 스크린샷을 캡처하려면 원하는 시점에 눌러야 하거나 "**Exported Activity Tester**"를 눌러서 내보낸 모든 활동의 스크린샷을 얻어야 합니다.
|
|
* **HTTPS 트래픽 캡처**
|
|
* **Frida**를 사용하여 **런타임 정보** 획들
|
|
|
|
**Android** 버전이 **5보다 큰 경우**, **Frida가 자동으로 시작**되고 전역 **프록시** 설정이 **트래픽 캡처**로 설정됩니다. 테스트된 애플리케이션에서만 트래픽을 캡처합니다.
|
|
|
|
**Frida**
|
|
|
|
기본적으로, **SSL 핀닝 우회**, **루트 탐지**, **디버거 탐지** 및 **흥미로운 API 모니터링**을 위해 일부 Frida 스크립트를 사용합니다.\
|
|
MobSF는 또한 내보낸 활동을 **호출**, 해당 활동의 **스크린샷**을 캡처하고 보고서에 **저장**할 수 있습니다.
|
|
|
|
동적 테스트를 시작하려면 "**Start Instrumentation**" 버튼을 누르세요. Frida 스크립트에 의해 생성된 로그를 보려면 "**Frida Live Logs**"를 누르고 후킹된 메서드 호출, 전달된 인수 및 반환된 값 등을 볼려면 "**Live API Monitor**"를 누르세요 ("Start Instrumentation"을 누른 후에 나타납니다).\
|
|
MobSF는 사용자의 **Frida 스크립트**를 로드할 수 있습니다 (Friday 스크립트의 결과를 MobSF로 보내려면 `send()` 함수를 사용하세요). 또한 로드할 수 있는 **사전 작성된 스크립트**가 있습니다 (`MobSF/DynamicAnalyzer/tools/frida_scripts/others/`에 더 많은 스크립트를 추가할 수 있습니다). 그냥 **선택**하고 "**Load**"를 누르고 "**Start Instrumentation**"을 누르세요 (해당 스크립트의 로그를 "**Frida Live Logs**"에서 볼 수 있습니다).
|
|
|
|
![](<../../.gitbook/assets/image (419).png>)
|
|
|
|
또한, 보조 Frida 기능이 있습니다:
|
|
|
|
* **로드된 클래스 나열**: 로드된 모든 클래스를 출력합니다.
|
|
* **문자열 캡처**: 애플리케이션 사용 중에 캡처된 모든 문자열을 출력합니다 (매우 시끄러울 수 있음).
|
|
* **문자열 비교 캡처**: 매우 유용할 수 있습니다. 비교된 2개의 문자열을 보여주고 결과가 True인지 False인지 표시합니다.
|
|
* **클래스 메서드 나열**: 클래스 이름(예: "java.io.File")을 입력하면 해당 클래스의 모든 메서드를 출력합니다.
|
|
* **클래스 패턴 검색**: 패턴으로 클래스 검색
|
|
* **클래스 메서드 추적**: 전체 클래스를 추적합니다 (클래스의 모든 메서드의 입력 및 출력을 확인합니다). MobSF는 기본적으로 여러 흥미로운 Android API 메서드를 추적합니다.
|
|
|
|
사용하려는 보조 모듈을 선택한 후 "**Start Intrumentation**"을 눌러서 모든 출력을 "**Frida Live Logs**"에서 볼 수 있습니다.
|
|
|
|
**Shell**
|
|
|
|
Mobsf는 동적 분석 페이지 하단에 일부 **adb** 명령어, **MobSF 명령어** 및 일반 **shell 명령어**를 포함한 셸을 제공합니다. 일부 흥미로운 명령어:
|
|
```bash
|
|
help
|
|
shell ls
|
|
activities
|
|
exported_activities
|
|
services
|
|
receivers
|
|
```
|
|
**HTTP 도구**
|
|
|
|
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 요청을 퍼징**하고 취약점을 찾을 수 있습니다.
|
|
|
|
{% hint style="info" %}
|
|
MobSF로 동적 분석을 수행한 후 프록시 설정이 잘못 구성될 수 있으며 GUI에서 수정할 수 없을 수 있습니다. 프록시 설정을 수정하려면 다음을 수행할 수 있습니다:
|
|
```
|
|
adb shell settings put global http_proxy :0
|
|
```
|
|
{% endhint %}
|
|
|
|
### Inspeckage를 사용한 보조 동적 분석
|
|
|
|
[**Inspeckage**](https://github.com/ac-pm/Inspeckage)에서 도구를 얻을 수 있습니다.\
|
|
이 도구는 몇 가지 **훅**을 사용하여 **애플리케이션에서 무슨 일이 일어나고 있는지**를 알려주며 **동적 분석**을 수행할 때 도움이 됩니다.
|
|
|
|
### [Yaazhini](https://www.vegabird.com/yaazhini/)
|
|
|
|
이것은 **GUI로 정적 분석을 수행하는 뛰어난 도구**입니다
|
|
|
|
![](<../../.gitbook/assets/image (741).png>)
|
|
|
|
### [Qark](https://github.com/linkedin/qark)
|
|
|
|
이 도구는 **소스 코드** 또는 **패키지된 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
|
|
qark --java path/to/parent/java/folder
|
|
qark --java path/to/specific/java/file.java
|
|
```
|
|
### [**ReverseAPK**](https://github.com/1N3/ReverseAPK.git)
|
|
|
|
* 쉬운 참조를 위해 추출된 모든 파일 표시
|
|
* APK 파일을 자동으로 Java 및 Smali 형식으로 디컴파일
|
|
* 일반적인 취약점 및 동작을 위해 AndroidManifest.xml 분석
|
|
* 일반적인 취약점 및 동작을 위한 정적 소스 코드 분석
|
|
* 기기 정보
|
|
* 그 외
|
|
```bash
|
|
reverse-apk relative/path/to/APP.apk
|
|
```
|
|
### [SUPER Android Analyzer](https://github.com/SUPERAndroidAnalyzer/super)
|
|
|
|
SUPER는 Windows, MacOS X 및 Linux에서 사용할 수있는 명령줄 응용 프로그램으로, 취약점을 찾기 위해 _.apk_ 파일을 분석합니다. 이는 APK를 압축 해제하고 취약점을 감지하기 위해 일련의 규칙을 적용함으로써 수행됩니다.
|
|
|
|
모든 규칙은 `rules.json` 파일에 중점을 두고 있으며, 각 회사 또는 테스터는 필요한 내용을 분석하기 위해 자체 규칙을 만들 수 있습니다.
|
|
|
|
최신 이진 파일을 [다운로드 페이지](https://superanalyzer.rocks/download.html)에서 다운로드하세요.
|
|
```
|
|
super-analyzer {apk_file}
|
|
```
|
|
### [StaCoAn](https://github.com/vincentcox/StaCoAn)
|
|
|
|
![](<../../.gitbook/assets/image (297).png>)
|
|
|
|
StaCoAn은 **크로스플랫폼** 도구로, 개발자, 버그바운티 헌터 및 윤리적 해커들이 모바일 애플리케이션에 대한 [정적 코드 분석](https://en.wikipedia.org/wiki/Static\_program\_analysis)을 수행하는 데 도움을 줍니다.
|
|
|
|
이 개념은 모바일 애플리케이션 파일(.apk 또는 .ipa 파일)을 StaCoAn 애플리케이션으로 끌어다 놓으면 시각적이고 휴대용 보고서를 생성해줍니다. 설정 및 워드리스트를 조정하여 사용자 정의 경험을 얻을 수 있습니다.
|
|
|
|
[최신 릴리스 다운로드](https://github.com/vincentcox/StaCoAn/releases):
|
|
```
|
|
./stacoan
|
|
```
|
|
### [AndroBugs](https://github.com/AndroBugs/AndroBugs\_Framework)
|
|
|
|
AndroBugs Framework은 Android 애플리케이션에서 잠재적인 보안 취약점을 찾는 데 도움을 주는 Android 취약점 분석 시스템입니다.\
|
|
[Windows 릴리스](https://github.com/AndroBugs/AndroBugs\_Framework/releases)
|
|
```
|
|
python androbugs.py -f [APK file]
|
|
androbugs.exe -f [APK file]
|
|
```
|
|
### [Androwarn](https://github.com/maaaaz/androwarn)
|
|
|
|
**Androwarn**는 주로 안드로이드 애플리케이션에 의해 개발된 잠재적으로 악성 행위를 감지하고 사용자에게 경고하는 데 목적을 둔 도구입니다.
|
|
|
|
이 감지는 애플리케이션의 Dalvik 바이트 코드를 **Smali**로 표현하여 수행되며, [`androguard`](https://github.com/androguard/androguard) 라이브러리를 사용하여 **정적 분석**이 수행됩니다.
|
|
|
|
이 도구는 전화 식별자 유출, 오디오/비디오 흐름 가로채기, PIM 데이터 수정, 임의 코드 실행과 같은 **"나쁜" 애플리케이션의 일반적인 동작**을 찾습니다.
|
|
```
|
|
python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
|
|
```
|
|
### [MARA Framework](https://github.com/xtiankisutsa/MARA\_Framework)
|
|
|
|
![](<../../.gitbook/assets/image (595).png>)
|
|
|
|
**MARA**는 **M**obile **A**pplication **R**everse engineering 및 **A**nalysis Framework입니다. 이 도구는 일반적으로 사용되는 모바일 애플리케이션 역공학 및 분석 도구를 모아 OWASP 모바일 보안 위협에 대한 모바일 애플리케이션 테스트를 지원합니다. 그 목표는 모바일 애플리케이션 개발자와 보안 전문가들이 이 작업을 더 쉽고 친숙하게 할 수 있도록 하는 것입니다.
|
|
|
|
다음을 수행할 수 있습니다:
|
|
|
|
* 다양한 도구를 사용하여 Java 및 Smali 코드 추출
|
|
* [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)를 사용하여 APK 분석
|
|
* APK에서 정규식을 사용하여 개인 정보 추출
|
|
* Manifest 분석
|
|
* [pyssltest](https://github.com/moheshmohan/pyssltest), [testssl](https://github.com/drwetter/testssl.sh) 및 [whatweb](https://github.com/urbanadventurer/WhatWeb)를 사용하여 발견된 도메인 분석
|
|
* [apk-deguard.com](http://www.apk-deguard.com)를 통해 APK의 난독화 해제
|
|
|
|
### Koodous
|
|
|
|
악성 코드 감지에 유용: [https://koodous.com/](https://koodous.com)
|
|
|
|
## 코드 난독화/해제
|
|
|
|
코드를 난독화하는 서비스 및 구성에 따라 비밀 정보가 난독화되었을 수도 있고 그렇지 않을 수도 있음에 유의하십시오.
|
|
|
|
### [ProGuard](https://en.wikipedia.org/wiki/ProGuard\_\(software\))
|
|
|
|
[Wikipedia](https://en.wikipedia.org/wiki/ProGuard\_\(software\))에 따르면 **ProGuard**는 Java 코드를 축소화, 최적화 및 난독화하는 오픈 소스 명령줄 도구입니다. ProGuard는 바이트코드를 최적화하고 사용되지 않는 명령을 감지하고 제거할 수 있습니다. ProGuard는 무료 소프트웨어이며 GNU General Public License 버전 2 하에 배포됩니다.
|
|
|
|
ProGuard는 Android SDK의 일부로 제공되며 릴리스 모드로 애플리케이션을 빌드할 때 실행됩니다.
|
|
|
|
### [DexGuard](https://www.guardsquare.com/dexguard)
|
|
|
|
APK의 난독화를 해제하는 단계별 가이드는 [https://blog.lexfo.fr/dexguard.html](https://blog.lexfo.fr/dexguard.html)에서 확인할 수 있습니다.
|
|
|
|
(해당 가이드로부터) 최근 확인한 바에 따르면 Dexguard의 작동 방식은 다음과 같습니다:
|
|
|
|
* InputStream으로 리소스를 로드
|
|
* 결과를 복호화하는 FilterInputStream에서 상속된 클래스에 전달
|
|
* 일부 무용한 난독화를 수행하여 역공학자의 시간을 소비
|
|
* 복호화된 결과를 DEX 파일을 얻기 위해 ZipInputStream에 전달
|
|
* 최종적으로 `loadDex` 메서드를 사용하여 결과 DEX를 리소스로 로드
|
|
|
|
### [DeGuard](http://apk-deguard.com)
|
|
|
|
**DeGuard는 Android 난독화 도구에 의해 수행된 난독화 과정을 반전시킵니다. 이를 통해 코드 검사 및 라이브러리 예측을 포함한 다양한 보안 분석이 가능해집니다.**
|
|
|
|
난독화된 APK를 해당 플랫폼에 업로드할 수 있습니다.
|
|
|
|
### [Simplify](https://github.com/CalebFenton/simplify)
|
|
|
|
**일반적인 안드로이드 난독화 해제 도구입니다.** Simplify는 **앱을 가상으로 실행**하여 그 동작을 이해한 후 코드를 최적화하여 동일하게 동작하지만 사람이 이해하기 쉽도록 만듭니다. 각 최적화 유형은 간단하고 일반적이므로 특정 난독화 유형이 무엇이든 상관없습니다.
|
|
|
|
### [APKiD](https://github.com/rednaga/APKiD)
|
|
|
|
APKiD는 **APK가 만들어진 방식에 대한 정보**를 제공합니다. 많은 **컴파일러**, **패커**, **난독화 도구** 및 기타 이상한 것들을 식별합니다. 이는 Android용 [_PEiD_](https://www.aldeid.com/wiki/PEiD)입니다.
|
|
|
|
### 수동
|
|
|
|
[**사용자 정의 난독화를 역으로 해제하는 방법에 대한 일부 팁을 학습하려면 이 튜토리얼을 읽으세요**](manual-deobfuscation.md)
|
|
|
|
## 랩
|
|
|
|
### [Androl4b](https://github.com/sh4hin/Androl4b)
|
|
|
|
AndroL4b는 우분투-메이트를 기반으로 한 Android 보안 가상 머신으로 다양한 보안 전문가 및 연구원들의 최신 프레임워크, 튜토리얼 및 랩을 포함합니다. 이는 역공학 및 악성 코드 분석을 위한 것입니다.
|
|
|
|
## 참고 자료
|
|
|
|
* [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://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)
|
|
|
|
## 아직 시도해보지 않은 것들
|
|
|
|
* [https://www.vegabird.com/yaazhini/](https://www.vegabird.com/yaazhini/)
|
|
* [https://github.com/abhi-r3v0/Adhrit](https://github.com/abhi-r3v0/Adhrit)
|
|
|
|
<figure><img src="../../.gitbook/assets/image (380).png" alt=""><figcaption></figcaption></figure>
|
|
|
|
[**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) 서버에 가입하여 경험 많은 해커 및 버그 바운티 헌터들과 소통하세요!
|
|
|
|
**해킹 통찰**\
|
|
해킹의 즐거움과 도전에 대해 탐구하는 콘텐츠와 상호 작용하세요
|
|
|
|
**실시간 해킹 뉴스**\
|
|
실시간 뉴스와 통찰을 통해 빠른 속도의 해킹 세계를 따라가세요
|
|
|
|
**최신 공지**\
|
|
최신 버그 바운티 출시 및 중요한 플랫폼 업데이트에 대해 알아두세요
|
|
|
|
**[**Discord**](https://discord.com/invite/N3FrSbmwdy)에 참여하여 최고의 해커들과 협업을 시작하세요!**
|