Analysis

[Android Malware] App.apk 분석

DarkSoul.Story 2013. 11. 15. 11:30
반응형



아래 내용은 연구 목적으로 작성되었으며, 해당 소스코드를 악의적인 목적으로 사용하는것은 절대 엄금합니다. 악의적으로 사용하여 발생할수 있는 모든 문제는 사용한 사용자에게 있습니다. 



1. 개요


금융 정보 탈취 및 도청 등 사생활 침해 목적의 기능을 가진 악성 앱 (대출 관련 법원 등기) App.apk 


해당 앱은 아래와 같은 은행 대출 문제로 법원등기가 발송되었으나 부재중 ~ 이라는 문자 내용으로 대출 내역을 확인하기 위해 문자 메시지에 같이 존재하는 링크를 클릭하도록 유도한다. (참고 : 링크 URL은 단축 URL이 아님) 



File name:App.apk 
MD5:7e2116d1685dfc3cca02234bef122a1f 
SHA-1:0293ee4734c3e64009b9b112b6541dce124bed44 
File Size:650334 Bytes
minSdkVersion :
targetSdkVersion18


2. 분석 내용


문자 메시지에 포함된 링크를 클릭 시 App.apk 파일이 다운로드 되며, 자동으로 설치가 된다. 다운로드된 App.apk파일은 구글 플레이 스토어로 위장 하고 있으며, 아래는 정상적인 구글 플레이 스토어 앱(좌측)과 구글 플레이 아이콘으로 위장한 악성앱(우측)이다. 


악성 앱을 클릭하면, 아래와 같은 이미지 보여준다. (참고 : 에뮬레이터에서 실행시 정상적으로 실행이 되지 않는 것으로 판단된다.)



 


위의 이미지는 잠깐만 보여주고, 종료한다. 해당 앱이 종료가 되면, 앱 서랍에 존재하는 아이콘을 삭제 한다. 아이콘이 삭제되더라도 App.apk는 사용자 몰래 백그라운드에서 실행되고 있다. 



아래는 App.apk 파일안에 존재하는 아이콘들이다. 금융권 앱으로 위장하기 위한 이미지들이 보인다.



 


App.apk는 아래와 같이 22가지 권한 (User Permission)을 요구한다. 



 


유저 권한 (User Permission)

android.permission.CHANGE_NETWORK_STATE

android.permission.PROCESS_OUTGOING_CALLS

android.permission.INTERNET

android.permission.WRITE_CONTACTS

android.permission.SEND_SMS

android.permission.WRITE_SMS

android.permission.ACCESS_NETWORK_STATE

android.permission.WRITE_CALL_LOG

android.permission.GET_TASKS

android.permission.READ_CALL_LOG

android.permission.WRITE_EXTERNAL_STORAGE

android.permission.RECORD_AUDIO

android.permission.RECEIVE_BOOT_COMPLETED

android.permission.CALL_PHONE

android.permission.WRITE_SETTINGS

android.permission.READ_PHONE_STATE

android.permission.READ_SMS

android.permission.VIBRATE

android.permission.CHANGE_WIFI_STATE

android.permission.RECEIVE_SMS 

android.permission.READ_CONTACTS

android.permission.MOUNT_UNMOUNT_FILESYSTEMS


22 가지 권한 (User Permission) 중 빨간색으로 표시된 권한이 악의적인 목적으로 사용될 수 있는 권한으로 내용은 아래와 같다.


유저 권한 (User Permission)

           

android.permission.PROCESS_OUTGOING_CALLS

응용 프로그램()이 발신 통화를 모니터링 하거나 중지 시킬 수 있도록 허용 한다.

android.permission.INTERNET

응용 프로그램이 네트워크 소켓을 만들 수 있도록 허용 한다.

android.permission.WRITE_CONTACTS

응용 프로그램이 안드로이드 디바이스에 연락처 데이터를 쓸 수 있도록 허용한다. (, 읽기는 안됨)

android.permission.SEND_SMS

응용 프로그램이 SMS 메시지를 보낼 수 있도록 허용 한다.

android.permission.WRITE_SMS

응용 프로그램이 SMS 메시지를 쓸 수 있도록 허용한다.

android.permission.WRITE_CALL_LOG

응용 프로그램이 안드로이드 디바이스에 연락처 데이터를 쓸 수 있도록 허용한다. (, 읽기는 안됨)


(참고 : 앱이 WRITE_CONTACTS 권한을 사용하고, minSdkVersion targetSdkVersion 모두의 값을 15 이하로 설정되어 있으면 시스템이 암시적으로 이 권한을 응용 프로그램에게 부여 한다.)

android.permission.GET_TASKS

응용 프로그램이 현재 또는 최근에 실행된 작업에 대한 정보를 얻을 수 있도록 허용 한다.

android.permission.READ_CALL_LOG

