나의 성장기 보안/코딩$

Android Pentest 2 - Android 개론

Android Pentesting Education(ELMS)
@2021-10-26 01:28:42

보호글입니다.
비밀번호를 입력하셔야 내용을 보실 수 있습니다.


Android Pentest 1 - Android 교육과정 소개

Android Pentesting Education(ELMS)
@2021-10-26 01:03:02

보호글입니다.
비밀번호를 입력하셔야 내용을 보실 수 있습니다.


안드로이드 진단 - Activity 컴포넌트 취약점

App 진단
@2021-10-25 16:58:49

Activity

액티비티(Activity)는 안드로이드 화면에 보여지는 것으로 사용자와 상호작용하여 데이터를 입력 받거나 정보를 보여주는 컴포넌트이다.

 

네이버 앱을 실행하면 로그인 화면이 뜨게 되고, 사용자에게 아이디와 비밀번호를 입력 받는다.

입력한 값이 일치하면 정상적으로 로그인이 되어 메인 메뉴가 실행되고, 사용자는 제공하는 기능 중 하나를 클릭하면 해당 기능을 이용할 수 있다.


<activity>태그 취약점

만일 Activity이름이 ChangePassword이고, Exported 속성이 true로 설정되어 있으므로 외부에 노출된다.

즉, 무슨소리냐면 원래는 로그인 후 패스워드를 변경해야 하지만 로그인 과정 없이 비밀번호 변경 화면을 실행할 수 있다.

 

정상적인 과정으로 패스워드 변경 로직을 이용하면 현재 로그인 한 사용자의 아이디로 설정된다. 하지만, 액티비티 강제 호출을 이용하면 newpassword가 null로 설정된다.

 

안드로이드 진단 - AndroidManifest.xml파일

App 진단
@2021-10-25 14:50:01

AndroidManifest파일 분석

AndroidManifest.xml이란 애플리케이션에 대한 필수적인 정보들을 안드로이드 System에 알려주는 설정파일이라고 생각하면 된다. AndroidManifest.xml파일 안에는 애플리케이션 component(Activity, Service, intent, content provider, brodcast Receivers)에 대한 노드를 포함하고 있다. apk파일 압축을 해제하면 AndroidManifest.xml 파일을 확인할 수 있다.

 


적절한 앱 퍼미션 설정 여부

1. 파일에 명시되어 있는 권한과 실제 App의 기능상 필요한 권한 비교

: APK 파일 내 AndroidManifest.xml 파일에 App이 사용하는 권한이 <user-permission>으로 명시되어 있다.

파일에 명시되어 있는 권한에 위험도가 높은 퍼미션을 사용할 경우 취약한 것으로 식별한다.

 

위험도가 높은 권한

안드로이드 6.0 Version이후부터 앱에서 필요한 권한이 존재할 때 사용자로부터 권한을 받게되었다.(이전에는 설치할 때 필요한 권한을 요구하는 로직이였음)

