제목 그대로 ARE 환경을 소개 하려는 글이다. 현재 Android 악성 App을 분석할 수 있게 도와주는 여러 도구들은 꽤 많이 배포되고 업데이트 되고 있다. 하지만 이 대부분의 도구들을 하나의 환경에서 설치하고 실행하기란 여간 귀찮고 까다로운일이 아닐 수 없다. 이러한 작업들을 Honeynet에서 대신해주었다. 바로 지금부터 소개할 ARE 프로젝트이다. ARE 프로젝트는 여러가지의 Android 악성 App 분석 도구들을 하나의 OS, 즉 ubuntu에 모아 설치하여 분석가에게 편의를 제공하는 프로젝트이다.

이러한 환경은 오라클에서 개발하고 배포하는 무료 가상 소프트웨어 Virtual Box 이미지로 배포되고 있다.


프로젝트 및 다운로드 주소 : http://redmine.honeynet.org/projects/are/wiki


해당 환경에 설치 된 도구들은 다음과 같다.



일단 ARE 환경은 tar로 압축되어 배포 되고 있는데 압축을 해제 한 후 로딩하여 보면(로그인 패스워드는 android) 다음과 같이 Main 화면을 볼 수 있다.


[그림 1 - ARE Main]


처음에 환경을 로딩하고 나서 수정해주어야 할 점이 있다. 바로 adb 명령 path 설정이다. 왜 설정이 안되어 있는지는 모르겠지만 일단 adb 설정이 안되어 있으면 DroidBox 등을 실행 할 경우 굉장히 귀찮아진다.(소스 수정까지 해야 한다.)


그렇기 때문에 아래와 같이 수정을 해주어야 한다.


터미널을 Open 한 후 


#vi .bashrc


/home/android/tools/android/android-sdk-linux_x86/tools/

/home/android/tools/android/android-sdk-linux_x86/platform-tools/


위 두가지를 PATH에 추가한다. 아래 처럼!



[그림 2 - 환경변수 PATH 수정]


export 명령을 사용해도 되지만 부팅 시 export 명령으로 한 설정은 사라지기 때문에 이렇게 설정하는 것이다.


그리고 sdk를 업데이트 해주어야 한다. 아무래도 프로젝트가 현재 진행이 되질 않다보니 환경에 있는 안드로이드 에뮬레이터 또한 최신 버전등이 없다. 


#/home/android/tools/android/android-sdk-linux_x86/tools/android update sdk


위 명령을 실행하게 되면 다음과 같이 SDK Manager 대화상자가 나오고 업데이트 해야 할 목록들이 나오게 된다.



[그림 3 - SDK Manager]


업데이트 할 목록들을 선택하여 Accept를 해주어도 되고 모두 설치하려면 Accept All을 클릭해주고 Install 버튼을 누르면 된다.


이제 분석할 환경설정이 모두 끝이 났다. 간단하게 DroidBox를 통해 동적분석을 수행해 보자.


 * 참고 : 사용자 홈 디렉토리의 하위 디렉토리인 tools 디렉토리에 분석 도구들이 설치되어 있다.


DroidBox는 Apk 파일을 Sandbox 환경에서 실행시켜 어떤 동작을 하는지 모니터링 한 후 그 결과를 사용자에게 출력하여 준다. 정적분석을 할 때 만약 암호화 되어 있는 주소나 포트등이 있다고 하더라도 결국 동적 분석에서 모두 알 수 있다. DroidBox는 기본적으로 다음과 같은 행동들을 모니터링 한다.


  • Incoming/outgoing network data
  • File read and write operations
  • Started services and loaded classes through DexClassLoader
  • Information leaks via the network, file and SMS
  • Circumvented permissions
  • Cryptography operations performed using Android API
  • Listing broadcast receivers
  • Sent SMS and phone calls

대부분 악성 App이 하는 악성 행동만을 모니터링 한다.

일단 DroidBox는 안드로이드 에뮬레이터를 이용하기 때문에 DroidBox 디렉토리 안에 있는 startemu.sh로 에뮬레이터를 실행 시켜준다.

[그림 4 - startemu.sh]


Android21은 AVD 이미지 이름으로 /home/android/.android/avd 에 존재한다. 그래서 이전에 에뮬레이터 버전들을 업데이트 해 준것이다. SDK Manager를 실행하여 에뮬레이터 이미지를 생성하여 주면 여러 버전에서 App를 테스트하여 볼 수 있다.

에뮬레이터가 정상적으로 실행 됬다면 droidbox.sh를 실행하여 준다.

