패스트터틀

안드로이드 앱 정적 분석 기법(19.5.14) 본문

Cyber Security(undergraduate)/mobile security

안드로이드 앱 정적 분석 기법(19.5.14)

SudekY 2019. 5. 14. 13:41

분석방법종류

 

-정적분석

  • 프로그램 실행없이 검사 / 분석(코드,리소스)
  • 코드전체분석가능
  • 정확한 코드 위치 파악
  • 실행해야만 알 수 있는 정보 파악 불가
  •  False발생가능성 존재

-동적분석

  • What
  • Where
  • When / Why
  • Who
  • How

분석을 위한 도구설명

 

AAPT(Android Asset Packaging Tool)

 

안드로이드 앱 패키지안의 리소스를 컴파일(원시 코드에서 목적 코드로 옮기는 과정)위한 도구

기존 패키지의 리소스 및 기타 정보 조회 기능이 존재, 다양한

https://elinux.org/Android_aapt]

 

Android aapt - eLinux.org

aapt stands for Android Asset Packaging Tool. This tool is part of the SDK (and build system) and allows you to view, create, and update Zip-compatible archives (zip, jar, apk). It can also compile resources into binary assets. Build scripts and IDE plugin

elinux.org

다양한 옵션들이 존재하는데

 

>aapt list package.apk  패키지 내 파일 리스트 조회
>aapt dump badging package.apk  패키지 주요 정보 조회
>aapt dump xmltree package.apk Androidmanifest.xml
  - xml트리 형식으로 파일 분석(xml로 파싱해서 xml형태로 보여줌)

 

 

Key tool

 

Java 패키지 서명 도구

  • Java 프로그램에 서명을 하거나, 수정, 조회 하는 도구
  • JDK 설치 시 기본으로 설치됨

> keytool –printcert -jarfile package.apk  ->  앱 서명 값 조회

시리얼넘버는뭐고 sha는 머고 머고 하는 서명 정보나옴...

 

dex2jar

To Convert .Dex to .Jar
• 안드로이드 실행파일인 dex를 자바 실행파일인 jar로 변환

 

d2j-dex2jar.bat dexfile.dex(혹은 apkfile.apk)
 dex(apk) 파일을 jar로 변환

 

jd-gui

무료도구로는 이게 재일 좋다고함

Java 실행파일 decompiler
• Java 실행코드를 decompile하여 소스코드로 보여주는 도구
• http://java-decompiler.github.io/

 

Java Decompiler

The “Java Decompiler project” aims to develop tools in order to decompile and analyze Java 5 “byte code” and the later versions. JD-Core is a library that reconstructs Java source code from one or more “.class” files. JD-Core may be used to recover lost so

java-decompiler.github.io

None-Code 분석

 

none-code는 코드가 아닌것으로

코드가 아닌 다른 파일을 분석은

인증서 로는 META-INF

권한 AndroidManifest.xml

파일 Resources, Assets

Etc.

 

 

 

 

 

 

 

 

인증서 분석

 

앱 서명

- 해당 앱이 해당 개발자가 만든것으로 인증을 해주는 디지털 지문역할을 해주는것으로 

 

위장 악성앱 (Piggybacked/ Repackaged Malicious App)

- 유명 앱 내부에 악성코드를 삽입해서 재배포 하는 악성앱

- 앱서명이 기존과 다름

앱 패키지명 확인

- 앱 파일(APK) 압축 해제

- aapt를 통해 앱 패키지명 확인

원본 앱 확보

- 패키지명을 이용하여 play store(혹은 apkpure*) 등에서 원본앱 다운로드

(ApkPure는 playstore를 크롤링해서 지속적으로 앱을 수집해서 재배포 하는 웹서비스)

https://apkpure.com/

 

Download APK free online downloader | APKPure.com

 

apkpure.com

인증서 비교

 

악성 : SHA1, SHA256 달름 

정상 앱 :

 

기사1
기사2

 

권한 분석

 

권한(Permision)

