注意
このツールは概念実証であり、教育目的のみを目的としています。
Seekerとは
位置情報の要求を許可するためのWebページを作成し、ユーザーが許可すると位置情報を取得するツール。
SeekerはJavaScriptでgeolocation api
を使用して位置情報の許可を要求し、デバイスに存在する GPS ハードウェアを使用して経度と緯度を取得する。
受信した情報の精度は約30メートルまで正確らしい。
攻撃準備
seekerの起動
テンプレートの選択
0~7の中でフィッシングサイトのテンプレートを選択する。
選択後にWebサーバーが起動する。
デフォルトではポート8080。
ngrokでサーバーを公開
ngrokを起動しフィッシングサイトを外部からアクセス可能な状態にする。
作成された偽のZoomページ。
ターゲット端末の位置情報を設定
今回はAndroidエミュレーター上で東京スカイツリーの位置に位置情報をセット。
オプションと環境変数の設定
オプション
-
-h
ヘルプ -
-k
KMLファイル名 -
-p
Webサーバーポート -
-u
アップデートのチェック -
-v
バージョンを表示 -
-t
指定されたインデックスを持つテンプレートを自動選択します -
-d
テスト目的で自動 http --> https リダイレクトを無効にする(index_temp.html ファイルを持つテンプレートでのみ機能します) -
--telegram
テレグラムBotに情報を送信し、使用するテレグラムトークンとチャットを提供 -
--webhook
処理されるイベントを Webhook エンドポイントに送信します
環境変数
-
DEBUG_HTTP
-dオプションと同じ -
PORT
-pオプションと同じ -
TEMPLATE
-tオプションと同じ -
TITLE
グループタイトルまたはページタイトルを入力してください -
REDIRECT
ジョブの完了後にユーザーをリダイレクトする URL を指定 -
IMAGE
使用するイメージを指定します。リモート (http または https) またはローカルのいずれかになります。
注: リモート イメージは起動時にローカルにダウンロードされます -
DESC
アイテムの説明を入力します -
SITENAME
ウェブサイトの名前を入力してください -
DISPLAY_URL
ページに表示する URL を指定します -
MEM_NUM
グループメンバーの数を提供します(これまでのテレグラム) -
ONLINE_NUM
グループのオンライン メンバーの数を提供します (これまでの Telegram) -
TELEGRAM
テレグラムボットに情報を送信するために使用するテレグラムトークンとチャットを提供します。 -
WEBHOOK
イベントを転送する Webhook URL を指定します。
攻撃
ターゲットがボタンをクリックすると位置情報を許可するかポップアップが出る。
ここで許可を押すと位置情報奪取完了。
ターミナル上に取得した情報が表示される。
[Google Maps]項目から場所を確認するとデバイスのロケーションと一致していることが確認できる。
取得可能情報
-
Longitude
: 経度 -
Latitude
: 緯度 -
Accuracy
: 正確さ -
Altitude
: 高度 - 常に利用できるわけではありません -
Direction
: 方向 - ユーザーが移動している場合にのみ使用可能 -
Speed
: 速度 - ユーザーが移動している場合にのみ使用可能 -
Unique ID using Canvas Fingerprinting
: Canvas Fingerprinting を使用した一意の ID -
Device Model
: デバイスモデル - 常に利用できるわけではありません -
Operating System
: オペレーティング·システム -
Platform
: プラットホーム -
Number of CPU Cores
: CPUコアの数 - おおよその結果 -
Amount of RAM
: RAM の量 - おおよその結果 -
Screen Resolution
: 画面の解像度 -
GPU information
: GPU情報 -
Browser Name and Version
: ブラウザ名とバージョン -
Public IP Address
: パブリックIPアドレス -
Local IP Address
: ローカルIPアドレス -
Local Port
: ローカルポート
対策
- 各ブラウザでJavaScriptを無効化する。(今回は裏でJsが動いているので有用だが、他サイトへの影響があるので実用的ではない)
- 正規サイトをブックマークしておき、ブックマークからアクセスする。
- サイトURLの確認。
- Webブラウザのバージョンをある程度新しいものにしておく。
- 身に覚えのないリンクアクセスしない。
おまけ
位置情報を取得する処理
Zoomテンプレートの場合、サイトのボタンをクリックした際にlocate
関数が実行される。
getCurrentPosition
の第一引数(位置情報を取得できた場合の処理)としてshowPosition
を指定している。
function locate(callback, errCallback) {
if (navigator.geolocation) {
var optn = { enableHighAccuracy: true, timeout: 30000, maximumage: 0 };
navigator.geolocation.getCurrentPosition(showPosition, showError, optn);
}
showPotision
で位置情報を取得している。
function showPosition(position) {
var lat = position.coords.latitude;
if (lat) {
lat = lat + ' deg';
}
else {
lat = 'Not Available';
}
var lon = position.coords.longitude;
if (lon) {
lon = lon + ' deg';
}
else {
lon = 'Not Available';
}
var acc = position.coords.accuracy;
if (acc) {
acc = acc + ' m';
}
else {
acc = 'Not Available';
}
var alt = position.coords.altitude;
if (alt) {
alt = alt + ' m';
}
else {
alt = 'Not Available';
}
var dir = position.coords.heading;
if (dir) {
dir = dir + ' deg';
}
else {
dir = 'Not Available';
}
var spd = position.coords.speed;
if (spd) {
spd = spd + ' m/s';
}
else {
spd = 'Not Available';
}
テンプレートの種類
-
NearYou
「Continue」ボタンをクリックすると位置情報を取得できる。
Google Drive
Google DriveのTemplateを選択後Google DriveのURLを入れる。
「Request access」ボタンをクリックすると入力したGoogle DriveのURLへリダイレクトされるようになっている。
処理部分は下記。
<p id="buttons" style="padding-top: 10px">
<button id="requestButton" style="font-weight:bold" class="jfk-button jfk-button-action" onclick="locate(function(){window.location='REDIRECT_URL';}, function(){$('#change').html('Failed');});">Request access</button>
</p>
開発者モードで見るとGoogle Driveへのリダイレクト処理がlocate
関数のcallback引数に入っている。
恐らくGoogle Driveのサーバー側でReferer
見るとこの偽ページのURLが入っていると思う。
zoom
「Launch Meeting」ボタンをクリックすると位置情報を取得できる。
Google ReCaptcha
テンプレートの選択後それぞれのフォワードURLを入力。
CheckBoxをクリックするとReal Forward URL
に飛ばされる。
CheckBoxをクリックするとmain
関数が実行される。
main関数ではlocate
関数が実行される。
function main(){
locate(transmitted, cap_error);
}
自作テンプレートも使用可能
参考サイト