ACCESS_COARSE_LOCATION 네트워크(Wi-Fi, 3G, 4G등)을 이용하여 단말기 위치를 식별한다.
ACCESS_FINE_LOCATION GPS와 네트워크를 이용한다. 때문에 ACCESS_FINE_LOCATION을 사용하면 더 정확한 위치를 알 수 있다.
AUTHENTICATE_ACCOUNTS 앱이 계정 생성, 암호 가져오기 및 설정을 포함하여 AccountManager의 계정 인증자의 기능을 사용할 수 있게한다.
BLUETOOTH 페어링 된 기기와 데이터를 송수신할 때 필요하다.
BLUETOOTH_ADMIN 환경설정에서 해주어야 하는 블루투스 관련 작업을 앱에서 수행할 때 필요하다.
CALL_PHONE 앱에서 전화걸기 권한을 허용한다.
CAMERA 앱에서 카메라 기능을 허용한다.
Change_configuration 앱이 언어 또는 전체 글꼴 크기와 같은 현재 구성을 변경할 수 있도록 허용합니다.
Change_Network_state 앱이 네트워크 연결 상태를 변경할 수 있도록 한다.
Change_Wifi_Multicast_state 앱이 Wi-Fi 멀티캐스트 모드로 들어갈 수 있도록 한다.
Change_Wifi_State 앱이 Wi-Fi 연결 상태를 변경할 수 있도록 한다.
GET_TASKS API Level 21에서 제거
ACCOUNT_MANAGER 앱이 AccountAuthenticators(계정인증자)를 호출하도록 허용한다.
Modify_Audio_Settings 앱이 전체 오디오 설정을 수정할 수 있도록 한다.
Modify_Phone_State 앱이 전원 켜기, mmi등 전화 상태를 수정할 수 있다.
READ_CALENDAR 앱이 사용자의 캘린더 데이터를 읽을 수 있도록 합니다.
READ_CONTACTS 앱이 사용자의 연락처 데이터를 읽을 수 있도록 허용합니다.
READ_LOGS 앱이 사용자의 통화 기록을 읽을 수 있도록 합니다.
READ_PHONE_STATE 앱이 현재 셀룰러 네트워크 정보, 진행 중인 통화 상태 및 PhoneAccount 장치에 등록된 모든 목록을 포함하여 전화 상태에 대한 읽기 전용 액세스를 허용합니다.
READ_SMS 앱이 SMS 메시지를 읽을 수 있도록 허용합니다.
READ_EXTERNAL_STORAGE 앱이 외부 저장소에서 읽을 수 있도록 허용합니다.
RECEIVE_MMS 앱이 수신 MMS 메시지를 모니터링하도록 허용합니다.
RECEIVE_SMS 앱이 SMS 메시지를 수신하도록 허용합니다.
RECORD_AUDIO 앱이 오디오를 녹음하도록 허용합니다.
SEND_SMS 앱이 SMS 메시지를 보낼 수 있도록 허용합니다.
WRITE_APN_SETTINGS 앱이 apn 설정을 작성하고 사용자 및 비밀번호와 같은 기존 apn 설정의 민감한 필드를 읽을 수 있도록 합니다.
WRITE_CALENDAR 앱이 사용자의 캘린더 데이터를 쓸 수 있도록 허용합니다.
WRITE_CONTACTS 앱이 사용자의 연락처 데이터를 쓸 수 있도록 합니다.
WRITE_EXTERNAL_STORAGE 앱이 외부 저장소에 쓸 수 있도록 합니다.
WRITE_SETTINGS 앱이 시스템 설정을 읽거나 쓸 수 있도록 합니다.
WRITE_SYNC_SETTINGS 앱이 동기화 설정을 쓸 수 있도록 허용합니다.
USE_FINGERPRINT API LEVEL 28에서 더 이상 사용하지 않음 USE_BIOMETRIC을 대신 요청

https://developer.android.com/reference/android/Manifest.permission

 

Manifest.permission  |  Android Developers

 

developer.android.com

위의 Site를 참조할 경우 현재 지원하는 User Pemission에 대한 설정을 볼 수 있다.


Android 4대 컴포넌트(BroadCast Receiver)

BroadCastReceiver는 4대 컴포넌트 중에 하나이다.

BroadCastReceiver의 역할은 단말기 안에서 이루어지는 수많은 일들을 대신해서 알려준다.

예를들어 배터리부족, SMS문자메시지, 전화가온다거나 하는 일들을 방송알림 해준다.

 

System이 보내고 앱이 받는 경우가 일반적이나, 앱이 앱에게 보내는 것도 가능하다. 즉, 앱간 통신수단으로 사용할 수 있다.

BroadCastReceiver를 구현하기 위해 2가지 방법이 존재한다. 코드상에서 BroadCastReceiver를 등록하는 동적인방법과 Manifest.xml에 <Receiver></Receiver>의 형태로 등록하는 정적인 방법이 존재한다.

 

1. 정적으로 Receiver 구현하기

Manifest.xml에 우선 BroadCastReceiver를 등록한다.

폴더 구조를 맞춰 작성한 후 .receiver.MyBroadCastReceiver 형식으로 name을 선언한다. 또한 BroadCastReceiver가 Action이벤트를 받도록 <Action> 태그를 등록한다.

현재 디렉토리의 Receiver폴더 하위의 MyBroadCastReceiver호출
Reciver가 Action 이벤트를 받도록 <action>태그 정의

 

그 후 BroadCastReceiver를 상속받아 onReceive()메서드를 오버라이딩한다.