- 안드로이드에서 앱이 기기의 주요기능을 제어하거나 저장된 정보를 접근하기위해 사용됨

(윈도우상의 관리자권한?(UAC)란 비슷한것 같음)

- 이와같은 권한정보들은 AndroidManifest.xml

안드로이드는 권한을 두가지로 분류하여서 심각도를 나눔

https://developer.android.com/guide/topics/permissions/overview?hl=ko#permission-groups

 

Permissions overview  |  Android Developers

The purpose of a permission is to protect the privacy of an Android user. Android apps must request permission to access sensitive user data (such as contacts and SMS), as well as certain system features (such as camera and internet). Depending on the feat

developer.android.com

악성 의심 권한을 가지는것들은 주로 악성코드이기때문에 이런 민감한 기능의 사용 여부를 통해서 악성코드 분류가능

 

android.permission.RECEIVE_WEP_PUSH

- 앱이 WAP 메시지를 수신하고 처리할수 있도록 허용

android.permission.WRITE_APN_SETTINGS * 

- 앱이 모든 네트워크 트래픽을 가로채고 검사하거나 네트워크 설정을 변경할 수 있도록 허용

android.permission.BROADCAST_WAP_PUSH *

- 가짜로 메시지가 도착한것처럼 보이게끔 악용하는 , WAP PUSH메시지를 받았다는 알림을 브로드캐스트하는것

android.permission.WRITE_SMS (~API 22)

- 앱이 SIM카드에 저장도니 SMS쓰거나 삭제하도록 허용

android.permission.READ_SMS

- SIM카드의 SMS읽을 수 있도록 허용

android.permission.DELETE_PACKAGES *

- 앱이 다른 앱 패키지를 삭제

android.permission.BROADCAST_PACKAGE_REMOVED *

- 앱이 앱 패키지가 삭제되었다는 알림을 브로드캐스트(가로채기) 허용

android.permission.RECEIVE_MMS

- 앱이 MMS 모니터 수신하고 몰래 알림 삭제 가능

android.permission.INSTALL_PACKAGES *

- 앱이 새로운 또는 업데이트된 앱 패키지를 설치할 수 있도록 ㅎ용

android.permission.BRICK (~API 22)

- 앱이 기기를 영구적으로 사용중지할 수 있게 함, 매우 위험한 권한

android.permission.RECEIVE_SMS

- 앱이 SMS메시지를 수신하고, 수신표시X해주고, 모니터링 가능

android.permission.SET_PROCESS_LIMIT *

- 앱이 실행할 최대 프로세스 수를 제어할 수있도록 허용,일반적인 앱에서 사용안함,백신사용못하게 막게끔가능

android.permission.DISABLE_KEYGUARD

- 앱이 잠금화면을 비활성화도록

android.permission.FACTORY_TEST

- 앱이 제조자 테스트앱으로 동작해서 root유저 앱으로 동작하도록 허용,일반적으로 사용이 불가능함

android.permission.BIND_APPWIDGET

- 위젯이 앱의 개인 정보에 접근이 가능하도록 할수 있음

android.permission.INTERNAL_SYSTEM_WINDOW (~API 22)

- 내부 시스템 사용자 인터페이스에서 사용하는 창만들수 있음

android.permission.PERSISTENT_ACTIVITY (자제권고 API 15~)

- 메모리를 지속적으로 할당해서 기기의 속도를 저하시킬 수 있음

android.permission.PROCESS_OUTGOING_CALLS (자제권고 API Q~)

- 앱이 발신 통화를 다른 번호로 리다이렉션 할 수 있도록함

android.permission.BROADCAST_SMS *

- 앱이 SMS메시지를 수신했다는 알림을 브로드캐스트,가짜 메시지 위조

android.permission.READ_FRAME_BUFFER (~API 28)

- 앱이 프레임 버퍼의 내용을 읽을 수 있도록 허용,악성앱이 화면 캡쳐, 원격 제어 등이 가능

android.permission.READ_LOGS *

