naroSEC
article thumbnail

개요

안드로이드 앱 진단 시 루팅, 무결성, 디버깅 등과 같은 보안 위협에 탐지될 때, 별도의 우회 과정 없이 ADB를 이용하여 액티비티를 강제 실행함으로써, 탐지 프로세스가 무력화되는 경우가 종종 있다. 실제 필자가 진단 했던 A사의 앱의 경우에는 루팅 디바이스로 탐지될 경우 팝업을 사용자에게 표시하고 출력된 팝업 내에 "확인" 버튼을 클릭하면 앱 종료 프로세스가 동작하는 방식이었다. 그런데 여기서 "확인" 버튼을 누르지 않고 메인 화면에 해당하는 액티비티를 호출하면 앱이 종료되지 않고 정상 이용이 가능했다. 물론, 보안이 잘되어 있는 곳은 탐지 후 일정 시간이 지난 후에 앱이 자동으로 종료되게끔 설정한다. 하지만, 그러지 않은 곳은 간단한 조작을 통해 보안 탐지 프로세스를 무력화 시킬 수 있기 때문에, Frida 등을 이용한 우회 전 액티비티 강제 호출을 한 번 시도해보는 것이 좋다. 이번 포스팅에서는 ADB를 통해 외부에서 액티비티를 강제호출하는 방법을 기술하고자 한다.


사전 조건

액티비티를 강제로 호출하려면 사전에 특정한 조건을 충족시켜야 하며, AndroidManifest.xml에 "exported" 속성 값이 "true" 설정된 액티비티 한에서 외부 실행이 허용된다. [그림 1]은 Anditer 앱의 AndroidManifest.xml 파일 내용 중 일부로 그림과 같이 "exported" 속성 값이 "true"로 설정된 "com.playground.anditer.SplashActivity"는 외부에서 호출이 가능하다. 반면에 "false"로 설정된 액티비티는 호출이 불가능하다.

[그림 1] AndroidManifest.xml 파일 내용 중 일부


사용법 및 실습

액티비티는 "am" 명령어를 사용해서 호출할 수 있으며, "am"은 Activity Manager의 약자로 안드로이드에서 액티비티와 관련된 작업을 수행하는 데 사용되는 adb 명령어이다.

 

아래 [그림 2]와 같이 "exported" 속성 값이 "true"인 액티비티를 타겟으로 명령어를 사용하면 된다.

adb shell am start -n com.playground.anditer/com.playground.anditer.MainActivity

[그림 2] 액티비티 강제 호출

Anditer 앱의 경우 메인 화면에 진입하기 전에 인트로(SplashActivity) 화면이 출력되지만 [그림 2]와 같이 am 명령어를 통해 메인 화면(MainActivity)를 강제 호출할 경우 [그림 3] 처럼 인트로를 건너뛰고 바로 메인 화면으로 이동된다.

[그림 3] MainActivity 실행

am 명령어는 액티비티 호출 외에도 브로드캐스트, 인텐트 전달 시에도 사용되며, 대표적인 사용 방법은 아래와 같다. 

[ 브로드캐스트 인텐트 전송 ]

adb shell am broadcast -a com.playground.anditer.Message

[ 서비스 시작 ]

adb shell am startservice com.playground.anditer/.Service

[ 인텐트 전달 ]

adb shell am start -a android.intent.action.VIEW -d http://www.example.com

 

profile

naroSEC

@naroSEC

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...