onReceive()메서드는 intent-filter를 통해 걸러진 intent를 받아들이는 곳이다.

걸러진 intent의 Action값을 토스트로 띄우도록 코드를 짠다.

onReceive Method 정의 후 필터링된 Action값을 토스트로 띄움

그 후 sendBroadCast를 인위적으로 발생시켜 해당 intent가 intent필터를 걸쳐 잘 걸러져서 BroadCastReceiver가 받는지 확인

 

2. 동적으로 Receiver 구현

안드로이드 진단 - firebase_crashlytics 에러 메시지

App 진단
@2021-10-25 14:22:32

보호글입니다.
비밀번호를 입력하셔야 내용을 보실 수 있습니다.


안드로이드 진단 - 루팅 우회 (Google SafetyNet)

App 진단
@2021-10-25 11:11:04

보호글입니다.
비밀번호를 입력하셔야 내용을 보실 수 있습니다.


안드로이드 진단 - 난독화 솔루션에 대하여...

App 진단
@2021-10-25 00:55:25

난독화 솔루션의 종류

1. 에러기반 난독화

  • 리패키징 방지 기능
  • 오픈소스 APKProtect가 존재함(취약점이 발견되어 개발 중단되었음)

Smali 코드에서 Java Code로 변환할 때 사용되는 Dex2jar Tool의 에러를 유발시킴

2. 소스코드기반 난독화

  • 자바 코드의 Class, Method, Field, 변수명을 임의의 문자(a, b, c)로 치환
  • 오픈소스 ProGuard가 존재

3. 문자열기반 난독화

  • 중요 정보를 다루는 평문의 문자열을 암호화하여 숨김(대칭키)
  • 꼭 필요한 구간에 난독화를 적용해야 하며, 모든 곳에 적용하면 앱 설치 및 기능이 정상적으로 동작하지 않는다.
  • 상용 솔루션 존재

4. 멀티덱스기반 난독화

  • 실질적인 App을 구동하기 위한 코드, 원본 코드가 존재
  • 원본 Code는 Resource파일에 암호화해서 숨긴다.
  • 상용 Dexguard가 존재한다.

소스코드 및 멀티덱스 난독화 (난독화 솔루션)

1. ProGuard

  • 대표적인 소스코드 난독화 솔루션이다.
  • 특정 프로그램을 이용하면 일부 난독화 해제 기능을 제공한다.
  • 분석가는 특정 프로그램을 이용하지 않는다.(경험으로인하여 평문 수준의 소스코드 확인이 가능하다.)

2. DexGuard

  • 대표적인 멀티덱스 상용 난독화 솔루션이다.
  • 실제 앱을 구동하기 위한 코드를 숨기거나 삭제할 때 취약점이 발생한다. (취약점 조치)

쓰레기 코드 삽입(코딩)

불필요한 Class, Method, overriding, 변수 등 쓰레기 코드 삽입

앱 구동 시 필요한 코드, 비슷한 코드, 의미 없는 코드등 삽입

전혀 의미 없는 암호화 코드 삽입

 

중요 변수 인코딩/암호화(코딩)

아이디, 패스워드, 결재, 대칭키, 서명 값 등 중요 정보를 다루는 변수는 인코딩/암호화