#./droidbox.sh sample.apk

이 명령으로 실행하여주면 아래와 같이 분석을 수행한다.

[그림 5 - DroidBox 분석화면]


분석결과가 실시간으로 출력되지는 않는다. Collected~ 문자열에서 숫자는 모니터링 한 로그 수를 의미하는데 이 로그가 높으면 높을 수록 조금 더 정확한 결과와 많은 결과를 얻을 수 있다. 필자가 테스트 해 본 결과 80~85 로그수가 제일 적당하다. 100이상을 넘어가면 터미널 창에서 모든 결과가 보이지 않아 다시 실행해야 하는 낭패를 볼 수 있다. 아니면 > 를 이용하여 출력화면을 저장해도 좋다. 


아래는 잠깐의 분석을 통해 나온 결과이다.


[Info]

     ------

        File name: sample.apk

        MD5: c3a0f5d584cc2c3221bbd79486578208

        SHA1: 81781c90e79bf19ea0acb67df6b9bf636a520367

        SHA256: c6eb43f2b7071bbfe893fc78419286c3cb7c83ce56517bd281db5e7478caf995

        Duration: 578.77789402s



     [File activities]

     -----------------


        [Read operations]

        -----------------

           [149.832055092] Path: /data/data/com.android.calendar/shared_prefs/_has_set_default_values.xml(

            Data: <?xml version='1.0' encoding='utf-8' standalone='yes' ?>

<map>

<boolean name="_has_set_default_values" value="true" />

</map>




        [Write operations]

        ------------------


     [Crypto API activities]

     -----------------------


     [Network activity]

     ------------------


        [Opened connections]

        --------------------

           [43.371598959] Destination: incorporateapps.com Port: 80


        [Outgoing traffic]

        ------------------

           [43.7593550682] Destination: incorporateapps.com Port: 80

            Data: POST /wat.php HTTP/1.1

Content-Length: 284

Content-Type: application/x-www-form-urlencoded

Host: incorporateapps.com

Connection: Keep-Alive

User-Agent: Apache-HttpClient/UNAVAILABLE (java 1.4)

Expect: 100-Continue





        [Incoming traffic]

        ------------------


     [DexClassLoader]

     -----------------

     [Broadcast receivers]

     ---------------------

     [Started services]

     ------------------

     [Enforced permissions]

     ----------------------


     [Permissions bypassed]

     ----------------------


     [Information leakage]

     ---------------------

           [56.98290205] Sink: Network

            Destination: incorporateapps.com

            Port: 80

            Tag: TAINT_IMEI

            Data: SECOND_TABLE=0&imei=357242043237517&timestamp=1336213509&phoneinfo=System+-+generic%2Fgeneric%2Fgeneric%2F%3A2.1-update1%2FEPE54B%2Feng.pjlantz.20110606.044729%3Aeng%2Ftest-keys%0AModel%3A+unknown-GT-I9000-Samsung+GT-I9000%0A+Brand%3ASamsung+%0AOSVers%3A2.1-update1+Locale%3Aen_US+%0A


     [Sent SMS]

     ----------


     [Phone calls]

     -------------


어떠한 행동을 하는지 확인되었다면 그만큼 정적 분석은 쉬워질 것이다. 왜 File 을 Write하고 정확히 유출하는 정보는 무엇인지 정적분석을 통해 알아내면 된다.

'[+] Information > [-] RCE' 카테고리의 다른 글

소소한 Unpacking TIP  (8) 2013.01.09
ARE(Android Reverse Engineering) 환경 소개  (5) 2012.05.05
Oter : Android Revese Engineering Tool  (8) 2012.01.30
PE 구조 (8)  (0) 2012.01.01
PE 구조 (7)  (0) 2012.01.01
  1. Favicon of https://extr.tistory.com BlogIcon extr 2013.03.05 23:16 신고

    잘봤습니다 ㅎㅎ

  2. Android 2014.04.04 00:56

    안녕하세요. 설치하는데 굉장히 시간이 오래 걸리던데, 설치 후 tar 로 압축만 풀면 진행이 되나요?..
    저 같은 경우 압축 푸니깐 파일 두개가 생기던데...어디서 잘못되었는지 모르겠내요.

    virtual box는 따로 설치를 해야하는건가요?...

    • Favicon of https://maj3sty.tistory.com BlogIcon MaJ3stY 2014.04.04 11:16 신고

      버츄얼박스는 따로 설치하셔야 하고, tar 파일을 풀면 버츄얼 박스 이미지 파일들이 나옵니다.

  3. Favicon of https://roomb16.tistory.com BlogIcon 포착 2016.05.24 00:25 신고

    덕분에 잘 설치했습니다. 감사합니다!

요즘 안드로이드 봇넷에 관한 연구가 외국에서 활발히 이루어지고 있으며 이와 관련된 악성 앱 또한 많이 발견되고 있는 상황이다. 이러한 상황을 어느정도 파악해 보고자 이렇게 악성 앱 분석을 시도하게 되었다.


지금부터 분석 할 악성 앱은 리팩(RePackage) 된 악성 앱이며, 사용자의 스마트폰 정보를 프리미엄 번호로 메시지 전송을 시도하며 또 원격에 있는 C&C 서버와 통신하는 악성 앱 봇이다.


[android.dds.com-STiNiTER.apk]

Main에 해당하는 apk 파일이며 해당 파일을 압축해제 한 후 디컴파일 하여 보면 몇가지의 패키지 파일들이 나오는데 원본 앱과 비교하여 보면 com.gamebox.service 패키지가 원본 앱에 없다는 것을 확인 할 수 있다.

com.gamebox.service 패키지(이하 악성패키지)는 해당 apk 파일의 Main 클래스의 onCreate() 메소드가 호출되면서 자동으로 호출된다.


[그림 1 - 악성 패키지 호출]


OnCreate() 메소드는 액티비티가 생성되면 자동적으로 시스템이 호출하는 메소드이어서 앱이 실행되면 자동으로 실행되는 메소드라고 생각하면 된다. 결국 앱 실행과 동시에 악성 패키지가 서비스로서 실행되게 된다.


일단 악성 패키지는 아래처럼 어떠한 것들을 어떠한 경로에 복사하는 일을 수행한다.


[그림 2 - 악성 앱 복사 수행 루틴]


if문 바로 아래의 출력문을 보면 rootstate 라는 문자열이 보이는데 해당 문자열만 봐도 해당 루틴이 root 권한으로 실행 된다는 것을 알 수 있다. 바로 이 루틴 밑에는 복사한 악성 앱들을 777(rwxrwxrwx) 권한으로 변경하는 루틴이 위치한다.


[그림 3 - 권한 변경 수행 루틴]


권한 변경 도중 쓰레드를 실행하는데 이 쓰레드는 start 파일을 실행시키는 쓰레드이다.

또 맨 마지막 코드를 보면 initr 파일도 실행시키는 것을 볼 수 있다.


[그림 4 - thread1]


위 코드가 thread1 부분의 코드이며, [그림 4]에서 보듯이 start파일을 실행시키고 있다.

파일의 후반부를 가면 OnCreate() 메소드가 존재하는데 이 루틴에서는 감염 스마트폰의 정보와 보낼 번호등이 설정되고 또 복사될 악성앱이름, 경로등이 설정 된다.


[그림 5 - 여러가지 정보 설정]


스마트폰의 여러 정보들을 수집하여 xml 데이터로 만들고, 또 복사할 앱을 바이너리 모드로 열어 그 데이터를 저장하며 복사 할 위치를 지정하고 있다. 해당 앱들은 모두 resource/raw 디렉토리에 들어있다.


위 apk 파일에서 start 파일과 initr 파일을 실행 시키는 것을 볼 수 있었다. 이번에는 start 파일을 한번 살펴보자.


[start]

해당 파일은 ELF 포맷의 파일로 특별한 악성행위는 하지 않으면 log 파일을 생성/Open 하고 파일이 정상적으로 생성되었다면 Keeper라는 파일을 실행시킨다.


[그림 6 - start 파일 흐름]


이번에는 initr 파일을 살펴보자.


[initr]

해당 파일 또한 ELF 포맷의 파일이며, 여러가지의 파일들의 권한을 설정해준다. 아래는 어떤 파일을 어떤 권한으로 설정하여 주는지 목록화 한 것이다.


 - /data/googleservice.apk - 644

 - /data/unlock.apk - 644

 - /data/googlemessage.apk -644

 - /system/bin/android.info - 777

 - /system/bin/keeper - 4711

 - /system/bin/ts - 4711

 - /system/bin/sh - 4755


해당 악성앱은 앞서 말했듯이 루트권한으로 동작한다. 그러므로 keeper, ts 그리고 쉘인 sh는 루트권한으로 실행되게끔 권한이 설정된 것이다.


이번에는 start 파일에서 실행시킨 keeper 파일을 살펴보자.


[keeper]

해당 파일도 ELF 포맷의 파일이며, ts 파일의 소유자와 권한등을 설정하고 ts 파일을 실행시키는 기능을 수행한다.


[그림 7 - 권한 설정 및 실행 루틴]


[그림 7]을 보면 system() 함수를 이용해 권한 설정 및 ts 파일을 실행 하는 것을 볼 수 있다.


이번에는 keeper 파일이 실행시킨 ts 파일을 살펴보자.


[ts]

해당 파일은 ELF 포맷의 파일로 실질적인 악성 행위를 하는 앱들을 설치하고, C&C 서버와 통신하는 기능을 수행한다. 또 C&C서버와 여러가지 파일을 주고 받는다.


[그림 8 - 악성 앱 설치]


 * 참고 : 악성 앱 설치하기 전  /system/etc의 권한을 777로 변경한다.


[그림 8]은 adb 명령을 이용하여 3개의 악성 앱을 설치하는 명령어들이다.

조금만 더 문자열들을 검색해보면 HTTP 헤더 패킷들이 보인다.


[그림 9 - HTTP 헤더 패킷]


그리고 헤더 패킷 이후로 보면 통신 대상이 되는 C&C 서버 4곳의 주소가 나온다.


[그림 10 - C&C 서버 목록]


해당 C&C 서버들은 아직까지 운영되고 있는 것을 확인하였다.


[그림 11 - 운영되고 있는 C&C 서버]


C&C 서버와 주고 받는 여러가지 파일들은 아래와 같다.


 - ReportDownStatus.do

 - GetPackage.do

 - GetRequestInterval.do

 - HeartBeat.do

 - ReportPushMessageStatus.do


이번에는 ts 파일이 설치하는 악성 앱 3가지에 대해서 알아보자.


[악성 앱 3가지]

일단 googlemessage.apk 파일부터 알아보자. 이름에서도 알수 있듯이 메시지에 관련된 앱이다. 압축해제 후 디컴파일을 수행하여 원본코드를 보면 정말 간단하다.


[그림 12 - 메시지 전송 루틴]


OnCreate() 메소드가 호출되면 설정되어 있는 프리미엄 번호로 sendTextMessage() 메소드를 통해 메시지를 전송한다.


이번에는 googleservice.apk를 살펴보도록 하자. 해당 앱은 악성 패키지가 사용자에 의해 삭제되어 해당 스마트폰이 봇넷에서 빠졌을 때 봇의 기능은 하지 못하더라도 과금유발 기능은 하게끔 제작되어 있다. 또 서비스 이름이 사용자에게 친숙한 GoogleUpdateService이어서 사용자가 삭제하지 않을 확률이 높아 악성 앱이 지워지지 않을 확률이 높다.


[그림 13 - run() 메소드 루틴]


[그림 14 - OnCreate() 메소드 루틴]


OnCreate() 메소드를 보면 악성 앱에 대한 루틴은 없지만 메시지 전송 설정 루틴은 존재하는 것을 볼 수 있다.


마지막으로 unlock.apk 파일을 살펴보자.

해당 파일은 스마트폰의 화면잠금/절전모드를 변경하는 앱이다. 절전모드를 변경하여 감염 스마트폰의 전원을 급격히 소모하게 하려는 의도가 엿보인다.



[그림 15 - Unlock.apk]


클래스의 확장 속성을 보면 BroadcastReceiver이다. 앱에서 어떠한 이벤트가 발생하면 그것을 감지하는 속성인데 OnReceivce() 메소드를 보면 어떤 앱에서 메시지를 전달 받게 되면 화면잠금을 해제하고 새로운 절전모드를 설정한다.


 * 참고 : 새로운 절전모드로 264835462의 숫자를 사용하는데 이는 ACQUIRE_CAUSES_WAKEUP(268435456) + SCREEN_DIM_WAKE_LOCK(6)의 합이다. ACQUIRE_CAUSES_WAKEUP는 CPU를 ON 상태로 만들고 화면을 어둡게 만들며 키보드 레이아웃을 끄는 플래그이고, SCREEN_DIM_WAKE_LOCK는 어플에서 어떤 이벤트가 발생하면 화면과 키보드 레이아웃을 켜주는 플래그로 결국 BroadcastReceiver의 OnReceive() 메소드로 인해 스마트폰은 계속 화면이 켜져있는 상태가 될 것이다.


해당 악성 앱의 흐름을 살펴보면 [그림 16]과 같다.



[그림 16 - 악성 앱의 실행 흐름도]


 * 참고 : 이미지를 클릭하면 원본 이미지 크기로 보입니다.

+ Recent posts