Android Meterpreter shell 에서의 실행 권한 상승 삽질 이야기

저는 대체로 테스트폰에 작업할 때 meterpreter shell을 연결해놓고 사용합니다. 뭐랄까 ssh는 굳이 열어두고 싶진 않고 adb는 케이블 건드려서 끊길때 마다 불편해서 그냥 exploit app 하나 내려놓고 필요할때마다 실행하죠.

remote adb 앱들이 있긴한데, 당시에는 손이 좀 안갔습니다. 지금은 remote adb를 아주 좋아합니다.

아무튼 Android 환경에서 Meterpreter shell을 사용하다 보면 공통적으로 겪는 문제가 있는데요, 바로 실행 권한입니다. 보통 apk로 배포하거나, 브라우저 취약점을 이용하는 경우 앱을 실행하는 사용자 권한으로 실행되기 때문에 루팅된 단말이여도 Meterpreter는 root 권한으로 동작하지 않습니다.

오늘은 Android Meterpreter 환경에서 실행 권한을 Root로 바꿀 수 있는 방법들에 대한 이야기를 할까 합니다.

Why?

유저 권한으로 동작하는 Meterpreter는 제한이 많습니다. 그냥 data/data 디렉토리 접근에도 권한 문제로 파일들을 볼 수 없고 그러죠..

meterpreter > cd /data/data
meterpreter > ls
[-] stdapi_fs_ls: Operation failed: 1

이렇게 Operation failed가 발생하는 이유는 앱의 실행권한이 유저 권한이기 때문에 그렇습니다.

meterpreter > ps -S metasploit
Filtering on 'metasploit'

Process List
============

PID    Name                  User
---    ----                  ----
28135  com.metasploit.stage  u0_a183

제 테스트 기기에선 u0_a183 으로 실행되고 있네요.

보편적인 방법..

구글링을 해보면 거의 비슷한 이야기들이 나옵니다. shell 명령으로 meterpreter에서 android shell로 넘어간 후 su 명령으로 root 권한을 얻으라는 이야기죠.

meterpreter > shell
Process 1 created.
Channel 1 created.
id
uid=10183(u0_a183) gid=10183(u0_a183) groups=1015(sdcard_rw),1028(sdcard_r),3003(inet),50183(all_a183) context=u:r:untrusted_app:s0
su
id
uid=0(root) gid=0(root) context=u:r:init:s0

옙. 물론 당연히 잘 됩니다.. 그러나 저는 meterpreter 상태에서 root 권한이고 싶습니다. (exit로 넘어가게 되면 Channel이 종료되면서 권한이 다시 빠집니다. 결국 하위에 생성되는 shell 에만 su가 들어거기 떄문이죠.)

삽질1 - Post 모듈 찾아보기

혹시나 하는 마음에 Post 모듈을 뒤져보았습니다.

meterpreter > background
[*] Backgrounding session 6...
HAHWUL (Sessions: 1 Jobs: 0) exploit(multi/handler) > search android
[....]
   payload/android/meterpreter/reverse_http                                    normal     Android Meterpreter, Android Reverse HTTP Stager
   payload/android/meterpreter/reverse_https                                   normal     Android Meterpreter, Android Reverse HTTPS Stager
   payload/android/meterpreter/reverse_tcp                                     normal     Android Meterpreter, Android Reverse TCP Stager
   payload/android/meterpreter_reverse_http                                    normal     Android Meterpreter Shell, Reverse HTTP Inline
   payload/android/meterpreter_reverse_https                                   normal     Android Meterpreter Shell, Reverse HTTPS Inline
   payload/android/meterpreter_reverse_tcp                                     normal     Android Meterpreter Shell, Reverse TCP Inline
   payload/android/shell/reverse_http                                          normal     Command Shell, Android Reverse HTTP Stager
   payload/android/shell/reverse_https                                         normal     Command Shell, Android Reverse HTTPS Stager
   payload/android/shell/reverse_tcp                                           normal     Command Shell, Android Reverse TCP Stager
   post/android/capture/screen                                                 normal     Android Screen Capture
   post/android/manage/remove_lock                            2013-10-11       normal     Android Settings Remove Device Locks (4.0-4.3)
   post/android/manage/remove_lock_root                                        normal     Android Root Remove Device Locks (root)
   post/multi/manage/play_youtube                                              normal     Multi Manage YouTube Broadcast
   post/multi/manage/set_wallpaper                                             normal     Multi Manage Set Wallpaper
   post/multi/recon/local_exploit_suggester                                    normal     Multi Recon Local Exploit Suggester

권한 관련해선 suggester 정도가 있긴한데, 크게 도움은 되지 않습니다. (어차피 su로 바꾸면 끝인것을..)

삽질2 - shell to meterpreter

위에선 Post 모듈만 이야기드렸지만 Local exploit부터 여러가지로 고민을 좀 해봤지만 크게 성과는 없었습니다. 그러다 문뜩 든 생각이 기본 shell을 내린 후 (post 모듈로)su로 권한을 잡은 후 shell to meterpreter를 통해 쉘을 바꾸면 어떨까? 입니다.

결론부터 말씀드리면, 실패입니다. 왜인지는 모르겠지만, post 모듈 실행 단계에서 죽어버리네요 😭

삽질3 - Activity 실행 관련

현재 테스트중이자 그나마 가능성이 있어보이는 케이스는 meterpreter 가 있는 apk의 Activity를 root 권한에서 바로 실행하는 것 입니다. 테스트해보고 결과가 좋거나, 특이한 문제가 있다면 내용 추가하도록 하겠습니다.

여러가지 테스트를 해봤지만 결론은 이 방법으론 불가능합니다.

Android Activity는 기본적으로 사용자 권한으로 실행되고, 관리자에서는 실행되지 않아서 am 이나 intent를 통해서 실행은 불가능합니다. 단, 개별 기능단위로 su 권한을 부여하고 쉘 명령을 내리는 방식은 가능한데(루팅기능 쓰는앱 까서 보니깐 이런식이더라구요), 그런식으로 하기 위해선 meterpreter apk에 smali 코드로 추가해줘야 가능할 것 같네요.

adb shell am start --user 0 -a android.intent.action.MAIN -n com.metasploit.stage/.MainActivity
android.util.AndroidException: Can't connect to activity manager; is the system running?
    at com.android.commands.am.Am.onRun(Am.java:264)
    at com.android.internal.os.BaseCommand.run(BaseCommand.java:47)
    at com.android.commands.am.Am.main(Am.java:76)
    at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
    at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:250)
    at dalvik.system.NativeStart.main(Native Method)