- 앱이 시스템 로그파일을 읽을 수 있도록 허용(개인정보,비공개정보 접근가능)

android.permission.WRITE_CALL_LOG

- 전화 내역 수정

android.permission.READ_CALL_LOG

- 통화내역 읽을수있도록

android.permission.RECORD_AUDIO

- 마이크 녹음 할수있도록 ( 최초 동의후 아무때나 사용가능 )

android.permission.BIND_DEVICE_ADMIN (자제권고 API Q~)

- 앱이 기기관리자에게 보내는 인텐트를 수신할 수 있는 리시버 권한이 허용 됨

 

문자 및 통화 관련 권한 사용 제한

GOOGLE PLAY(다른 데선 가능)에서 19.3.9 일 부터 통화 기록 및 SMS 사용권한 제한 조치이후 서면을 통해 ... 

여하튼 이런 권한을 많이 막음

기타 위험 권한

분석가 판단 시, 카메라 / 녹음 / 저장소 읽기 및 쓰기 등 앱의 고유 기능에 필요없지만 추가되어 있는 권한이 존재할 경우 악성 의심

 

 

T전화의 권한인데 악성앱이라고 의심될만큼 권한을 사용한다

이렇기 때문에 권한분석이 악성의심권한이 악성 앱이라고 단정 지을 수는 없다.

 

Code 분석

 

민감한 API

실행 코드 파일을 분석

  • 바이트코드 : classese.dex
  • 네이티브코드 : Native libraries

민감한 API

  • 개인정보 접고느, 시스템 설정 접근등 악성행위 가능성있는 API

문자 관련 Class
• android.telephony.SmsMessage
• android.telephony.SmsManager
문자 관련 Method
• Uri.parse("content://sms/")
• android.telephony.SmsMessage.getOriginatingAddress()
• android.telephony.SmsMessage.getMessageBody()
• android.telephony.SmsManager.sendTextMessage()

 연락처 관련 Method
• getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, 
…);
 통화목록 관련 Method
• managedQuery(CallLog.Calls.CONTENT_URI, null, null, null, null);
• getContentResolver().delete(CallLog.Calls.CONTENT_URI, …);

 

 

HTTP 웹 접근 Class
• java.net.HttpURLConnection
• org.apache.http.client.HttpClient
• android.webkit.WebViewClient
• android.webkit.WebChromeClient
• android.webkit.WebView
 HTTP 웹 접근 Method & Intent
• HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
• HttpClient httpclient = new DefaultHttpClient();
HttpResponse response = httpclient.execute(new HttpGet(URL));
• webview.loadUrl()
• new Intent(Intent.ACTION_VIEW, Uri.parse(url));

 

카메라 관련 Class
• android.hardware.Camera
• android.hardware.Camera2
 카메라 관련 Intent
• android.media.action.IMAGE_CAPTURE (ACTION_IMAGE_CAPTURE)
• android.media.action.IMAGE_CAPTURE_SECURE
(ACTION_IMAGE_CAPTURE_SECURE)
• android.media.action.VIDEO_CAPTURE (ACTION_VIDEO_CAPTURE)

 

카메라 관련 Class
• android.hardware.Camera
• android.hardware.Camera2
 카메라 관련 Intent
• android.media.action.IMAGE_CAPTURE (ACTION_IMAGE_CAPTURE)
• android.media.action.IMAGE_CAPTURE_SECURE
(ACTION_IMAGE_CAPTURE_SECURE)
• android.media.action.VIDEO_CAPTURE (ACTION_VIDEO_CAPTURE)

 

녹음 관련 Class
• android.media.MediaRecorder
• android.media.AudioRecord
 녹음 관련 Method
• AudioRecord.StartRecording()
 녹음 관련 Intent
• MediaStore.Audio.Media.RECORD_SOUND_ACTION

 

위치 정보 관련 Class
• com.google.android.gms.location.FusedLocationProviderClient
• android.location.LocationManager
 위치 정보 관련 Method
