
为渗透测试人员打造的武器化多用户浏览器中间人(BitM)攻击工具。该攻击可用于绕过许多高价值 Web 应用的多因素认证。即使在不使用会话令牌的应用中也能生效,因此传统的令牌窃取攻击无法利用这些应用。这是一款社会工程学工具,不会利用目标服务的任何技术缺陷。
该工具是一个专门的 Web 服务器,设计运行在 Debian 11 (Bullseye) Linux 服务器上,并依赖公网 IP 信息来保护管理功能。如果不费一番周折,别指望能在本地测试。
警告:Chromium 不支持 ARM。虽然技术上可以强制使用 ARM 版 Chromium 二进制文件,但会失去 puppeteer-extra 的所有额外功能和保护。
本示例配置使用 Caddy 处理 TLS、SNI 并添加一些自定义请求头(如 'X-Real-IP')。你并非必须将 Cuddlephish 与 Caddy 一起使用,同样的反向代理可以通过 Nginx、Apache 等设置。我喜欢 Caddy 是因为它易于用 Docker 安装,并且有插件可以为大多数域名注册商管理 Letsencrypt 证书。示例 Caddyfile 展示了如何为 Gandi 进行设置。请查阅你的注册商文档。
安装 Docker、Node、XVFB 以及其他依赖项:
git clone https://github.com/fkasler/cuddlephish
cd cuddlephish
sudo bash install_deps.sh
然后你可以使用 Docker 构建一个包含注册商通配符证书插件的 Caddy。示例针对 Gandi。请查看此处的文档以及此处的 DNS 提供商模块列表。在构建前,你可以根据需要修改 Dockerfile 以适应你的注册商:
sudo docker build -t caddy .
现在修改 Caddyfile,替换你的域名和 Gandi(或其他注册商)的 API 密钥,然后启动 Caddy。建议在 screen 或 tmux 窗口中启动,这样稍后你可以在另一个窗口中运行 Node 服务器:
sudo docker run -p 80:80 -p 443:443 -p 2019:2019 -v $PWD/Caddyfile:/etc/caddy/Caddyfile --network=host caddy:latest
当 Caddy 在 80 和 443 端口为我们处理流量后,我们终于可以运行该工具了!
安装 Node 依赖:
npm install
进行一些配置调整: 关键步骤:务必修改示例 config.json,添加你的管理访问授权公网 IP。这个 IP 白名单决定了能否访问 "/admin" 管理界面。你还应将默认的 socket 密钥改为更安全的值。
该工具默认没有设置任何目标登录页面,因此你需要添加一些目标。有一个 'add_target.js' 脚本可以简化此步骤。只需运行该脚本,然后按提示粘贴你想要攻击的登录门户 URL:
node add_target.js
该脚本会抓取服务名称、标签页标题和网站图标,并将条目添加到 'targets.json' 中。你可以多次运行此脚本,它会追加新目标。脚本会基于域名为每个服务命名(不含顶级域)。例如,对于 'https://www.example.com/login.php',当你指定目标时,服务名称就是 'example'。然后……
运行它!
node index.js example
几秒钟后,当你的第一个自动化 Chrome 实例通过 WebSocket 连接时,应在控制台中看到一条消息。现在访问你的钓鱼网站的用户应该会看到目标登录页面,但实际上是你自动化浏览器实例的视频流。他们还可以与你的浏览器实例交互并为你登录。
如果你在 config.json 中正确配置了管理 IP,那么你应该能够访问特殊的 '/admin' 管理界面,用于跟踪用户、查看按键日志、接管已登录浏览器实例的控制权、窃取 Cookie 以及删除不需要的浏览器实例。
注意:在有一些受害者之前,管理页面中不会显示任何内容。一旦有受害者,他们的浏览器实例应该会出现在管理界面上。
我收到过一些关于“空白白页”的问题,这通常是多种可能问题的症状,而不是问题本身。请不要以模糊的症状名称提交问题。相反,如果用户在用户端看到空白页面,请首先检查以下内容:
从宏观角度看,如果你在前端只看到空白页面,意味着数据流链条中出现了问题:从“启动 WebRTC” > “选择要广播的标签页” > “与受害者浏览器协商 ICE” > “流式传输视频”。上述故障排除步骤旨在帮助你追踪数据流。正常工作时,你应在服务器上看到类似以下的日志流:
希望这对排查问题有所帮助。一如既往,提交问题以进行进一步调查的先决条件是提供足够的信息以稳定重现问题。
通过 JavaScript 手动触发载荷下载到受害者系统。每个目标默认以 'payload.txt' 作为测试载荷。只需在 targets.json 中更改文件位置即可发送自定义载荷。
向受害者发送一个 window.location 变更,将其重定向到真实的登录门户。这看起来像是强制他们重新认证,并防止他们看着你接管控制权。如果你修改代码,可以利用此技巧实现其他有趣的功能 ;)
允许你直接从管理界面介入并接管浏览器实例的控制权。要停止控制实例,按 ESCAPE 键。注意:这会从钓鱼受害者手中夺走控制权,如果你没有先踢出他们,他们将能看到你的操作。注意了。
允许你手动将自动化浏览器实例的控制权交还给用户。这在冒充 IT 支持的社会工程学场景中可能很有用。你可以告诉用户你正在启动协助会话,接管控制并导航到目标服务,交还控制权让他们登录,再次接管控制等。
从浏览器实例中提取所有 Cookie 和本地存储项,并将其下载为 JSON 文件。要将这些凭证材料注入到你本地系统上运行的浏览器实例中,项目里包含了一个名为 'stealer.js' 的脚本。该脚本应在你的个人机器上运行,而不是在服务器上,因此使用它时你还需要在你的系统上安装该项目的 Node 组件。
node stealer.js ~/Downloads/cuddle_asdf1234.json
当你不再需要某个浏览器实例时将其杀死。有时用户未能让你完全登录。有时 WebRTC 连接失败。有时会话在你使用之前就过期了。在这种情况下,此按钮可帮助你通过管理界面清理无用的浏览器实例。
每个浏览器在生成时都带有自己的随机“浏览器 ID”以及项目“user_data”文件夹中对应的用户数据目录。在某些情况下,如果 'stealer.js' 无法正常工作,你可能还需要复制该实例的用户数据。这在针对具有“记住此浏览器”功能的服务时可能有用,具体取决于该功能的实现方式。
每个用户数据目录中还有一个 keylog.txt 文件,其中包含受害者用户的完整按键日志。而管理界面中的通用按键日志会尝试处理退格键等情况,而此 keylog.txt 会记录所有按键。
示例 pm.json:
{
"tacking_id": "id",
"logging_endpoint": "https://www.phishmongerserver.com/create_event",
"admin_cookie": "admin_cookie=s3cret",
"post_url_search": "ppsecure"
}
该工具通过将钓鱼网站访问者与运行在钓鱼服务器上的自动化 Chrome 浏览器配对来工作。攻击者控制的 Chrome 实例的视频流通过 WebRTC 传输给钓鱼受害者,所有用户输入的鼠标移动和键盘事件都会从受害者浏览器转发到其对应的 Chrome 实例。服务器使用 WebSocket 来跟踪受害者、将其与浏览器配对、中转 WebRTC 视频流以及中间人用户输入。对于每个新访问者,服务器会生成一个新的 Chrome 实例。由于我们使用 Chrome Devtools 协议 (CDP) 驱动每个 Chrome 实例,因此我们可以使用诸如 "Storage.getCookie" 之类的 API 在用户为我们登录后提取目标站点的会话 Cookie。我们还可以随时介入并直接驱动每个 Chrome 实例,利用最初赋予受害者远程控制的相同方法。
Node 服务器执行以下操作:
据我所知,这种技术已被理论化甚至武器化多年(见致谢)。因此,虽然威胁行为者可以利用这项技术(可能已经使用了一段时间),但攻击性安全专业人员一直缺乏一种简单的方法来复现这项技术,甚至可能不知道它的存在。我发布该工具的目的是让渗透测试人员和红队成员能够在行动中使用 BitM,展示其潜在影响,并帮助网络防御者为真实威胁做好准备。
首先,要明白这种攻击依赖于社会工程学诱导用户访问恶意网站。域名白名单可以大大有助于防止此类及其他类型的社会工程学攻击。如果我们依赖用户管理 Web 服务的 100% 凭证数据(密码、OTP、短信、PhoneFactor、推送通知等),那么我们就有可能受到这种攻击。因此,要挫败这种攻击,我们需要利用用户不管理的凭证数据。例如,客户端 TLS 证书可以颁发给客户端设备,并且仅对真实 Web 服务有效。证书由浏览器和操作系统管理,攻击者的服务器无法获取受害者 TLS 证书的副本。另一种选择是使用 U2F 或 FIDO2 配合 YubiKey 等硬件来管理部分必需的凭证数据。黑客的网站无法与插入受害者电脑的 YubiKey 进行交互。
我还不是 Docker 高手(至少现在不是)。如果你能提供一个简单的 Docker 化设置,我非常欢迎拉取请求。
名字源于 Cuttlefish(乌贼),一种能融入环境的酷炫海洋生物;加上 Phishing(钓鱼),因为执行攻击需要社会工程学;并且故意拼写错误以使其独特、有趣和俏皮。想到这个有趣的工具名称将与其他高危风险发现一起出现在渗透测试报告中,我就很愉快。
虽然我独立想出了这项技术及实现,但我后来了解到还有另外两位研究人员比我更早发现。他们各自采用了基于 Web 的 VNC 客户端来实现类似效果。这是一种直观的方法,可能也适用于对其他软件(不仅仅是浏览器)执行中间人攻击(比如浏览器中的 VPN?)。绝对值得一看:
Franco Tommasi, Christian Catalano & Ivan Taurino https://link.springer.com/article/10.1007/s10207-021-00548-5
@mrd0x https://mrd0x.com/bypass-2fa-using-novnc/
另外:
感谢 Daniel Aaron @majordmg 在 WebRTC 概念验证的早期阶段提供的帮助。
非常感谢 RJ Stallkamp @Z3rO-C00L 修复和管理界面的样式美化,以及制作出这个酷炫的新标志。