char[]형 배열로 처리하지 말것 (메모리 덤프 시 평문 확인 가능

 

검증 코드 은닉(코딩)

예상하기 어려운 함수 내부에 검증 코드 구현

쓰레기 검증 코드를 쉽게 확인이 가능한 곳에 위치

 

문자열 조립(코딩)

문자열 검색을 피하기 위해 문자열을 조립해서 사용

검증 루팅의 경우 평문의 문자열을 사용하지 말고, 한 글자씩 비교

superuser.apk(X)

"s" + "up" + "e" + "r" + "u"....(O)

 

의미 없는 클래스명(코딩)

프로가드는 일부 클래스, 메소드, 변수만 치환

그 외의 것들은 치환되지 않으므로 전혀 의미 없는 이름으로 치환

CryptoClass.java, Autofill.java 등 -> cc.java, aa.java

 

NDK(코딩)

중요 정보는 NDK를 이용해 개발

JNI 이용


Android Proguard에 대하여

  1. 코드 난독화를 통해 Decompile시 본인의 코드가 노출되는 것을 방지할 수 있다.
  2. 불필요한 Method를 제거하여 MultiDex를 피할 수 있다.(용량 감소)

※ MultiDex란?

- 안드로이드 앱을 구성하는 코드는 Complie되어 Dex파일로 만들어진다. 하나의(dex)파일에는 최대 65536개의 Method만 참조할 수 있다.

만약 프로젝트의 코드가 65536개의 Method를 초과하게 되면 덱스(Dex)파일이 여러개가 생성된다.

그러면 Multi Dex를 사용하여 컴파일 할 수 있지만, Build과정에서 App내의 파일을 여러개의 Dex파일로 나누어야 하므로 빌드 속도가 느려지고 APK의 용량이 커지게 된다.

 

안드로이드 난독화 대응 방안으로 쉽게 수행할 수 있는 프로가드를 적용하는 방법을 소개한다.

 

보통 프로가드만 적용할 경우 분석가에 의해 7~80%이상의 원본 수준의 소스코드를 확인할 수 있다. 하지만, 최소한 프로가드는 적용해야 한다.

 

프로가드를 적용하려면 안드로이드 스튜디오 좌축 프로젝트의 Gradle Scripts 항목에서 build.gradle을 더블클릭하면 기본적으로 minifyEnable의 속성이 "false"로 설정되어 있다. 이 속성을 "true"로 변경하면 프로가드가 적용된다.


코드 난독화 및 APK 최적화를 위한 Android Proguard사용법

1. Bulild Type을 디버깅과 릴리즈 버전으로 나눠준다.

Debug와 Release로 나눔

minifyEnabled 값을 true로 바꿔주면 Proguard가 적용된다.

디버그 시 Proguard-debug.pro를 추가해 줌으로써 난독화 및 라인 지워지는 것을 예외처리 할 수 있다.

 

2. 프로가드 활성화 및 debug.pro추가

전체 적용된 코드로 빌드타입을 위와 같이 적용해 준다.

minifyEnabled 값을 true로 바꿔 주면 프로가드가 적용된다.

디버그 시 proguard-debug.pro를 추가해 줌으로써 난독화 및 라인 지워지는 것을 예외 처리 할 수 있다.

3. 프로가드 적용 결과

 

사용 전

프로가드를 사용하기 전에는 용량이 37.2MB였으며 classes.dex 파일이 무려 3개나 있다.

classes.dex의 Method 개수를 보면 65501개이며 이와 같은게 classes2.dex에도 존재한다.

classes3.dex에는 1505개의 Method가 존재한다.

사용 후

프로가드 적용 후 3개로 나뉘어져 있던 dex 파일이 classes.dex파일 하나로 변경되었다. Method 개수도 56673으로 프로가드를 적용 안한 APK보다 반이상이나 줄어들었다. 또한 용량도 37.2MB에서 33.7MB로 변경됨을 확인할 수 있다.

 


Proguard - 디컴파일 및 방법

  • Proguard의 디컴파일 형태는 다음과 같다

Proguard Decompile

보는바와 같이 약간의 난독화가 적용되어 있는데, 이 난독화를 풀 수있다.

http://apk-deguard.com/

 

DeGuard: Statistical Deobfuscation for Android

DeGuard reverses the process of obfuscation performed by Android obfuscation tools. This enables numerous security analyses, including code inspection and predicting libraries.

apk-deguard.com

위의 사이트에 접근하여 APK파일을 올리게되면 디컴파일된 소스코드를 볼 수 있게 된다.

그래서 Proguard의 유료 버전인 Dexguard라는 것이 존재한다.

  • Proguard에 비하여 Dexguard는 정적, 동적 분석에 대해 보호를 더 하고 있다.
  • Proguard는 난독화를 최소화만 하고, Dexguard는 여러 Layer 암호화 및 난독화를 수행한다.
  • Proguard는 Byte Code에 집중되있지만 Dexguard는 모든 Component를 처리한다.
  • Proguard는 Open Source이고, Dexguard는 Enterprise 제품이다.

Android 진단 - jadx Tool

App 진단
@2021-10-22 16:15:16

기본적인 Android 진단 방법

  • 안드로이드 단말기에 모바일 앱을 설치하면 기본적으로 /Data 디렉토리에 APK 파일이 존재한다.
  • ADB Tool로 APK 파일을 Local PC로 추출 후 취약점 분석 환경에 맞게 Decomplie을 해야한다.

표준적인 진단방법

  1. Apk파일 추출 후 Apktool 도구로 APK파일을 디컴파일
  2. Dex2jar 도구로 APK파일을 (Mobile Application).jar파일로 변환
  3. Jd-gui도구로 jar파일을 자바 소스로 변환된 상태에서 분석해야 한다.

일반적으로 여러 모바일 애플리케이션 분석할때 위의 방법을 사용한다.


Jadx Tool

  • 해당 도구는 반복적인 과정을 한번에 수행할 수 있도록 세 가지의 도구의 기능이 모두 합쳐져 있어 쉽게 소스코드를 변환할 수 있다.

Jadx 도구의 편의성

APK 파일 추출

안드로이드 단말기에 설치되어 있는 모바일 애플리케이션의 APK파일은 기본적으로 /data/app/패키지이름 디렉토리에 저장된다. APK파일을 Local PC로 다운로드 하는 방법은 여러가지 있지만 진단인력은 기본적으로 ADB 도구를 설치하여 사용한다.

 

※ ADB(Android Debug Bridge)는 Local PC에서 안드로이드 단말기를 제어하기 위한 용도로 사용하며 안드로이드 단말기에 APK파일을 설치, 추출, 삭제, 실행, 종료, 컴포넌트 실행, 포트포워딩 등 다양한 기능을 수행할 수 있다.

※ APK(Android Application Package)파일은 모바일 앱을 설치할 때 사용하는 파일로 zip 형태로 압축되어 있다. 추출한 APK파일을 압축 프로그램으로 열어보면 인증 파일, 리소스 파일, AndroidManifest.xml파일, dex 파일이 포함되어 있다.

디컴파일 된 APK 파일의 정의

  • META-INF : Mobile Application의 배포자 관련 인증파일
  • res : 모바일 앱의 리소스 파일
  • AndroidManifest.xml : 모바일 앱의 전반적인 정보, 권한, 패키지 이름, 컴포넌트 정보이 나열되어 있는 파일
  • Classes.dex : 달빅(Dalvik) 가상 머신에서 동작하는 실행 파일, 어셈블리어 코드

일반적으로 jd-gui Tool은 검색 및 치환 기능이 부족하다. 또한 Java Class만 보여주므로 AndroidManifest.xml파일은 jar로 만들어도 확인할 수 없다.

 

Jadx-gui

Jadx-gui 도구를 실행하면 Open file창이 나타난다. 해당 도구가 지원하는 파일의 유형은 다음과 같다.

jadx, apk, dex, jar, class, smali, zip, aar, arsc 파일

파일 이름 입력 폼에 분석할 APK 파일을 지정하고 Open file 버튼을 클릭한다.

  • APK, Dex, Aar, zip 등 파일을 자바 소스코드로 변환시켜줌
  • AndroidManifest.xml, 리소스 파일 확인
  • 난독화 해제 지원
  • 함수 선언부 이동
  • 소스코드 하이라이팅
  • 키워드 검색가능

APK 파일을 선택하면 자동으로 Decompile하여 원본 수준의 Java Source Code를 확인할 수 있으며 하단의 AndroidManifest.xml파일의 내용도 확인가능하다.

안드로이드 앱은 소스코드 보호를 하려고 난독화를 적용한다. Jadx-gui 도구에서 100% 완벽한 수준으로 난독화 해제를 할 수 없지만 어느 정도 알아보기 쉽게 해제할 수 있다.

 

※ 난독화 해제방법 : Tools > Deobfuscation

 

jadx는 gui, cli 두 가지 형태로 배포하고 있는데 이에대한 구체적인 설명 및 사용법은 Github를 참조하면 알 수 있다.

 

https://github.com/skylot/jadx

 

GitHub - skylot/jadx: Dex to Java decompiler

Dex to Java decompiler. Contribute to skylot/jadx development by creating an account on GitHub.

github.com

 


jadx Tool 사용법

 

분류 전체보기 (118)

[1] [2] [3] [4] [5] [6] [7] [···] [15]