Seekerで位置情報を特定する

## 注意

:::note alert
このツールは概念実証であり、教育目的のみを目的としています。
:::

## Seekerとは

位置情報の要求を許可するためのWebページを作成し、ユーザーが許可すると位置情報を取得するツール。

SeekerはJavaScriptで`geolocation api`を使用して位置情報の許可を要求し、デバイスに存在する GPS ハードウェアを使用して経度と緯度を取得する。

:::note info
受信した情報の精度は約30メートルまで正確らしい。
:::

https://github.com/thewhiteh4t/seeker/tree/master

## 攻撃準備

### seekerの起動

![run.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/3c4f0122-8a82-a559-61d0-8ce3bb9a6286.png)

### テンプレートの選択

0~7の中でフィッシングサイトのテンプレートを選択する。

![select_zoom.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/71bc6787-d664-26a8-fcd3-4d30c29281f5.png)

選択後にWebサーバーが起動する。
デフォルトではポート8080。

### ngrokでサーバーを公開

ngrokを起動しフィッシングサイトを外部からアクセス可能な状態にする。

![ngrok.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/5e5008a2-ac89-52ef-95fb-f1f20c98539c.png)

作成された偽のZoomページ。

![zoom.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/e68c5d73-61a6-592e-987b-c5d9f8a4fea9.png)

### ターゲット端末の位置情報を設定

今回はAndroidエミュレーター上で東京スカイツリーの位置に位置情報をセット。

![set_location.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/71a7e70c-6266-3e60-d4b7-f82b9d9b7125.png)

## オプションと環境変数の設定

### オプション

- `-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 を指定します。 

## 攻撃

ターゲットがボタンをクリックすると位置情報を許可するかポップアップが出る。

![first_action.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/206c59a3-0b06-6975-bec3-32e0794f3bc1.png)

ここで許可を押すと位置情報奪取完了。

![success.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/c67b416f-9dce-a13b-c97a-a5c54e5081c8.png)

ターミナル上に取得した情報が表示される。

![getinfo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/f1ee75fd-ca32-27f9-6fed-56c332ad7614.png)

[Google Maps]項目から場所を確認するとデバイスのロケーションと一致していることが確認できる。

![getlocation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/a6c6638f-b26f-5164-5a2b-91e2af52ecf3.png)

### 取得可能情報

- `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`関数が実行される。

![jscode.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/4e4efcc3-f939-12a1-a516-6ff3684899a0.png)

`getCurrentPosition`の第一引数(位置情報を取得できた場合の処理)として`showPosition`を指定している。

```seeker/js/location.js
function locate(callback, errCallback) {
  if (navigator.geolocation) {
    var optn = { enableHighAccuracy: true, timeout: 30000, maximumage: 0 };
    navigator.geolocation.getCurrentPosition(showPosition, showError, optn);
  }
```
`showPotision`で位置情報を取得している。

```seeker/js/location.js
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」ボタンをクリックすると位置情報を取得できる。

![access.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/383199e2-fc01-b0ae-adce-397b65a458be.png)

- `Google Drive`

Google DriveのTemplateを選択後Google DriveのURLを入れる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/cb910a0c-2041-27e5-190d-a020a648c1e8.png)

「Request access」ボタンをクリックすると入力したGoogle DriveのURLへリダイレクトされるようになっている。

![googledrive_firstpage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/62f6dbaa-3510-5255-c76e-5002ee692713.png)

![open_gdrive.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/b56c84c9-0e65-0b1a-4402-40c4a008de62.png)

処理部分は下記。

```seeker/template/gdrive/index_temp.html
<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引数に入っている。

![gdrive_link.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/95634b5d-814d-e03a-c50a-bf3754a1b2b9.png)

:::note info
恐らくGoogle Driveのサーバー側で`Referer`見るとこの偽ページのURLが入っていると思う。
:::

- `zoom`

「Launch Meeting」ボタンをクリックすると位置情報を取得できる。

![zoom.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/494cbd30-d0f7-2a9c-3994-ffea9a51a20b.png)

- `Google ReCaptcha`

テンプレートの選択後それぞれのフォワードURLを入力。

![recap_temp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/57bfc98f-a40e-6e69-6932-38e64f754cd6.png)

CheckBoxをクリックすると`Real Forward URL`に飛ばされる。

![recapchar.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/64b016e5-facb-4ee3-b5b5-7f429a58ecbe.png)

CheckBoxをクリックすると`main`関数が実行される。

![recapcha_onclick.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/5e6dce1d-960b-5f33-bad3-52669957b6fa.png)

main関数では`locate`関数が実行される。

```template/captcha/js/main_temp.js
function main(){
  locate(transmitted, cap_error);
  }
```

- `自作テンプレートも使用可能`

# 参考サイト

https://thewhiteh4t.github.io/2018/11/16/seeker-find-geolocation-with-high-accuracy.html

https://medium.com/@frost1/how-to-accurately-locate-smartphones-using-seeker-3237c58b1776

https://developer.mozilla.org/ja/docs/Web/API/Geolocation_API

https://www.npa.go.jp/bureau/cyber/countermeasures/fake-shop.html