본문으로 바로가기

안드로이드·갤럭시·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

 

Dalvik 바이트 코드  |  Android 오픈소스 프로젝트  |  Android Open Source Project

Dalvik 바이트 코드 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 일반 디자인 머신 모델과 호출 규칙은 일반적인 실제 아키텍처와 C 스타일 호출 규칙을 거

source.android.com

 

- 스말리 파일은 애플리케이션을 디컴파일하면 볼 수 있으며 아래와 같은 경로에서 찾을 수 있다.

- smali 파일 경로 : 디컴파일 홈 디렉터리 > smali > com > android > 애플리케이션 명


나. 취약점 대응방안

- 안드로이드 앱은 APK파일 디컴파일을 통해 누구든지 소스코드를 확인할 수 있다. 소스코드가 평문으로 저장되어 있으면 스말리 코드를 분석하는데 많은 도움이 되므로 *프로가드(Proguard)와 같은 소스코드 난독화 프로그램을 이용하여 소스코드를 쉽게 분석할 수 없도록 한다.

*프로가드 : 안드로이드 스튜디오에서 기본적으로 제공하는 소스코드 난독화 도구

 

- 앱의 Signing 키를 검증하는 등의 방식을 사용하여 무결성 검증 기능을 추가한다.

https://liapp.lockincomp.com/ko/blog/blog-Post/mobile-application-tampering-and-anti-tamper

 

[TECH] 모바일 앱 위변조와 방지 솔루션 - 위변조

모바일 어플리케이션(앱) 위변조와 발생의 원인과 사례 및 방지 기술에 대하여 설명합니다.

liapp.lockincomp.com

https://dktfrmaster.blogspot.com/2017/02/apk.html#google_vignette

 

[안드로이드] apk 위/변조 대비하기

현업 개발자로써 삽질하는 과정을 기록하는 블로그입니다.

dktfrmaster.blogspot.com

 

- 변조된 코드로 동작하는 리패키징 앱 실행 시 강제종료되도록 하여야 하며, 웹 통신으로 키를 검증하는 방식은 중간자공격에 의해 우회될 수 있으므로 주의하여야 한다.

 

- 무결성 검증 기능을 디버깅 툴을 이용해 우회할 수 없도록 안티디버깅 기능을 적용한다.

https://seo-security.tistory.com/19

 

[Android] 안티 디버깅(Anti-Debugging) 코드

안티 디버깅(Anti-Debugging) 앱 안티 디버깅은 특정 모바일 앱의 디버깅을 감지하고 방지하기 위한 기술 및 메커니즘의 사용을 의미합니다. 앱을 디버깅하면 실행 중 동작을 분석하고 이해할 수 있

seo-security.tistory.com

 

다. 취약점 실습

1. 분석 대상 앱 설치

- 실습을 위해 인시큐어뱅크 애플리케이션을 설치한다.

※ 인시큐어뱅크 앱이 설치되어있지 않은 사람은 아래의 글을 참고하여 앱을 설치하길 바란다.

2023.04.10 - [Mobile App 취약점 진단/AOS App 진단] - 인시큐어뱅크 앱 설치 및 실행 방법 정리(InsecureBankv2)

 

인시큐어뱅크 앱 설치 및 실행 방법 정리(InsecureBankv2)

1. 인시큐어뱅크 앱 이란? - 모바일 뱅킹 취약점 진단을 위한 테스트 용도로 제작된 애플리케이션이다. - 안드로이드 앱 취약점 진단을 실습할 수 있는 환경을 제공한다. - 2019년 이후로 업데이트

hagsig.tistory.com

 

2. 진단 대상 앱 apk 파일 추출

- 아래의 링크를 참고하여 인시큐어뱅크 앱으로부터 apk 파일을 추출한다.

안드로이드 앱(app)으로부터 apk 파일 추출 방법 정리

 

안드로이드 앱(app)으로부터 apk 파일 추출 방법 정리

1. apk 파일이란? - 안드로이드(Android) OS에 애플리케이션(Application, App)을 설치할 수 있는 파일이다. - 윈도우 OS의 설치파일(exe, msi)같은거라 생각하면 쉽다. 2. apk 파일을 추출해야하는 이유 - 취약

hagsig.tistory.com

 

3. APK파일 디컴파일 

- 아래의 게시글을 참고하여 추출한 APK파일을 디컴파일 한다.

[AOS App 취약점 진단 · 모의해킹] - 안드로이드 APK 파일 디컴파일/리패키징 방법

 

안드로이드 APK 파일 디컴파일/리패키징 방법

1. 디컴파일/리패키징 이란? 1.1. 컴파일(compile) - 소스코드(source code)에서 기계가 인식할 수 있는 바이너리(binary) 파일로 변환하는 과정을 말한다. - 안드로이드는 컴파일 이후 패키징(packaging)과 코

hagsig.tistory.com

 

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

 

Release 1.4.7 · skylot/jadx

Features [core] Inline lambdas by instance field (#1800) [plugins] Allow to load classes using input stream or byte array in jadx-input plugin (#1457) Bug Fixes [core] Restore missing type param...

github.com

 

- 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 파일 디컴파일/리패키징 방법

1. 디컴파일/리패키징 이란? 1.1. 컴파일(compile) - 소스코드(source code)에서 기계가 인식할 수 있는 바이너리(binary) 파일로 변환하는 과정을 말한다. - 안드로이드는 컴파일 이후 패키징(packaging)과 코

hagsig.tistory.com

 

- 변조한 APK파일을 디바이스에 *설치한다.

*Nox일 경우 드래그 앤 드롭으로 간편하게 설치할 수 있고, 물리적 디바이스일 경우 adb install 명령어를 통해 설치할 수 있다.

 

- 변조한 APK파일을 실행하면 이전과는 다르게 본인이 변조한 문구가 출력되는 것을 확인할 수 있다.