Android 애플리케이션 Pentesting
{{#include ../../banners/hacktricks-training.md}}
Android 애플리케이션 기본
이 페이지를 먼저 읽어 Android 보안과 Android 애플리케이션에서 가장 위험한 구성요소와 관련된 가장 중요한 부분들을 알아두는 것을 강력히 권장합니다:
{{#ref}} android-applications-basics.md {{#endref}}
ADB (Android Debug Bridge)
이는 에뮬레이터나 실기기와 같은 Android 기기에 연결하기 위해 필요한 주요 도구입니다.
ADB는 컴퓨터에서 USB 또는 네트워크를 통해 기기를 제어할 수 있게 해줍니다. 이 유틸리티는 양방향 파일 복사, 앱의 설치 및 제거, 셸 명령의 실행, 데이터의 백업, 로그의 읽기 등 다양한 기능을 제공합니다.
adb 사용 방법을 배우려면 다음 ADB Commands 목록을 확인하세요.
Smali
때때로 애플리케이션 코드를 수정해 숨겨진 정보(예: 잘 난독화된 비밀번호나 플래그)에 접근하는 것이 흥미로울 수 있습니다. 그런 경우, apk를 디컴파일하고 코드를 수정한 뒤 다시 컴파일하는 것이 유용할 수 있습니다.
In this tutorial you can learn how to decompile and APK, modify Smali code and recompile the APK with the new functionality. 이 방법은 이후 소개될 동적 분석 중 여러 테스트에 대한 동적 분석 중 여러 테스트에 대한 대안으로 매우 유용할 수 있습니다. 그러므로 항상 이 가능성을 염두에 두세요.
기타 흥미로운 팁
- Spoofing your location in Play Store
- Shizuku Privileged API (ADB-based non-root privileged access)
- Exploiting Insecure In-App Update Mechanisms
- Abusing Accessibility Services (Android RAT)
- APK 다운로드: https://apps.evozi.com/apk-downloader/, https://apkpure.com/es/, https://www.apkmirror.com/, https://apkcombo.com/es-es/apk-downloader/, https://github.com/kiber-io/apkd
- 기기에서 APK 추출:
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
- 모든 split 및 base APK를 APKEditor로 병합:
mkdir splits
adb shell pm path com.android.insecurebankv2 | cut -d ':' -f 2 | 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
사례 연구 및 취약점
{{#ref}} ../ios-pentesting/air-keyboard-remote-input-injection.md {{#endref}}
{{#ref}} ../../linux-hardening/privilege-escalation/android-rooting-frameworks-manager-auth-bypass-syscall-hook.md {{#endref}}
정적 분석
우선, APK를 분석할 때는 decompiler를 사용해 Java 코드를 살펴보는 것이 중요합니다.
다양한 사용 가능한 decompiler에 대한 정보를 확인하려면 여기에서 읽어보세요.
흥미로운 정보 찾기
APK의 strings만 살펴봐도 비밀번호, URLs (https://github.com/ndelphit/apkurlgrep), api 키, encryption, bluetooth uuids, 토큰 등 흥미로운 것들을 찾을 수 있습니다... 코드 실행을 위한 backdoors나 인증 백도어(앱에 하드코딩된 관리자 자격증명)도 확인하세요.
Firebase
Firebase URLs에 특히 주의하고 잘못 구성되어 있는지 확인하세요. Firebase가 무엇이고 이를 악용하는 방법에 대한 추가 정보는 여기에서 확인할 수 있습니다.
애플리케이션의 기본 이해 - Manifest.xml, strings.xml
애플리케이션의 **_Manifest.xml_와 strings.xml 파일을 검토하면 잠재적인 보안 취약점을 발견할 수 있습니다. 이 파일들은 decompiler로 접근하거나 APK 파일의 확장자를 .zip으로 바꿔 압축을 풀어 확인할 수 있습니다.
Manifest.xml에서 식별되는 취약점에는 다음이 포함됩니다:
- Debuggable Applications: Manifest.xml 파일에서
debuggable="true"
로 설정된 애플리케이션은 연결을 허용하여 악용될 수 있으므로 위험합니다. 디버깅 가능한 애플리케이션을 찾고 이를 악용하는 방법에 대한 튜토리얼을 참고하세요. - Backup Settings: 민감한 정보를 다루는 애플리케이션은
android:allowBackup="false"
속성을 명시적으로 설정하여 adb를 통한 무단 데이터 백업을 방지해야 합니다(특히 usb debugging이 활성화된 경우). - Network Security: _res/xml/_의 커스텀 네트워크 보안 구성(
android:networkSecurityConfig="@xml/network_security_config"
)은 certificate pinning이나 HTTP 트래픽 설정과 같은 보안 세부사항을 지정할 수 있습니다. 예를 들어 특정 도메인에 대해 HTTP 트래픽을 허용하도록 설정할 수 있습니다. - Exported Activities and Services: 매니페스트에서 노출된(exported) activity나 service를 식별하면 악용될 수 있는 컴포넌트를 드러낼 수 있습니다. 동적 테스트 중 추가 분석을 통해 이러한 컴포넌트를 어떻게 악용할 수 있는지 밝혀낼 수 있습니다.
- Content Providers and FileProviders: 노출된 content provider는 무단으로 데이터에 접근하거나 수정할 수 있게 할 수 있습니다. FileProviders의 구성도 면밀히 검토해야 합니다.
- Broadcast Receivers and URL Schemes: 이런 컴포넌트들은 악용될 가능성이 있으며, 특히 URL 스킴이 입력을 어떻게 처리하는지 주의해서 살펴봐야 합니다.
- SDK Versions:
minSdkVersion
,targetSDKVersion
, 및maxSdkVersion
속성은 지원되는 Android 버전을 나타내며, 오래된 취약한 Android 버전을 지원하지 않는 것이 중요함을 시사합니다.
strings.xml 파일에서는 API 키, 커스텀 스키마, 기타 개발자 메모 등 민감한 정보가 드러날 수 있으므로 이러한 리소스를 주의 깊게 검토해야 합니다.
Tapjacking
Tapjacking은 악의적인 애플리케이션이 실행되어 피해자 애플리케이션 위에 자신을 배치하는 공격입니다. 악성 앱이 피해자 앱을 가시적으로 가리게 되면, 악성 앱의 UI가 사용자를 속여 상호작용하도록 설계되고, 그 상호작용은 피해자 앱으로 전달됩니다.
결과적으로 사용자는 자신이 실제로 피해자 앱에서 동작을 수행하고 있다는 사실을 알 수 없게 됩니다.
자세한 정보는 다음을 확인하세요:
{{#ref}} tapjacking.md {{#endref}}
Task Hijacking
launchMode
가 singleTask
로 설정되어 있고 taskAffinity
가 정의되어 있지 않은 activity는 Task Hijacking 취약점에 노출됩니다. 이는 악성 애플리케이션을 설치하고 실제 애플리케이션보다 먼저 실행하면 실제 애플리케이션의 task를 가로챌 수 있음을 의미합니다(따라서 사용자는 자신이 실제 앱을 사용한다고 생각하면서 악성 애플리케이션과 상호작용하게 됩니다).
자세한 내용은 다음을 확인하세요:
{{#ref}} android-task-hijacking.md {{#endref}}
Insecure data storage
Internal Storage
Android에서 내부 저장소에 저장된 파일은 해당 파일을 생성한 앱만 접근할 수 있도록 설계되어 있습니다. 이 보안 조치는 Android 운영체제에 의해 강제되며 대부분의 애플리케이션 보안 요구사항에 충분합니다. 다만 개발자가 MODE_WORLD_READABLE
및 MODE_WORLD_WRITABLE
같은 모드를 사용해 파일을 다른 애플리케이션과 공유하도록 허용하는 경우가 있습니다. 이러한 모드는 잠재적으로 다른 애플리케이션(악성 앱 포함)이 해당 파일에 접근할 수 있게 하므로 주의가 필요합니다.
- Static Analysis:
MODE_WORLD_READABLE
및MODE_WORLD_WRITABLE
의 사용을 면밀히 검토하세요. 이 모드들은 파일을 원치 않거나 무단의 접근에 노출시킬 수 있습니다.
- Dynamic Analysis:
- 앱이 생성한 파일에 설정된 권한을 검증하세요. 특히 파일이 전 세계에서 읽기 또는 쓰기가 가능한지 확인하세요. 이는 심각한 보안 위험을 초래할 수 있으며, 설치된 어떤 애플리케이션이라도 해당 파일을 읽거나 수정할 수 있게 됩니다.
External Storage
SD Card와 같은 external storage의 파일을 다룰 때는 다음과 같은 점을 고려해야 합니다:
- 접근성:
- external storage의 파일은 전역적으로 읽기/쓰기 가능합니다. 즉 어떤 애플리케이션이나 사용자도 이 파일들에 접근할 수 있습니다.
- 보안 문제:
- 접근이 쉬우므로 민감한 정보를 외부 저장소에 저장하지 않는 것이 권장됩니다.
- 외부 저장소는 제거되거나 어떤 앱이라도 접근할 수 있어 더 안전하지 않습니다.
- External Storage로부터의 데이터 처리:
- 외부 저장소에서 가져온 데이터에 대해 항상 **입력 검증(input validation)**을 수행하세요. 외부 저장소의 데이터는 신뢰할 수 없는 소스이기 때문에 필수적입니다.
- 외부 저장소에 실행 파일이나 class 파일을 저장하고 동적으로 로드하는 것은 강력히 권장되지 않습니다.
- 애플리케이션이 외부 저장소에서 실행 파일을 가져와야 하는 경우, 이러한 파일이 동적으로 로드되기 전에 반드시 서명되고 암호학적으로 검증되었는지 확인하세요. 이 단계는 애플리케이션의 보안 무결성을 유지하는 데 필수적입니다.
External storage는 /storage/emulated/0
, /sdcard
, /mnt/sdcard
에서 접근할 수 있습니다.
Tip
Android 4.4(API 17)부터 SD 카드에는 앱 전용 디렉터리 구조가 도입되어 앱이 자신의 전용 디렉터리로만 접근하도록 제한됩니다. 이는 악성 애플리케이션이 다른 앱의 파일에 읽기/쓰기 접근을 얻는 것을 방지합니다.
평문으로 저장된 민감한 데이터
- Shared preferences: Android는 각 애플리케이션이
/data/data/<packagename>/shared_prefs/
경로에 xml 파일을 쉽게 저장할 수 있도록 허용하며, 때때로 해당 폴더에서 평문으로 된 민감한 정보를 발견할 수 있습니다. - Databases: Android는 각 애플리케이션이
/data/data/<packagename>/databases/
경로에 sqlite 데이터베이스를 쉽게 저장할 수 있도록 허용하며, 때때로 해당 폴더에서 평문으로 된 민감한 정보를 발견할 수 있습니다.
Broken TLS
모든 인증서 수락(Accept All Certificates)
어떤 이유에서인지 개발자들이 호스트네임이 일치하지 않아도 모든 인증서를 수락하는 경우가 있습니다. 예를 들어 다음과 같은 코드 라인처럼:
SSLSocketFactory sf = new cc(trustStore);
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
A good way to test this is to try to capture the traffic using some proxy like Burp without authorising Burp CA inside the device. Also, you can generate with Burp a certificate for a different hostname and use it.
취약한 암호화
취약한 키 관리 프로세스
일부 개발자는 민감한 데이터를 로컬 저장소에 저장하고 코드에 하드코딩되었거나 예측 가능한 키로 암호화합니다. 리버싱을 통해 공격자가 기밀 정보를 추출할 수 있으므로 이렇게 해서는 안 됩니다.
안전하지 않거나/또는 폐기된 알고리즘 사용
개발자는 권한 확인, 데이터 저장 또는 전송에 deprecated algorithms을 사용해서는 안 됩니다. 이러한 알고리즘의 예로는 RC4, MD4, MD5, SHA1 등이 있습니다. 예를 들어 비밀번호를 저장하기 위해 hashes를 사용하는 경우에는 salt와 함께 브루트포스에 저항성 있는 해시를 사용해야 합니다.
기타 확인사항
- 공격자의 리버스 엔지니어링 작업을 어렵게 하기 위해 APK를 obfuscate 하는 것이 권장됩니다.
- 앱이 민감한 경우(예: 은행 앱)는 모바일이 rooted인지 확인하는 자체 검사를 수행하고 그에 따라 동작해야 합니다.
- 앱이 민감한 경우(예: 은행 앱)는 emulator 사용 여부를 검사해야 합니다.
- 앱이 민감한 경우(예: 은행 앱)는 실행 전에 자체 무결성을 확인하여 수정되었는지 검사해야 합니다.
- APK를 빌드할 때 어떤 compiler/packer/obfuscator가 사용되었는지 확인하려면 APKiD를 사용하세요
React Native Application
Read the following page to learn how to easily access javascript code of React applications:
{{#ref}} react-native-application.md {{#endref}}
Xamarin Applications
Read the following page to learn how to easily access C# code of a xamarin applications:
{{#ref}} ../xamarin-apps.md {{#endref}}
Superpacked Applications
According to this blog post superpacked is a Meta algorithm that compress the content of an application into a single file. The blog talks about the possibility of creating an app that decompress these kind of apps... and a faster way which involves to execute the application and gather the decompressed files from the filesystem.
자동화된 정적 코드 분석
툴 mariana-trench는 애플리케이션의 코드를 스캔하여 취약점을 찾아낼 수 있습니다. 이 도구는 일련의 known sources(사용자가 제어하는 입력이 어디인지 도구에 알려주는), sinks(악의적 입력이 피해를 줄 수 있는 위험한 지점을 도구에 알려주는) 및 rules를 포함합니다. 이러한 규칙들은 취약점을 나타내는 sources-sinks 조합을 지정합니다.
이 지식을 바탕으로 mariana-trench는 코드를 검토하여 잠재적 취약점을 찾아냅니다.
Secrets leaked
An application may contain secrets (API keys, passwords, hidden urls, subdomains...) inside of it that you might be able to discover. You could us a tool such as https://github.com/dwisiswant0/apkleaks
Bypass Biometric Authentication
{{#ref}} bypass-biometric-authentication-android.md {{#endref}}
기타 흥미로운 기능
- 코드 실행:
Runtime.exec(), ProcessBuilder(), native code:system()
- SMS 전송:
sendTextMessage, sendMultipartTestMessage
- Native 함수들 선언:
public native, System.loadLibrary, System.load
- 이 문서를 읽어 how to reverse native functions를 알아보세요
- JNI를 통한 메모리 상의 native 코드 실행 (downloaded shellcode → mmap/mprotect → call):
{{#ref}} in-memory-jni-shellcode-execution.md {{#endref}}
Other tricks
{{#ref}} content-protocol.md {{#endref}
동적 분석
무엇보다도 애플리케이션과 필요한 환경(Burp CA cert, Drozer 및 Frida 등)을 설치할 수 있는 환경이 필요합니다. 따라서 루팅된 기기(에뮬레이터 포함)를 사용하는 것을 강력히 권장합니다.
온라인 동적 분석
다음에서 free account를 만들 수 있습니다: https://appetize.io/. 이 플랫폼은 APK를 업로드하고 실행할 수 있게 해주므로 APK가 어떻게 동작하는지 확인하는 데 유용합니다.
웹에서 애플리케이션의 로그를 볼 수 있고 adb로 연결할 수도 있습니다.
ADB 연결 덕분에 에뮬레이터 내에서 Drozer와 Frida를 사용할 수 있습니다.
로컬 동적 분석
에뮬레이터 사용
- Android Studio (x86 및 arm 디바이스를 생성할 수 있으며, this에 따르면 최신 x86 버전은 느린 arm 에뮬레이터 없이 ARM 라이브러리를 지원합니다).
- 설정 방법은 다음 페이지를 참고하세요:
{{#ref}} avd-android-virtual-device.md {{#endref}}
- Genymotion (Free version: Personal Edition, 계정 생성 필요. 잠재적 오류를 피하려면 VirtualBox 포함 버전을 다운로드하는 것이 권장됩니다.)
- Nox (무료지만 Frida나 Drozer를 지원하지 않습니다).
Tip
새로운 에뮬레이터를 만들 때 화면이 클수록 에뮬레이터가 느려지므로 가능하면 작은 화면을 선택하세요.
Genymotion에 google services(예: AppStore)를 설치하려면 다음 이미지의 빨간 표시된 버튼을 클릭해야 합니다:
또한 Genymotion의 Android VM 구성에서 Bridge Network mode를 선택할 수 있다는 점에 유의하세요(다른 VM에서 도구로 Android VM에 연결할 때 유용합니다).
실기기 사용
디버깅 옵션을 활성화해야 하며 가능하면 root하는 것이 좋습니다:
- Settings.
- (FromAndroid 8.0) Select System.
- Select About phone.
- Press Build number 7 times.
- 뒤로 가면 Developer options를 찾을 수 있습니다.
애플리케이션을 설치한 후 가장 먼저 해야 할 일은 그것을 사용해보고 무엇을 하는지, 어떻게 동작하는지 파악하여 익숙해지는 것입니다.
저는 이 초기 동적 분석을 MobSF dynamic analysis + pidcat으로 수행할 것을 권합니다. 이렇게 하면 MobSF가 나중에 검토할 수 있는 많은 흥미로운 데이터를 캡처하는 동안 애플리케이션의 동작을 학습할 수 있습니다.
Magisk/Zygisk quick notes (recommended on Pixel devices)
- Magisk 앱으로 boot.img를 패치하고 fastboot로 플래시하여 systemless root를 얻으세요
- root 숨김을 위해 Zygisk + DenyList를 활성화하세요; 더 강한 숨김이 필요하면 LSPosed/Shamiko를 고려하세요
- OTA 업데이트에서 복구할 수 있도록 원본 boot.img를 보관하세요; OTA 후에는 다시 패치하세요
- 화면 미러링은 호스트에서 scrcpy를 사용하세요
Unintended Data Leakage
로깅
개발자는 debugging information을 공개적으로 노출하지 않도록 주의해야 하며, 이는 민감한 데이터 leak로 이어질 수 있습니다. 애플리케이션 로그를 모니터링하여 민감한 정보를 식별하고 보호하기 위해 pidcat와 adb logcat
을 권장합니다. Pidcat은 사용 편의성과 가독성 때문에 선호됩니다.
Warning
Android 4.0 이후 버전부터 applications are only able to access their own logs. 따라서 애플리케이션은 다른 앱의 로그에 접근할 수 없습니다.
어쨌든 민감한 정보를 로그로 남기지 않는 것이 권장됩니다.
복사/붙여넣기 버퍼 캐싱
Android의 clipboard-based 프레임워크는 앱에서 복사·붙여넣기 기능을 가능하게 하지만, 다른 애플리케이션이 클립보드에 접근할 수 있어 민감한 데이터가 노출될 위험이 있습니다. 신용카드 정보와 같은 민감한 섹션에서는 복사/붙여넣기 기능을 비활성화하는 것이 중요합니다.
크래시 로그
애플리케이션이 크래시하여 로그를 저장하면, 특히 애플리케이션을 리버스엔지니어링할 수 없을 때 이러한 로그는 공격자에게 도움이 될 수 있습니다. 이 위험을 완화하려면 크래시 시 로그를 남기지 말고, 네트워크로 로그를 전송해야 하는 경우 SSL 채널로 전송되도록 보장하세요.
Pentester로서, 이 로그들을 확인해 보세요.
3자에게 전송되는 분석 데이터
애플리케이션은 종종 Google Adsense와 같은 서비스를 통합하는데, 개발자의 부적절한 구현으로 인해 민감한 데이터가 의도치 않게 leak될 수 있습니다. 잠재적인 데이터 누수를 식별하려면 애플리케이션의 트래픽을 가로채서 서드파티 서비스로 전송되는 민감한 정보가 있는지 확인하는 것이 좋습니다.
SQLite DBs
대부분의 애플리케이션은 정보를 저장하기 위해 internal SQLite databases를 사용합니다. 펜테스트 중에는 생성된 데이터베이스, 테이블 및 컬럼 이름과 저장된 모든 데이터를 확인하세요. 민감한 정보가 발견될 수 있습니다(이는 취약점입니다).
데이터베이스는 /data/data/the.package.name/databases
에 위치해야 합니다. 예: /data/data/com.mwr.example.sieve/databases
데이터베이스가 기밀 정보를 저장하고 암호화되어 있더라도 애플리케이션 내부에서 password를 찾을 수 있다면 이는 여전히 vulnerability입니다.
.tables
로 테이블을 나열하고 .schema <table_name>
로 테이블의 컬럼을 나열하세요.
Drozer (Exploit Activities, Content Providers and Services)
From Drozer Docs: Drozer는 앱의 역할을 가정하여 다른 앱과 상호작용할 수 있게 해줍니다. 설치된 애플리케이션이 할 수 있는 모든 작업(예: Android의 Inter-Process Communication(IPC) 메커니즘 사용 및 기본 운영체제와의 상호작용)을 수행할 수 있습니다.
Drozer는 exported activities, exported services 및 Content Providers를 exploit하는 데 유용한 도구이며, 이는 다음 섹션에서 배울 수 있습니다.
Exploiting exported Activities
Read this if you want to refresh what is an Android Activity.
또한 액티비티의 코드는 onCreate
메서드에서 시작된다는 점을 기억하세요.
Authorisation bypass
Activity가 exported되어 있을 때 외부 앱에서 해당 화면을 호출할 수 있습니다. 따라서 sensitive information을 포함한 액티비티가 exported되어 있다면 인증 메커니즘을 bypass하여 접근할 수 있습니다.
Learn how to exploit exported activities with Drozer.
또한 adb에서 exported activity를 시작할 수 있습니다:
- PackageName is com.example.demo
- Exported ActivityName is com.example.test.MainActivity
adb shell am start -n com.example.demo/com.example.test.MainActivity
참고: MobSF는 액티비티에서 android:launchMode
로 _singleTask/singleInstance_를 사용하는 것을 악성으로 감지하지만, this 때문에 이는 구버전(API 버전 < 21)에서만 위험한 것으로 보입니다.
Tip
authorisation bypass가 항상 취약점인 것은 아니며, 우회 방식과 어떤 정보가 노출되는지에 따라 달라집니다.
민감한 정보 누출
액티비티는 결과를 반환할 수도 있습니다. export되어 있고 보호되지 않은 액티비티가 setResult
메서드를 호출하며 민감한 정보를 반환하는 것을 찾으면, 민감한 정보 누출이 발생합니다.
Tapjacking
Tapjacking이 방지되지 않으면 export된 액티비티를 악용해 사용자가 예기치 않은 동작을 수행하도록 만들 수 있습니다. Tapjacking에 대한 자세한 내용은 Tapjacking이 무엇인지 보려면 링크를 따르세요.
Exploiting Content Providers - Accessing and manipulating sensitive information
Content Provider가 무엇인지 새로 확인하고 싶다면 읽어보세요.
Content provider는 기본적으로 데이터를 공유하는 데 사용됩니다. 앱에 content provider가 존재하면 거기서 민감한 데이터를 추출할 수 있습니다. 또한 잠재적 취약점으로 SQL injections 및 Path Traversals을 테스트해보는 것도 흥미롭습니다.
Drozer로 Content Providers를 악용하는 방법 배우기.
Exploiting Services
Service가 무엇인지 다시 확인하고 싶다면 읽어보세요.
Service의 동작은 onStartCommand
메서드에서 시작된다는 점을 기억하세요.
서비스는 기본적으로 데이터를 수신, 처리하고 반환(또는 반환하지 않음)할 수 있습니다. 따라서 앱이 일부 서비스를 export하고 있다면 무엇을 하는지 이해하기 위해 코드를 검토하고, 기밀 정보를 추출하거나 인증 수단을 우회하기 위해 동적으로 테스트해보아야 합니다.
Drozer로 서비스 악용 방법 배우기.
Exploiting Broadcast Receivers
Broadcast Receiver가 무엇인지 다시 확인하고 싶다면 읽어보세요.
Broadcast Receiver의 동작은 onReceive
메서드에서 시작된다는 점을 기억하세요.
브로드캐스트 리시버는 특정 유형의 메시지를 기다립니다. 리시버가 메시지를 처리하는 방식에 따라 취약할 수 있습니다.
Drozer로 Broadcast Receiver 악용 방법 배우기.
Exploiting Schemes / Deep links
MobSF 같은 도구나 this one 같은 스크립트를 사용해 딥 링크를 수동으로 찾을 수 있습니다.
선언된 scheme은 adb나 브라우저로 열 수 있습니다:
adb shell am start -a android.intent.action.VIEW -d "scheme://hostname/path?param=value" [your.package.name]
참고로 패키지 이름을 생략할 수 있으며 모바일이 해당 링크를 열 앱을 자동으로 호출합니다.
<!-- 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>
실행되는 코드
앱에서 실행될 코드를 찾으려면 deeplink에 의해 호출되는 activity로 이동하여 함수 **onNewIntent
**를 검색하세요.
민감한 정보
deep link를 찾을 때마다 URL 파라미터를 통해 민감한 데이터(예: passwords)를 수신하지 않는지 확인하세요. 다른 애플리케이션이 deep link를 가장해 해당 데이터를 탈취할 수 있습니다!
경로 내 파라미터
You must check also if any deep link is using a parameter inside the path of the URL like: https://api.example.com/v1/users/{username}
, in that case you can force a path traversal accessing something like: example://app/users?username=../../unwanted-endpoint%3fparam=value
.
Note that if you find the correct endpoints inside the application you may be able to cause a Open Redirect (if part of the path is used as domain name), account takeover (if you can modify users details without CSRF token and the vuln endpoint used the correct method) and any other vuln. More info about this here.
추가 예시
An interesting bug bounty report about links (/.well-known/assetlinks.json).
전송 계층 검사 및 검증 실패
- Certificates are not always inspected properly by Android applications. 이러한 애플리케이션은 경고를 무시하고 자체 서명 인증서를 수용하거나, 경우에 따라 HTTP 연결로 되돌아가는 경우가 흔합니다.
- Negotiations during the SSL/TLS handshake are sometimes weak, 취약한 cipher suites를 사용하기도 합니다. 이 취약점은 연결을 MITM(man-in-the-middle) 공격에 노출시켜 공격자가 데이터를 복호화할 수 있게 합니다.
- Leakage of private information is a risk when applications authenticate using secure channels but then communicate over non-secure channels for other transactions. 이런 접근은 세션 쿠키나 사용자 세부정보 같은 민감한 데이터를 악의적인 주체가 가로채는 것으로부터 보호하지 못합니다.
Certificate Verification
우리는 certificate verification에 중점을 둘 것입니다. 보안을 강화하려면 서버 인증서의 무결성을 검증해야 합니다. 이는 insecure TLS 구성과 암호화되지 않은 채널을 통한 민감한 데이터 전송이 심각한 위험을 초래할 수 있기 때문에 매우 중요합니다. 서버 인증서를 검증하고 취약점을 해결하는 자세한 단계는 this resource에서 확인할 수 있습니다.
SSL Pinning
SSL Pinning은 애플리케이션이 서버의 인증서를 앱 내에 저장된 알려진 복사본과 대조하여 검증하는 보안 방법입니다. 이 방법은 MITM 공격을 방지하는 데 필수적입니다. 민감한 정보를 다루는 애플리케이션에는 SSL Pinning 구현을 강력히 권장합니다.
Traffic Inspection
HTTP 트래픽을 검사하려면 프록시 도구의 인증서 설치(예: Burp)가 필요합니다. 이 인증서를 설치하지 않으면 암호화된 트래픽을 프록시에서 볼 수 없을 수 있습니다. 커스텀 CA 인증서 설치 가이드는 click here를 참조하세요.
API Level 24 and above를 타깃으로 하는 애플리케이션은 프록시의 CA 인증서를 수용하도록 Network Security Config를 수정해야 합니다. 암호화된 트래픽을 검사하려면 이 단계가 필수적입니다. Network Security Config 수정 방법은 refer to this tutorial를 참고하세요.
만약 Flutter를 사용 중이라면 this page에 있는 지침을 따라야 합니다. 단순히 인증서를 스토어에 추가하는 것만으로는 동작하지 않을 수 있으며, Flutter는 자체 유효한 CA 목록을 사용하기 때문입니다.
Static detection of SSL/TLS pinning
런타임 우회를 시도하기 전에 APK에서 pinning이 적용되는 위치를 빠르게 매핑하세요. 정적 탐지는 훅/패치 계획을 세우고 올바른 코드 경로에 집중하는 데 도움이 됩니다.
Tool: SSLPinDetect
- 오픈소스 정적 분석 유틸리티로 APK를 Smali(apktool 통해)로 디컴파일하고 SSL/TLS pinning 구현의 정제된 정규식 패턴을 스캔합니다.
- 각 매치에 대해 정확한 파일 경로, 라인 번호, 코드 스니펫을 리포트합니다.
- 일반적인 프레임워크와 커스텀 코드 경로를 커버합니다: OkHttp CertificatePinner, custom javax.net.ssl.X509TrustManager.checkServerTrusted, SSLContext.init with custom TrustManagers/KeyManagers, 그리고 Network Security Config XML pins.
설치
- Prereqs: Python >= 3.8, Java on PATH, apktool
git clone https://github.com/aancw/SSLPinDetect
cd SSLPinDetect
pip install -r requirements.txt
사용법
# Basic
python sslpindetect.py -f app.apk -a apktool.jar
# Verbose (timings + per-match path:line + snippet)
python sslpindetect.py -a apktool_2.11.0.jar -f sample/app-release.apk -v
예제 패턴 규칙 (JSON) 프로프라이어터리/커스텀 pinning 스타일을 탐지하기 위해 signatures를 사용하거나 확장하세요. 자체 JSON을 로드하여 scan at scale할 수 있습니다.
{
"OkHttp Certificate Pinning": [
"Lcom/squareup/okhttp/CertificatePinner;",
"Lokhttp3/CertificatePinner;",
"setCertificatePinner"
],
"TrustManager Override": [
"Ljavax/net/ssl/X509TrustManager;",
"checkServerTrusted"
]
}
Notes and tips
- 대형 앱을 빠르게 스캔하려면 multi-threading 및 memory-mapped I/O를 사용하세요; pre-compiled regex는 오버헤드와 false positives를 줄여줍니다.
- Pattern collection: https://github.com/aancw/smali-sslpin-patterns
- 다음으로 분류할 일반적인 탐지 대상:
- OkHttp: CertificatePinner 사용, setCertificatePinner, okhttp3/okhttp 패키지 참조
- Custom TrustManagers: javax.net.ssl.X509TrustManager, checkServerTrusted 오버라이드
- Custom SSL contexts: SSLContext.getInstance + SSLContext.init를 custom managers와 함께 사용
- Declarative pins in res/xml network security config 및 manifest 참조
- 매칭된 위치를 사용해 dynamic testing 전에 Frida hooks, static patches 또는 config 리뷰를 계획하세요.
SSL Pinning 우회
SSL Pinning이 구현되어 있으면 HTTPS 트래픽을 검사하기 위해 이를 우회할 필요가 있습니다. 이를 위한 여러 방법이 있습니다:
- 자동으로 apk를 수정하여 SSLPinning을 우회하려면 apk-mitm를 사용하세요. 이 방법의 가장 큰 장점은 SSL Pinning을 우회하는 데 root가 필요 없다는 것이지만, 애플리케이션을 삭제하고 새로 설치해야 하며 항상 동작하지는 않을 수 있습니다.
- 이 보호를 우회하기 위해 Frida(아래에서 설명)를 사용할 수 있습니다. Burp+Frida+Genymotion을 사용하는 가이드는 다음을 참조하세요: https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/
- objection를 사용해 자동으로 SSL Pinning을 우회하려고 시도할 수도 있습니다:
objection --gadget com.package.app explore --startup-command "android sslpinning disable"
- MobSF dynamic analysis(아래 설명)를 사용해 자동으로 SSL Pinning을 우회해볼 수도 있습니다.
- 여전히 캡처되지 않는 트래픽이 있다고 생각되면 iptables를 사용해 트래픽을 burp로 포워딩해보세요. 블로그 읽기: https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62
일반적인 웹 취약점 찾기
애플리케이션 내에서 일반적인 웹 취약점을 찾는 것도 중요합니다. 이러한 취약점을 식별하고 완화하는 자세한 내용은 이 요약의 범위를 벗어나지만 다른 곳에 광범위하게 설명되어 있습니다.
Frida
Frida 는 개발자, 리버스 엔지니어, 보안 연구원을 위한 동적 인스트루먼테이션 툴킷입니다.
실행 중인 애플리케이션에 접근해 런타임에 메서드를 후킹하여 동작을 변경하고, 값 변경·추출하거나 다른 코드를 실행할 수 있습니다.
Android 애플리케이션을 pentest하려면 Frida 사용법을 알아야 합니다.
- Frida 사용법 배우기: Frida tutorial
- Frida 작업용 일부 "GUI": https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security
- Ojection은 Frida 사용을 자동화하기에 좋습니다: https://github.com/sensepost/objection , https://github.com/dpnishant/appmon
- 유용한 Frida 스크립트 모음: https://codeshare.frida.re/
- ptrace 없이 Frida를 로드해 안티 디버깅/안티-frida 메커니즘을 우회해보세요: https://erfur.github.io/blog/dev/code-injection-without-ptrace (도구: linjector)
Anti-instrumentation & SSL pinning bypass workflow
{{#ref}} android-anti-instrumentation-and-ssl-pinning-bypass.md {{#endref}}
메모리 덤프 - Fridump
애플리케이션이 비밀번호나 니모닉 같은 민감한 정보를 메모리에 저장하고 있지 않은지 확인하세요.
Fridump3를 사용하면 다음과 같이 앱의 메모리를 덤프할 수 있습니다:
# With PID
python3 fridump3.py -u <PID>
# With name
frida-ps -Uai
python3 fridump3.py -u "<Name>"
이것은 메모리를 ./dump 폴더에 덤프하며, 그 안에서 다음과 같이 grep을 실행할 수 있습니다:
strings * | grep -E "^[a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+$"
Keystore 내 민감한 데이터
Android에서 Keystore는 민감한 데이터를 저장하기에 가장 적합한 장소이지만, 충분한 권한이 있으면 여전히 접근할 수 있습니다. 애플리케이션이 여기서 sensitive data in clear text를 저장하는 경향이 있으므로, pentests는 root user 또는 기기에 물리적으로 접근할 수 있는 사람이 이 데이터를 탈취할 수 있으므로 이를 확인해야 합니다.
앱이 Keystore에 데이터를 저장하더라도, 해당 데이터는 암호화되어야 합니다.
Keystore 내부 데이터를 접근하려면 이 Frida 스크립트를 사용할 수 있습니다: https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js
frida -U -f com.example.app -l frida-scripts/tracer-cipher.js
Fingerprint/Biometrics Bypass
다음 Frida script를 사용하면 Android 애플리케이션이 특정 민감 영역을 보호하기 위해 수행할 수 있는 bypass fingerprint authentication을 우회할 수 있습니다:
frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f <app.package>
백그라운드 이미지
애플리케이션을 백그라운드로 보내면, Android는 애플리케이션의 스냅샷을 저장합니다. 포그라운드로 복구될 때 앱보다 먼저 이미지를 로드해 앱이 더 빨리 열린 것처럼 보이게 합니다.
하지만 이 스냅샷에 민감한 정보가 포함되어 있으면, 스냅샷에 접근할 수 있는 사람이 해당 정보를 탈취할 수 있습니다(접근하려면 root 권한이 필요합니다).
스냅샷은 보통 다음 경로에 저장됩니다: /data/system_ce/0/snapshots
Android는 FLAG_SECURE 레이아웃 파라미터를 설정하여 스크린샷 캡처를 방지하는 방법을 제공합니다. 이 플래그를 사용하면 윈도우 내용을 보안 처리하여 스크린샷에 나타나거나 보안되지 않은 디스플레이에서 표시되는 것을 방지합니다.
getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
Android 애플리케이션 분석기
이 도구는 동적 분석 중 여러 도구를 관리하는 데 도움을 줄 수 있습니다: https://github.com/NotSoSecure/android_application_analyzer
Intent Injection
Developers often create proxy components like activities, services, and broadcast receivers that handle these Intents and pass them to methods such as startActivity(...)
or sendBroadcast(...)
, which can be risky.
위험은 공격자가 이러한 Intents를 잘못 유도하여 non-exported 앱 컴포넌트를 트리거하거나 민감한 content providers에 접근할 수 있게 허용하는 데 있습니다. 주목할 만한 예로 WebView
가 URL을 Intent.parseUri(...)
로 Intent
객체로 변환한 다음 이를 실행하면서 악의적인 Intent 주입으로 이어질 수 있습니다.
Essential Takeaways
- Intent Injection 은 웹의 Open Redirect 문제와 유사합니다.
- Exploits involve passing
Intent
objects as extras, which can be redirected to execute unsafe operations. - It can expose non-exported components and content providers to attackers.
WebView
’s URL toIntent
conversion can facilitate unintended actions.
Android Client Side Injections and others
아마 웹에서 이런 유형의 취약점을 알고 계실 것입니다. Android 애플리케이션에서는 다음 취약점들에 특히 주의해야 합니다:
- SQL Injection: When dealing with dynamic queries or Content-Providers ensure you are using parameterized queries.
- JavaScript Injection (XSS): Verify that JavaScript and Plugin support is disabled for any WebViews (disabled by default). More info here.
- Local File Inclusion: WebViews should have access to the file system disabled (enabled by default) -
(webview.getSettings().setAllowFileAccess(false);)
. More info here. - Eternal cookies: 몇몇 경우 Android 애플리케이션이 세션을 종료할 때 쿠키가 무효화되지 않거나 심지어 디스크에 저장될 수 있습니다
- Secure Flag in cookies
자동 분석
MobSF
정적 분석
애플리케이션의 취약점 평가를 깔끔한 웹 기반 프런트엔드를 통해 수행합니다. 동적 분석도 수행할 수 있지만(환경을 준비해야 합니다).
docker pull opensecurity/mobile-security-framework-mobsf
docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest
Notice that MobSF can analyse Android(apk), IOS(ipa) and Windows(apx) applications (Windows applications must be analyzed from a MobSF installed in a Windows host).
Also, if you create a ZIP file with the source code if an Android or an IOS app (go to the root folder of the application, select everything and create a ZIPfile), it will be able to analyse it also.
MobSF also allows you to diff/Compare analysis and to integrate VirusTotal (you will need to set your API key in MobSF/settings.py and enable it: VT_ENABLED = TRUE
VT_API_KEY = <Your API key>
VT_UPLOAD = TRUE
). You can also set VT_UPLOAD
to False
, then the hash will be upload instead of the file.
Assisted Dynamic analysis with MobSF
MobSF can also be very helpful for dynamic analysis in Android, but in that case you will need to install MobSF and genymotion in your host (a VM or Docker won't work). Note: You need to start first a VM in genymotion and then MobSF.
The MobSF dynamic analyser can:
- Dump application data (URLs, 로그, clipboard, 당신이 찍은 screenshots, "Exported Activity Tester"가 찍은 screenshots, emails, SQLite databases, XML files, 그리고 생성된 다른 파일들). 스크린샷을 제외한 모든 항목은 자동으로 수행되며, 스크린샷은 캡처하고 싶을 때 버튼을 눌러야 하거나 모든 exported activities의 스크린샷을 얻기 위해 "Exported Activity Tester"를 눌러야 합니다.
- Capture HTTPS traffic
- Use Frida to obtain runtime information
From android versions > 5, it will automatically start Frida and will set global proxy settings to capture traffic. It will only capture traffic from the tested application.
Frida
By default, it will also use some Frida Scripts to bypass SSL pinning, root detection and debugger detection and to monitor interesting APIs.
MobSF can also invoke exported activities, grab screenshots of them and save them for the report.
To start the dynamic testing press the green bottom: "Start Instrumentation". Press the "Frida Live Logs" to see the logs generated by the Frida scripts and "Live API Monitor" to see all the invocation to hooked methods, arguments passed and returned values (this will appear after pressing "Start Instrumentation").
MobSF also allows you to load your own Frida scripts (to send the results of your Friday scripts to MobSF use the function send()
). It also has several pre-written scripts you can load (you can add more in MobSF/DynamicAnalyzer/tools/frida_scripts/others/
), just select them, press "Load" and press "Start Instrumentation" (you will be able to see the logs of that scripts inside "Frida Live Logs").
Moreover, you have some Auxiliary Frida functionalities:
- Enumerate Loaded Classes: 모든 로드된 클래스를 출력합니다
- Capture Strings: 애플리케이션 사용 중에 캡처된 모든 문자열을 출력합니다 (매우 noisy)
- Capture String Comparisons: 매우 유용할 수 있습니다. 비교되는 2개의 문자열을 보여주며 결과가 True인지 False인지 표시합니다.
- Enumerate Class Methods: 클래스 이름(예: "java.io.File")을 입력하면 해당 클래스의 모든 메서드를 출력합니다.
- Search Class Pattern: 패턴으로 클래스를 검색합니다
- Trace Class Methods: Trace a whole class (클래스의 모든 메서드의 입력과 출력을 확인). 기본적으로 MobSF는 여러 흥미로운 Android Api 메서드들을 trace 한다는 것을 기억하세요.
Once you have selected the auxiliary module you want to use you need to press "Start Intrumentation" and you will see all the outputs in "Frida Live Logs".
Shell
Mobsf also brings you a shell with some adb commands, MobSF commands, and common shell commands at the bottom of the dynamic analysis page. Some interesting commands:
help
shell ls
activities
exported_activities
services
receivers
HTTP 도구
HTTP 트래픽이 캡처되면 "HTTP(S) Traffic" 버튼에서 캡처된 트래픽의 보기 흉한 뷰를 보거나 "Start HTTPTools" 녹색 버튼에서 더 보기 좋은 뷰를 볼 수 있습니다. 두 번째 옵션에서는 send the captured requests to proxies like Burp or Owasp ZAP.
이를 위해, power on Burp --> turn off Intercept --> in MobSB HTTPTools select the request --> 버튼 "Send to Fuzzer"를 누른 다음 --> select the proxy address (http://127.0.0.1:8080\).
MobSF로 dynamic analysis를 마치면 "Start Web API Fuzzer"를 눌러 fuzz http requests 하여 취약점을 찾을 수 있습니다.
Tip
MobSF로 dynamic analysis를 수행한 후 프록시 설정이 잘못 구성되어 GUI에서 수정할 수 없을 수 있습니다. 프록시 설정은 다음을 실행하여 수정할 수 있습니다:
adb shell settings put global http_proxy :0
Inspeckage를 이용한 Assisted Dynamic Analysis
도구는 Inspeckage에서 얻을 수 있습니다.
이 도구는 일부 Hooks를 사용하여 dynamic analysis를 수행하는 동안 애플리케이션에서 무슨 일이 일어나는지 알려줍니다.
Yaazhini
이것은 GUI로 static analysis를 수행하기에 훌륭한 도구입니다
Qark
이 도구는 security related Android application vulnerabilities를 찾도록 설계되었으며, source code 또는 packaged APKs에서 동작합니다. 또한 이 도구는 capable of creating a "Proof-of-Concept" deployable APK 및 ADB commands를 생성하여 발견된 일부 취약점(Exposed activities, intents, tapjacking...)을 악용할 수 있습니다. Drozer와 마찬가지로 테스트 디바이스를 root할 필요는 없습니다.
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
- 참고하기 쉽도록 추출된 모든 파일을 표시
- APK 파일을 자동으로 Java 및 Smali 형식으로 디컴파일
- AndroidManifest.xml을 분석하여 일반적인 취약점 및 동작을 식별
- 일반적인 취약점 및 동작에 대한 정적 소스 코드 분석
- 기기 정보
- 등
reverse-apk relative/path/to/APP.apk
SUPER Android Analyzer
SUPER는 Windows, MacOS X 및 Linux에서 사용할 수 있는 명령줄 애플리케이션으로, 취약점을 찾기 위해 .apk 파일을 분석합니다.
이는 APK의 압축을 풀고 일련의 규칙을 적용하여 해당 취약점을 탐지함으로써 동작합니다.
모든 규칙은 rules.json
파일에 집중되어 있으며, 각 회사나 테스터는 필요한 분석을 위해 자체 규칙을 생성할 수 있습니다.
최신 바이너리는 download page에서 다운로드하세요.
super-analyzer {apk_file}
StaCoAn
StaCoAn은 모바일 애플리케이션에 대한 static code analysis을 수행하는 개발자, bugbounty hunters 및 ethical hackers를 돕는 크로스플랫폼 도구입니다.
개념은 모바일 애플리케이션 파일(.apk 또는 .ipa 파일)을 StaCoAn 애플리케이션에 드래그 앤 드롭하면 시각적이고 휴대 가능한 보고서를 생성해 준다는 것입니다. 설정과 wordlists를 조정하여 맞춤형 경험을 얻을 수 있습니다.
다운로드 latest release:
./stacoan
AndroBugs
AndroBugs Framework는 Android 취약점 분석 시스템으로, 개발자나 hackers가 Android 애플리케이션의 잠재적 보안 취약점을 찾는 데 도움을 줍니다.
Windows releases
python androbugs.py -f [APK file]
androbugs.exe -f [APK file]
Androwarn
Androwarn는 Android 애플리케이션이 수행할 수 있는 잠재적 악성 동작을 탐지하고 사용자에게 경고하는 것을 주요 목적으로 하는 도구입니다.
탐지는 애플리케이션의 Dalvik bytecode가 Smali로 표현된 것에 대해 androguard
라이브러리를 사용한 static analysis로 수행됩니다.
이 도구는 Telephony identifiers exfiltration, Audio/video flow interception, PIM data modification, Arbitrary code execution...과 같은 "bad" 애플리케이션의 일반적인 동작을 찾아냅니다.
python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
MARA Framework
MARA는 Mobile Application Reverse engineering 및 Analysis 프레임워크입니다. 이 도구는 일반적으로 사용되는 모바일 애플리케이션 리버스 엔지니어링 및 분석 도구들을 하나로 모아, OWASP 모바일 보안 위협에 대비해 모바일 애플리케이션을 테스트하는 데 도움을 줍니다. 목표는 이 작업을 모바일 애플리케이션 개발자와 보안 전문가에게 더 쉽고 친숙하게 만드는 것입니다.
다음 작업을 수행할 수 있습니다:
- 다양한 도구를 사용해 Java 및 Smali 코드를 추출합니다
- 다음 도구들을 사용해 APK를 분석합니다: smalisca, ClassyShark, androbugs, androwarn, APKiD
- regexps를 사용하여 APK에서 개인 정보를 추출합니다.
- Manifest를 분석합니다.
- 발견된 도메인을 다음 도구들로 분석합니다: pyssltest, testssl and whatweb
- APK의 난독화를 apk-deguard.com 을 통해 해제할 수 있습니다
Koodous
악성코드 탐지에 유용: https://koodous.com/
코드 난독화/난독화 해제
코드를 난독화하는 데 사용하는 서비스와 구성에 따라 시크릿이 난독화되거나 그렇지 않을 수 있다는 점에 유의하세요.
ProGuard
From Wikipedia: ProGuard는 Java 코드를 축소(shrink), 최적화(optimize) 및 난독화(obfuscate)하는 오픈 소스 명령줄 도구입니다. 바이트코드를 최적화하고 사용되지 않는 명령을 탐지 및 제거할 수 있습니다. ProGuard는 무료 소프트웨어이며 GNU General Public License 버전 2 하에 배포됩니다.
ProGuard는 Android SDK의 일부로 배포되며 애플리케이션을 릴리스 모드로 빌드할 때 실행됩니다.
DexGuard
APK 난독화 해제에 대한 단계별 가이드는 https://blog.lexfo.fr/dexguard.html에서 확인하세요.
(해당 가이드에서) 마지막으로 확인했을 때, Dexguard의 동작 방식은 다음과 같았습니다:
- 리소스를 InputStream으로 로드합니다;
- 결과를 FilterInputStream을 상속한 클래스에 전달하여 복호화합니다;
- 리버서의 시간을 몇 분 낭비시키기 위해 불필요한 난독화 작업을 합니다;
- 복호화된 결과를 ZipInputStream에 전달하여 DEX 파일을 얻습니다;
- 마지막으로
loadDex
메서드를 사용해 생성된 DEX를 Resource로 로드합니다.
DeGuard
DeGuard는 Android 난독화 도구가 수행한 난독화 과정을 역전시킵니다. 이를 통해 코드 검사 및 라이브러리 예측 등 다양한 보안 분석이 가능해집니다.
난독화된 APK를 해당 플랫폼에 업로드할 수 있습니다.
[Deobfuscate android App]https://github.com/In3tinct/deobfuscate-android-app
이 도구는 LLM을 사용해 android 앱의 잠재적 보안 취약점을 찾고 android 앱 코드를 난독화 해제하는 도구입니다. Google의 Gemini public API를 사용합니다.
Simplify
이는 범용 android 난독화 해제기입니다. Simplify는 앱을 가상으로 실행하여 동작을 이해한 뒤, 동작은 동일하게 유지하면서 사람이 이해하기 쉽게 코드를 최적화하려고 시도합니다. 각 최적화 유형은 단순하고 일반적이므로 특정 난독화 기법이 무엇인지에 상관없이 적용됩니다.
APKiD
APKiD는 APK가 어떻게 만들어졌는지에 대한 정보를 제공합니다. 많은 컴파일러, 패커, 난독화 도구, 기타 이상한 것들을 식별합니다. Android용 PEiD입니다.
Manual
Read this tutorial to learn some tricks on how to reverse custom obfuscation
실습
Androl4b
AndroL4b는 ubuntu-mate 기반의 Android 보안 가상 머신으로, 리버스 엔지니어링 및 맬웨어 분석을 위한 다양한 보안 전문가와 연구자들의 최신 프레임워크, 튜토리얼 및 실습 모음을 포함합니다.
참고자료
- https://owasp.org/www-project-mobile-app-security/
- https://appsecwiki.com/#/ 좋은 자료 모음입니다
- https://maddiestone.github.io/AndroidAppRE/ Android 빠른 강좌
- https://manifestsecurity.com/android-application-security/
- https://github.com/Ralireza/Android-Security-Teryaagh
- https://www.youtube.com/watch?v=PMKnPaGWxtg&feature=youtu.be&ab_channel=B3nacSec
- SSLPinDetect: Advanced SSL Pinning Detection for Android Security Analysis
- SSLPinDetect GitHub
- smali-sslpin-patterns
- Build a Repeatable Android Bug Bounty Lab: Emulator vs Magisk, Burp, Frida, and Medusa
- CoRPhone — Android in-memory JNI execution and packaging pipeline
{{#include ../../banners/hacktricks-training.md}}