본문으로 바로가기

안드로이드·갤럭시·AOS 애플리케이션 취약점진단/모의해킹 무료 강의 학식(hagsig)

 

가. 취약점 정의

- 애플리케이션 실행 중에 동작을 조작하여 정상적인 결과가 아닌 공격자가 원하는 결과가 되도록 하는 것을 런타임 조작이라 한다.

 

- 런타임 조작으로 클라이언트에서만 검증하는 보호 조치를 우회하거나 권한상승 등의 공격이 가능하다.

 

- *AndroidManifest.xml 파일의 *android:debuggable 속성이 true로 설정된 경우 런타임 조작이 가능해진다.

*AndroidManifest.xml : Android가 앱을 실행하기 위해 알아야 하는 앱의 모든 컴포넌트가 정의되어 있는 파일

*android:debuggable : 애플리케이션 디버그 가능 여부를 설정할 수 있는 속성으로 기본적으로 false로 설정됨

#취약한 debuggable 설정 예시
<application 
	android:debuggable="true">
</application>

 

- 안드로이드의 런타임 조작은 Frida와 adb를 통해 수행할 수 있다.

 

나. 취약점 대응방안(조치방법)

- 메니페스트 파일의 debuggable 속성을 false로 설정한다.

#안전한 debuggable 설정 예시
<application 
	android:debuggable="false">
</application> 

 

- debuggable 속성을 true로 설정하여 리패키징할 경우 런타임 조작이 가능해지므로 무결성 검증을 통해 변조된 앱에서의 실행이 불가능하도록 조치한다.

 

- 아래의 링크에 적인 안티 디버깅 코드를 쓰레드로 구현하여 주기적으로 디버깅 중인지를 탐지하도록 해야 한다.
https://seo-security.tistory.com/19

 

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

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

seo-security.tistory.com

 

- 런타임 조작을 통한 권한상승 또는 타인의 정보를 변경할 수 없도록 서버단(백엔드)에서 권한을 한번 더 검증할 수 있도록 한다.

 

- 소스코드를 난독화하여 공격자가 소스코드를 통해 런타임 조작을 쉽게 할 수  없도록 한다.

 

다. ADB를 이용한 취약점 실습

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. JADX를 이용하여 APK파일 분석

- 아래의 링크에 접속하여 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파일을 연다음, *AndroidManifest.xml 파일을 열람한다.

* AndroidManifest.xml 파일 경로 : InsecureBankv2.1.0.apk → 리소스 → AndroidManifest.xml 

 

4. debuggable  설정 확인

- debuggable 속성이 false로 설정되어 있는지 확인한다.

※ 만약  debuggable 속성이 false로 설정되어져 있다면 true로 수정하여 리컴파일한 다음, 변조한 앱으로 런타임 조작을 시도하여야 한다.

 

5. 공격 포인트 탐색

- jack 계정으로 로그인해 보면 자신의 패스워드를 변경할 수 있는 기능이 존재하는 것을 확인할 수 있다.

//인시큐어뱅크 기본 계정정보(default ID/PW)
username : dinesh
password : Dinesh@123$

username : jack
password : Jack@123$

 

- ChangePassword 소스를 보면 *onCreate() 함수의 85번 라인에서 uname을 입력받고, 해당 계정에 대한 패스워드를 변경할 수 있는 것을 알 수 있다.

*onCreate() : 액티비티 실행 시 제일먼저 실행되는 함수

 

- 여기서 만약 uname을 타인의 계정으로 변조하여 패스워드를 변경할 수 있다면, 계정을 탈취할 수 있으므로 해당 페이지를 공격 포인트로 삼는다.

 

- 만약 소스코드 난독화가 매우 심하여 코드 분석이 불가능한 경우에는 *smlie코드를 분석하여 공격 포인트를 탐색한다.

*smali code : An assembler/disassembler for Android’s dex format의 약자로 DEX 바이너리를 사람이 읽을 수 있도록 표현한 언어이다.

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

 

- smali코드에서도 85번 라인에서 변수 uname에 string 값을 입력받아 저장하는 것을 알 수 있다.

 

6. 런타임 조작을 위한 사전준비

- 인시큐어뱅크 앱이 사용 중인 프로세스 번호(PID)를 알아내기 위해 아래의 명령어 중 하나를 실행한다