• FusedLocationProviderClient.getLastLocation()
• LocationManager.requestLocationUpdates()

• LocationManager.getLastKnownLocation()

 

 파일 읽기/쓰기 관련 Class
• File
• FileInputStream
• FileOutputStream
• InputStream
• OutputStream
• BufferedReader
• BufferedWriter
• …

 

기기정보 관련 Class
• android.telephony.TelephonyManager
기기정보 관련 Method
• android.telephony.TelephonyManager.getDeviceId()
• android.telephony.TelephonyManager.getImei()
• android.telephony.TelephonyManager.getLine1Number()

 

사용 여부 점검

 

 

민감한 API사용하는것이 MBC mini였음

이렇기 때문에 민감한 API분석이 악성의심 API사용 악성 앱이라고 단정 지을 수는 없다.

 

실행 흐름 분석

 

실행 흐름(제어 흐름, Control Flow) 분석
• 코드가 실행되는 순서를 분석
• 악성 행위의 상세 순서 파악

 

EntryPoint 파악
> aapt dump xmltree Something.apk AndroidManifest.xml > manifest.txt
: 앱의 AndroidManifest.xml 파일을 파싱하여 manifest.txt 파일로 저장
• intent-filter 를 보유하고 있는 activity, receiver  EntryPoint

 

 

 데이터 흐름 분석
• 데이터가 어디서 생성되어, 어떻게 처리되고, 어떻게 전이 되는지 분석
• 단순히 실행 흐름만 볼 경우, 민감한 API에서 사용되는 데이터가 무엇
인지 알지 못하는 경우가 발생

Before
after

    실행 흐름 분석  
            +                              = 완벽한 악성 앱 분석
   데이터 흐름 분석

 

 

 

 

 

 

 

 

 안드로이드 앱 정적 분석 기법
• None-Code 분석
- 인증서 분석
- 권한 분석
• Code 분석
- 민감한 API 분석
- 실행 흐름 분석
- 데이터 흐름 분석
• 보고서 작성 방법

 

VirusTotal(https://www.virustotal.com/gui/home/search)
• 각종 AV분석 결과를 조회할 수 있는 서비스
• 파일 해쉬를 이용한 조회 가능
• 파일 해쉬 생성 방법(SHA1)
> certutil –hashfile 파일경로 SHA1
• SHA1으로 검색

 

결론 : 바이러스 토탈이 짱이다.

 

 

분석

 

JAVA 설치후 환경변수 설정

- java, java bin

- install

- dex2jar-2.0

 

사용한 파일들

 

Mal.egg
2.55MB

https://drive.google.com/open?id=1QMBfVz0N1JzTCdaxBu_9nzN5Ieado4DO

 

install.egg

 

drive.google.com

Mal.egg 분석할 악성 apk파일(백신 걸릴수도있음)

이중에 bank부분을 한것을 작성

aapt dump xmltree (앱.apk) AndroidManifest.xml > (텍스트.txt)

이후 변환된 txt를 보면은 XML의 정보들을 분석할수있는데

 

 

여기서확인해볼시 

 

RECEIVE_SMS

SEND_SMS

WRITE_SMS 와 같은 위험한 권한의 PERMISSION 을 요구하는것을 확인할수있다.

 

RECEIVE_BOOT_COMPLETED 로 부팅시마다 실행이 되도록 하는 퍼미션이 입력되어있다.

 

그리고

 

 

d2j-dex2jar.bat 로 fakebank.apk를 jar 파일로 변환

 

 

 

jd-gui-1.4.1.jar(자바 디컴파일러) 로 fakebank.jar 를 실행시 내부구조를 파악할수있음

 

 

 

REBOOT하거나 종료하면 아이콘을 숨기라고하는데 정말 수상함

 

이라고 수상한파일은 맞는것같은데........30분동안 했는데 이것밖에 분석못함

 

분석.txt
0.00MB

위는 전문적인분이 어느정도 분석하신것이다. 

 

 

 

 

Comments