안드로이드·갤럭시·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
- 런타임 조작을 통한 권한상승 또는 타인의 정보를 변경할 수 없도록 서버단(백엔드)에서 권한을 한번 더 검증할 수 있도록 한다.
- 소스코드를 난독화하여 공격자가 소스코드를 통해 런타임 조작을 쉽게 할 수 없도록 한다.
다. ADB를 이용한 취약점 실습
1. 분석 대상 앱 설치
- 실습을 위해 인시큐어뱅크 애플리케이션을 설치한다.
※ 인시큐어뱅크 앱이 설치되어있지 않은 사람은 아래의 글을 참고하여 앱을 설치하길 바란다.
2023.04.10 - [Mobile App 취약점 진단/AOS App 진단] - 인시큐어뱅크 앱 설치 및 실행 방법 정리(InsecureBankv2)
2. 진단 대상 앱 apk 파일 추출
- 아래의 링크를 참고하여 인시큐어뱅크 앱으로부터 apk 파일을 추출한다.
안드로이드 앱(app)으로부터 apk 파일 추출 방법 정리
3. JADX를 이용하여 APK파일 분석
- 아래의 링크에 접속하여 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파일을 연다음, *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 설치 및 문제풀이 과정 정리
'Mobile App 취약점 진단 · 모의해킹 > AOS App 취약점 진단 · 모의해킹' 카테고리의 다른 글
[AOS 취약점 진단] 15강 - 애플리케이션 패칭/앱 무결성 검증 취약점 (0) | 2024.02.19 |
---|---|
[런타임 조작 실습] FridaLab 설치 및 문제풀이 과정 정리 (0) | 2024.02.19 |
[AOS 취약점 진단] 13강 - 웹 취약점 점검(SSL Pinning 우회) (0) | 2024.02.04 |
안드로이드 프리다 서버/클라이언트 설치방법 (0) | 2024.02.03 |
[AOS 취약점 진단] 12강 - 취약한 콘텐츠 프로바이더 점검 (0) | 2024.01.21 |