안드로이드·갤럭시·AOS 애플리케이션 취약점진단/모의해킹 무료 강의 학식(hagsig)
가. 취약점 정의
1. 애플리케이션 패칭 취약점이란?
- 애플리케이션의 코드를 변경하여 비정상적으로 작동되도록 APK파일을 변조하는 것을 말한다.
- 해당 취약점을 이용하여 루팅탐지와 같은 보안설정을 우회할 수 있다.
- 나아가 사용자의 개인/금융정보 등을 탈취할 수 있도록 APK파일을 변조 후 재배포하는 경우도 존재한다.
- 앱 무결성 검증을 하지 못해 발생하는 취약점이므로 애플리케이션 무결성 검증 취약점 이라고도 부른다.
2. 코드 변조란?
- 애플리케이션을 디컴파일하여 이미지, AndroidManifest.xml파일, smali파일 등을 변조하는 것을 말한다.
2.1. 매니페스트 파일 변조
- AndroidManifest.xml 파일을 말하는 것으로 Android가 앱을 실행하기 위해 알아야 하는 앱의 모든 컴포넌트가 정의되어 있는 파일이다.
- 매니페스트 파일에 있는 컴포넌트의 설정을 변경하여 디버깅 및 리패키징을 가능하게 할 수 있다.
2.2 smali 파일 변조
- An assembler/disassembler for Android’s dex format의 약자로 DEX 바이너리를 사람이 읽을 수 있도록 표현한 언어이다.
- 스말리(smali)파일은 *달빅(Dalvik) 바이트 코드로 작성되어져 있다.
*달빅 바이트 코드 : 안드로이드 운영체제에서 Java 응용 프로그램을 실행하기 위해 사용하는 바이트 코드의 일종
- 안드로이드는 Java 응용 프로그램을 직접 실행하지 않고, 달빅(Dalvik)이라는 가상 머신(Dalvik Virtual Machine, DVM)에서 실행하므로 자바 바이트 코드(.class 파일)를 변환하여 달빅 바이트 코드(.dex 파일) 형식으로 실행한다.
- 리버싱을 할 때 어셈블리어를 알아야 하듯 안드로이드 리버싱을 할 때에서는 달빅 바이트 코드를 알아야 한다.
https://source.android.com/docs/core/runtime/dalvik-bytecode?hl=ko
- 스말리 파일은 애플리케이션을 디컴파일하면 볼 수 있으며 아래와 같은 경로에서 찾을 수 있다.
- smali 파일 경로 : 디컴파일 홈 디렉터리 > smali > com > android > 애플리케이션 명
나. 취약점 대응방안
- 안드로이드 앱은 APK파일 디컴파일을 통해 누구든지 소스코드를 확인할 수 있다. 소스코드가 평문으로 저장되어 있으면 스말리 코드를 분석하는데 많은 도움이 되므로 *프로가드(Proguard)와 같은 소스코드 난독화 프로그램을 이용하여 소스코드를 쉽게 분석할 수 없도록 한다.
*프로가드 : 안드로이드 스튜디오에서 기본적으로 제공하는 소스코드 난독화 도구
- 앱의 Signing 키를 검증하는 등의 방식을 사용하여 무결성 검증 기능을 추가한다.
https://liapp.lockincomp.com/ko/blog/blog-Post/mobile-application-tampering-and-anti-tamper
https://dktfrmaster.blogspot.com/2017/02/apk.html#google_vignette
- 변조된 코드로 동작하는 리패키징 앱 실행 시 강제종료되도록 하여야 하며, 웹 통신으로 키를 검증하는 방식은 중간자공격에 의해 우회될 수 있으므로 주의하여야 한다.
- 무결성 검증 기능을 디버깅 툴을 이용해 우회할 수 없도록 안티디버깅 기능을 적용한다.
https://seo-security.tistory.com/19
다. 취약점 실습
1. 분석 대상 앱 설치
- 실습을 위해 인시큐어뱅크 애플리케이션을 설치한다.
※ 인시큐어뱅크 앱이 설치되어있지 않은 사람은 아래의 글을 참고하여 앱을 설치하길 바란다.
2023.04.10 - [Mobile App 취약점 진단/AOS App 진단] - 인시큐어뱅크 앱 설치 및 실행 방법 정리(InsecureBankv2)
2. 진단 대상 앱 apk 파일 추출
- 아래의 링크를 참고하여 인시큐어뱅크 앱으로부터 apk 파일을 추출한다.
안드로이드 앱(app)으로부터 apk 파일 추출 방법 정리
3. APK파일 디컴파일
- 아래의 게시글을 참고하여 추출한 APK파일을 디컴파일 한다.
[AOS App 취약점 진단 · 모의해킹] - 안드로이드 APK 파일 디컴파일/리패키징 방법
4. AndroidManifest.xml 속성 값 확인
- 리패키징 홈 디렉터리에 존재하는 AndroidManifest.xml 파일을 메모장으로 열어 아래에 나열된 속성의 값을 수정한다.
1) extractNativeLibs 속성의 값을 false에서 true로 변경한다.
2) requiredSplitTypes 속성을 삭제하거나 주석처리한다.
3) splitTypes 속성을 삭제하거나 주석처리한다.
#extractNativeLibs 예시
#수정 전
<application
android:extractNativeLibs="false">
</application>
#수정 후
<application
android:extractNativeLibs="true">
</application>
#requiredSplitTypes 예시
#수정 전
<manifest xmlns:android="OOO" android:requiredSplitTypes="value" package="com.OOO.OOO">
#수정 후
<manifest xmlns:android="OOO" package="com.OOO.OOO">
#splitTypes 예시
#수정 전
<manifest xmlns:android="OOO" android:splitTypes="value" package="com.OOO.OOO">
#수정 후
<manifest xmlns:android="OOO" package="com.OOO.OOO">
※ extractNativeLibs 속성의 값을 수정하지 않을 경우 apk 파일 설치 시 "어플 설치 실패"라는 오류 발생 또는 설치된 앱이 실행되지 않는 오류가 발생한다.
※ 경로 내에 한글이 존재할 경우 아래와 같은 오류가 발생하며 컴파일이 정상적으로 수행되지 않는다.
W: C:\Users\username\Desktop\?⑥씠釉?apktool\apkname\res: error: failed to open directory: 吏?뺣맂 ?뚯씪??李얠쓣 ???놁뒿?덈떎. (2).떎. (2).
brut.androlib.exceptions.AndrolibException: brut.common.BrutException: could not exec (exit code = 1): [C:\Users\username\AppData\Local\Temp\brut_util_Jar_0000.tmp, compile, --dir, C:\Users\username\apktool\apkfilenameE\res, --legacy, -o, C:\Users\username\apktool\apkfilename\build\resources.zip]
※ requiredSplitTypes, splitTypes 속성을 삭제하지 않고 컴파일할 경우 아래와 같은 오류가 발생한다.
W: C:\Users\username\Desktop\apktool\apkname\AndroidManifest.xml:1: error: attribute android:requiredSplitTypes not found. W: C:\Users\username\Desktop\apktool\apkname\AndroidManifest.xml:1: error: attribute android:splitTypes not found. W: error: failed processing manifest. brut.androlib.exceptions.AndrolibException: brut.common.BrutException: could not exec (exit code = 1): [C:\Users\username\AppData\Local\Temp\brut_util_Jar_0000.tmp, link, -o, C:\Users\username\AppData\Local\Temp\APKTOOL0000.tmp, --package-id, 000, --min-sdk-version, 00, --target-sdk-version, 00, --version-code, 00, --version-name, 0.0.0, --no-auto-version, --no-version-vectors, --no-version-transitions, --no-resource-deduping, --allow-reserved-package-id, --no-compile-sdk-metadata, --warn-manifest-validation, -e, C:\Users\username\AppData\Local\Temp\APKTOOL0000.tmp, -0, arsc, -I, C:\Users\username\AppData\Local\apktool\framework\1.apk, --manifest, C:\Users\username\Desktop\apktool\apkname\AndroidManifest.xml, C:\Users\username\Desktop\apktool\apkname\build\resources.zip]
5. 변조 포인트 탐지
- 본인이 변조하고자 하는 기능을 정한 뒤 소스코드를 분석하여 스말리 코드의 어느 부분을 변조하면 되는지 탐색하는 과정이다.
※ 만약 본인이 무결성 검증 기능이 존재하는지 확인만 하고 싶은 거라면 아래의 모든 과정을 생략하고 APK파일을 리패키징한 다음 설치 및 실행하여 정상 동작하는지만 확인하면 된다.
- 본글에서는 인시큐어뱅크 앱 로그인 후 메인화면에 출력되는 Text 문구를 변조하여 볼 것이다.
#인시큐어뱅크 기본 계정정보(default ID/PW)
username : dinesh
password : Dinesh@123$
username : jack
password : Jack@123$
6. 코드 분석
- 아래의 링크에 접속하여 jadx-gui-x.x.x-with-jre-win.zip 파일을 다운로드한 뒤, 압축을 해제한다.
https://github.com/skylot/jadx/releases/tag/v1.4.7
- jadx-gui-x.x.x.exe를 실행한 뒤 위에서 추출한 인시큐어뱅크 apk파일을 로드한 다음, "Rooted Device!!"을 검색한다.
- 소스코드를 분석하니 isrooted 변수에 저장된 값에 따라 출력되는 문자가 달라지는 것 같다.
※ isrooted에 저장되는 값을 변조하여 루팅탐지 우회를 할 수도 있으나, 그것은 루팅탐지 우회 강의에서 다룰 내용이므로 본글에서는 출력되는 문구 자체를 수정해 볼 것이다.
아래의 *경로에 진입하뒤 PostLogin.smali 파일을 메모장으로 연다.
*경로 : InsecureBankv2\smali\com\android\insecurebankv2\PostLogin.smali
- "line 90"을 검색하여 소스코드 분석을 통해 알아낸 변조 포인트를 스말리 파일에서 찾아낸다.
- "Rooted Device!!" 문구를 본인이 변조하고 싶은 문구로 변조한 뒤 저장한다.
- 아래의 게시글을 참고하여 변조한 파일을 리패키징/인증서를 씌운다.
[AOS App 취약점 진단 · 모의해킹] - 안드로이드 APK 파일 디컴파일/리패키징 방법
- 변조한 APK파일을 디바이스에 *설치한다.
*Nox일 경우 드래그 앤 드롭으로 간편하게 설치할 수 있고, 물리적 디바이스일 경우 adb install 명령어를 통해 설치할 수 있다.
- 변조한 APK파일을 실행하면 이전과는 다르게 본인이 변조한 문구가 출력되는 것을 확인할 수 있다.
'Mobile App 취약점 진단 · 모의해킹 > AOS App 취약점 진단 · 모의해킹' 카테고리의 다른 글
Android UnCrackable Level 1 문제풀이 (0) | 2024.02.25 |
---|---|
[AOS 취약점 진단] 16강 - 루팅 탐지 우회 취약점 점검 (0) | 2024.02.25 |
[런타임 조작 실습] FridaLab 설치 및 문제풀이 과정 정리 (0) | 2024.02.19 |
[AOS 취약점 진단] 14강 - 런타임 조작 취약점 점검(Frida/ADB) (0) | 2024.02.19 |
[AOS 취약점 진단] 13강 - 웹 취약점 점검(SSL Pinning 우회) (0) | 2024.02.04 |