응용 프로그램이 사용자의 통화 로그를 읽을 수 있도록 허용 한다.


(참고 : 앱이 READ_CONTACTS 권한을 사용하고, minSdkVersion targetSdkVersion 모두의 값을 15 이하로 설정되어 있으면 시스템이 암시적으로 이 권한을 응용 프로그램에게 부여 한다.)

android.permission.WRITE_EXTERNAL_STORAGE

응용 프로그램이 외부 스토리지에 쓸 수 있도록 허용 한다.


(참고 : minSdkVersion targetSdkVersion 값이 모두 3 이하로 설정되어 있으면 시스템이 내재적으로 응용 프로그램에게 이 권한을 부여 한다.)

android.permission.RECORD_AUDIO

응용 프로그램이 음성을 녹음 할 수 있도록 허용 한다.

android.permission.READ_PHONE_STATE

응용 프로그램이 휴대 전화의 상태를 읽을 수 있도록 허용 한다.

android.permission.READ_SMS

응용 프로그램이 휴대 전화 또는 SIM 카드에 저장되어 있는 SMS 메시지를 읽을 수 있도록 허용 한다.

android.permission.CHANGE_WIFI_STATE

응용 프로그램이 Wi-Fi 연결 상태를 변경 할 수 있도록 허용 한다.

android.permission.RECEIVE_SMS

응용프로그램이 SMS 메시지를 받고 처리 할 수 있도록 허용 한다.

android.permission.READ_CONTACTS

응용 프로그램이 사용자의 연락처 데이터를 읽을 수 있도록 허용 한다.


그럼 소스코드를 살펴 보자. 아래는 앱 서랍에 있는 악성앱의 아이콘을 삭제 및 디바이스 관리자에 등록시키는 부분으로, OnClickListener 를 이용하여 클릭 이벤트를 감시한다. 해당 앱이 클릭되어 실행 되면, getPackageManager().setCompinentEnabledSetting()을 이용하여, 앱 서랍이 존재하는 아이콘을 삭제한다. 그와 동시에 앞서 확인한 대한 민국 법원이란 이미지를 보여준다.   



 


다음으로 디바이스 관리자에 자신을 등록 시킨다. 



 


아래는 PackageManager의 getInstalledPackages()를  이용하여, 디바이스에 설치된 모든 패키지(앱)의 목록을 확인하는 소스코드이다.



 


아래는 디바이스 정보를 가져오는 소스코드로 TelephonyManager의 getSubscriberId(), getDeviceId(), getLine1Number()를 이용하여, 가입자 식별 ID(통신사), 디바이스 ID, 디바이스 전화번호를 가져온다. 가져온 정보들을 확인하여, 가입자 식별 ID가 31026, 디바이스 ID가 00000000, 디바이스 전화번호가 15555으로 시작할 경우 프로세스를 종료 시킨다. 이는 에뮬레이터를 실행시켜 동적 분석을 방해 하기 위함이다.



 


참고로 아래는 가입자 식별 ID가 어떤 통신사 인지 정의해 놓았다. getSubscriberId()를 이용해서 가져온 가입자 식별 ID와 비교 하여, 매칭이 되는 가입자 식별 ID의 통신사 이름을 리턴해 준다.



 


아래는 디바이스의 앱 실행 상태를 모니터링 하는 소스코드이다. ActivityManager의 getRunningTasks(1)는 이용하여, 최근에 실행 되었거나 현재 실행 되고 있는 상위 리스트 1개의 앱 목록을 가져온다. 가져온 앱 목록의 패키지 명을 확인한다.




패키지 명을 확인 하였으면, 다시 한번 아래 패키지 명과 비교를 한다. 



 


만약 비교한 패키지 명이 위 패키지 명 중 1개와 동일한 경우 해당 패키지를 삭제 시킨다.



 


패키지가 정상적으로 삭제가 되면, 추가로 APK 파일을 다운로드 받는다.


 



아래는 도청 목적의 통화 내용을 녹음 하는 소스코드로, MediaRecorder를 이용한다.  MediaRecorder는 음성/영상 모두 녹음/녹화가 가능하다. 여기서는 확장자는 .3gp / 미디어 파일 형식은 3GPP로 음성만 녹음 하여 저장한다. 저장된 .3gp 파일은 다시한번 zip 파일로 압축한다.

 


 


해당 악성 앱은 아래와 같이 XMPP 프로토콜을 이용하여 서버와 통신 및 정보 유출을 하며, 소스코드에서 확인된 IP 주소는 Base64로 인코딩 되어 있다. 



 


인코딩 되어 있는 IP 주소를 디코딩을 하여, 확인한 결과 아래와 같이 서버는 일본에 있는것으로 확인되었다.



 



** 추가 다운로드 되는 은행 앱은 추후 분석 예정! **




반응형