*jdwp : Java Debug Wire Protocol의 약자로 자바 애플리케이션의 디버깅에 사용되는 adb 기능 중 하나이다.

#jdwp는 실행중인 모든 앱에대한 PID가 출력되므로 adb ps 명령어를 사용하는 것을 추천한다
adb jdwp

adb ps

 

- 인시큐어뱅크 앱의 PID를 로컬 PC의 Port로 연결하여 포트포워딩을 준비한다.

*forward : jdwp forward를 사용하여 애플리케이션 프로세스 아이디를 통해 디버깅을 할 수 있다.

#명령어 형식
adb forward tcp:[localhost port] jdwp:[process port]

#명령어 예시
adb forward tcp:1111 jdwp:4181

※ 명령이 실행 결과로 localhost port가 화면에 출력되지 않는 경우, 해당 포트가 현재 사용 중이므로 포트포워딩이 실패한 것이다.

 

- jdb.exe를 이용하여 포트포워딩된 포트로의 연결을 끝으로 런타임 조작을 위한 사전준비를 마친다.

*connect : 디바이스와 연결할 수 있게 해주는 명령어

#명령어 형식
jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=[localhost port]

#명령어 예시
jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=1111

 

7. 런타임 조작 수행

- ChangePassword 파일의 86번 라인에 breakpoint를 지정한다.

#라인 브레이크 포인트 지정 명령어 예시
stop at com.android.insecurebankv2.ChangePassword:86

 

- breakpoint 지정 후 'change password'버튼을 클릭한다.

 

- 'change password' 버튼을 클릭하면 main[1]이라는 쉘이 출력되면서 디버깅 명령어를 수행할 수 있게 된다.

- 디버깅 명령어를 아래와 같이 사용하여 uname을 현재 로그인된 계정인 jack에서 타인의 계정인 dinesh로 변경한다.

#uname에 저장된 변수 값을 확인한다.
main[1] print this.uname

#uname에 dinesh 문자열을 저장한다.
main[1] set this.uname="dinesh"

#브레이크타임을 해제하여 앱이 정상실행 되도록 한다.
main[1] run

 

※ 브레이크 포인트에서 사용할 수 있는 디버깅 명령어는 아래와 같다.

명령어
기능
next
다음 라인 실행
local
현재 로컬 영역 변수 보기
threads
현재 실행중인 스레드 확인
methods
해당 클래스가 사용하는 모든 메서드 출력
stop in
특정 메서드에서 브레이크 포인트 설정
print
특정 변수의 값 출력
eval
자바코드 실행
run
현재 브레이크 포인트 무시하고 실행
set
특정 변수의 값을 지정

 

- 런타임 조작을 통해 현재 로그인된 나의 계정인 jack대신 dinesh 계정이 입력된 것을 확인할 수 있다.

 

- 변경하고자 하는 패스워드를 입력하고 'Change Password'를 누르면 로그인한 jack 계정이 아닌 dinesh 계정의 패스워드가 변경된 것을 확인할 수 있다.

※ 패스워드는 대/소문자, 특수문자, 숫자 중 3가지 이상으로 조합하여야 오류 없이 저장된다.

 

- 변경된 패스워드로 dinesh 계정에 로그인이 가능한 것을 확인할 수 있다.

 

[참고]

- 브레이크 포인트를 라인이 아닌 함수에 지정하고 싶은 경우 아래와 같이 명령어를 사용하면 된다.

#함수 브레이크 포인트 지정 명령어 예시
stop in com.android.insecurebankv2.ChangePassword.onCreate

 

- 브레이크포인트에서 next 명령어를 사용하여 한 라인씩 점검하며 넘어갈 수 있다.

 

라. Frida를 이용한 취약점 실습

- Frida를 이용한 취약점 실습은 아래의 게시글을 참고하길 바란다.

[AOS App 취약점 진단 · 모의해킹] - [런타임 조작 실습] FridaLab 설치 및 문제풀이 과정 정리

 

[런타임 조작 실습] FridaLab 설치 및 문제풀이 과정 정리

가. 런타임 조작 취약점 및 대응방안 - 런타임 조작에 대한 설명 및 대응방안은 아래의 게시글을 참고하길 바란다. [Mobile App 취약점 진단 · 모의해킹] - [AOS 취약점 진단] 14강 - 런타임 조작 취약

hagsig.tistory.com