아래 내용은 연구 목적으로 작성되었으며, 해당 소스코드를 악의적인 목적으로 사용하는것은 절대 엄금합니다. 악의적으로 사용하여 발생할수 있는 모든 문제는 사용한 사용자에게 있습니다. |
1. 개요
금융 정보 탈취 및 도청 등 사생활 침해 목적의 기능을 가진 악성 앱 (대출 관련 법원 등기) App.apk
해당 앱은 아래와 같은 은행 대출 문제로 법원등기가 발송되었으나 부재중 ~ 이라는 문자 내용으로 대출 내역을 확인하기 위해 문자 메시지에 같이 존재하는 링크를 클릭하도록 유도한다. (참고 : 링크 URL은 단축 URL이 아님)
File name: | App.apk |
MD5: | 7e2116d1685dfc3cca02234bef122a1f |
SHA-1: | 0293ee4734c3e64009b9b112b6541dce124bed44 |
File Size: | 650334 Bytes |
minSdkVersion : | 8 |
targetSdkVersion | 18 |
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 주소를 디코딩을 하여, 확인한 결과 아래와 같이 서버는 일본에 있는것으로 확인되었다.
|
** 추가 다운로드 되는 은행 앱은 추후 분석 예정! **
[Android Malware] phone.apk 및 kb.apk 분석 (0) | 2014.01.15 |
---|---|
[Android Malware] mervice.apk 분석 (0) | 2013.12.18 |
[Android Malware] miracle.apk 분석 (0) | 2013.10.17 |
기본적인 Telnet Packet 분석 (0) | 2013.07.12 |
[Android Malware] 스타벅스 쿠폰 위장 악성 앱 (sb.apk) 분석 (0) | 2013.07.01 |