PoisonTap - 从锁定的计算机上窃取 Cookie、暴露内部路由器并安装 Web 后门
由 @SamyKamkar 创建 || https://samy.pl
当 PoisonTap(Raspberry Pi Zero 与 Node.js)插入一台已锁定/受密码保护的计算机时,它可以:
- 通过 USB(或 Thunderbolt)模拟一个以太网设备
- 劫持来自该机器的所有互联网流量(尽管它是一个低优先级/未知的网络接口)
- 从 Web 浏览器中窃取并存储 Alexa 排名前 1,000,000 个网站的 HTTP Cookie 和会话
- 将内部路由器暴露给攻击者,使其能够通过出站 WebSocket 和 DNS rebinding 远程访问(感谢 Matt Austin 提出的 rebinding 思路!)
- 在数十万个域名和常见 Javascript CDN URL 的 HTTP 缓存中安装持久化的基于 Web 的后门,所有这些后门都能通过缓存投毒访问用户的 Cookie
- 允许攻击者远程强制用户发起 HTTP 请求,并携带用户的 Cookie 在任何被植入后门的域名上代理返回响应(GET 和 POST)
- 无需解锁机器
- 后门和远程访问在设备被移除且攻击者扬长而去之后仍然持续有效

(由 Ara 制作的令人惊叹的 HTML5 canvas 动画)
PoisonTap 绕过了以下安全机制:
演示
PoisonTap 专为 5 美元的 Raspberry Pi Zero 打造,除了一根 micro-USB 线和一张 microSD 卡之外无需任何额外组件;也可以在任意 Raspberry Pi(1/2/3)上配合以太网转 USB/Thunderbolt 转接器使用;还可以在能够模拟 USB gadget 的其他设备上运行,例如 USB Armory 和 LAN Turtle。
现场演示和更多详细信息请参见视频:

联系人: @SamyKamkar // https://samy.pl
发布: 2016 年 11 月 16 日
源代码和下载: https://github.com/samyk/poisontap
PoisonTap 的工作原理
PoisonTap 通过利用机器和网络中各种机制(包括 USB/Thunderbolt、DHCP、DNS 和 HTTP)的现有信任,产生级联效应,从而引发信息窃取、网络访问和半永久后门安装的滚雪球效应。

简而言之,PoisonTap 执行以下操作:
网络劫持
- 攻击者将 PoisonTap(例如武器化的 Raspberry Pi Zero)插入已锁定的计算机(即使计算机受密码保护)
- PoisonTap 模拟一个以太网设备(例如,通过 USB/Thunderbolt 的以太网)—— 默认情况下,Windows、OS X 和 Linux 会识别以太网设备,自动将其加载为低优先级网络设备并执行 DHCP 请求,即使在机器被锁定或受密码保护时也是如此
- PoisonTap 响应 DHCP 请求并向机器提供一个 IP 地址,但 DHCP 响应的构造方式会告诉机器整个 IPv4 空间(0.0.0.0 - 255.255.255.255)都是 PoisonTap 本地网络的一部分,而不是一个小型子网(例如 192.168.0.0 - 192.168.0.255)
- 通常情况下,如果辅助网络设备连接到机器,它会被赋予比现有(可信)网络设备更低的优先级,并且不会取代互联网流量的网关,因此无关紧要,但是……
- 任何路由表 / 网关优先级 / 网络接口服务顺序安全性都会因“局域网流量”优先于“互联网流量”而被绕过
- PoisonTap 即使作为低优先级网络设备,也能利用这种网络访问,因为低优先级网络设备的子网比最高优先级网络设备的网关(默认路由)具有更高的优先级
- 这意味着,如果流量目的地是 1.2.3.4,通常该流量会命中主(非 PoisonTap)网络设备的默认路由/网关,但 PoisonTap 实际上会获得该流量,因为 PoisonTap 的“本地”网络/子网据称包含 1.2.3.4,以及存在的其他每一个 IP 地址 ;)
- 因此,即使机器连接到另一个具有更高优先级和正确网关(真正的 wifi、以太网等)的网络设备,所有互联网流量也会经过 PoisonTap

Cookie 窃取
- 只要 Web 浏览器在后台运行,打开的页面中很可能有一个会在后台发起 HTTP 请求(例如加载新的广告、向分析平台发送数据,或者只是继续跟踪你的网页浏览行为),方式是通过 AJAX 或动态 script/iframe 标签
- 你可以亲自验证:打开开发者工具/检查器(通常是 Cmd+Shift+I 或 Ctrl+Shift+I),访问一个访问量很大的网站,点击 Network 标签,就会看到即使你在页面上没有任何操作,远程资源仍在继续被访问
- 在这个 HTTP 请求发出时,由于所有流量都会经过 PoisonTap 设备,PoisonTap 会实时进行 DNS 欺骗,返回自己的地址,从而使 HTTP 请求命中 PoisonTap 的 Web 服务器(Node.js)
- 如果 DNS 服务器指向 PoisonTap 无法获得权限的内部 IP(LAN),攻击仍然有效,因为内部 DNS 服务器会为被攻击的各个域名产生公网 IP 地址,而 PoisonTap 已经劫持了这些公网 IP
- 一旦内部 DNS 服务器响应,Web 浏览器会命中公网 IP,最终在任一场景下都会命中 PoisonTap 的 Web 服务器(Node.js)
- 当 Node Web 服务器收到请求后,PoisonTap 会返回一个既可以解释为 HTML 又可以解释为 Javascript 的响应,两者都能正确执行(许多网站会在后台请求中加载 HTML 或 JS)
- 这个与 HTML/JS 无关的页面随后会生成许多隐藏的 iframe,每个 iframe 都指向 Alexa 排名前一百万的一个不同域名
- 域名上的任何“X-Frame-Options”安全性都会被绕过,因为 PoisonTap 现在是 HTTP 服务器,可以选择向客户端发送哪些头
- 由于对站点的每个 iframe HTTP 请求都会被发出(例如,http://nfl.com/PoisonTap),HTTP cookie 会从浏览器发送到被 PoisonTap 劫持的“公网 IP”,PoisonTap 会迅速记录这些 cookie/认证信息,将用户的数万个 cookie 记录到 PoisonTap 中
- 任何“HttpOnly”cookie 安全性都会被绕过,因为这些 cookie 会被捕获,因为并没有在域名本身执行 Javascript,而只是首先用其加载 iframe
- 任何跨域资源共享或同源策略安全性都会被绕过,因为浏览器认为正在访问的域名是合法的
- 由于我们捕获的是 cookie 而不是凭据,因此当攻击者使用 cookie 登录时,站点上实施的任何 2FA/MFA 都会被绕过。这是因为我们实际上并没有执行登录功能,而是继续一个已经登录的会话,这不会触发双因素认证
- 如果服务器使用 HTTPS,但 cookie 没有显式设置 Secure cookie 标志,那么 HTTPS 保护就会被绕过,cookie 会被发送到 PoisonTap

可远程访问的基于 Web 的后门
- 当 PoisonTap 产生数千个 iframe、强制浏览器加载每一个时,这些 iframe 并不是空白页面,而是缓存的 HTML+Javascript 后门,可以无限期缓存
- 由于 PoisonTap 在每个域名上强制缓存这些后门,后门与那个域名绑定,使攻击者将来能够使用该域名的 cookie 并发起同源请求,即使当前用户并未登录
- 页面的实际响应是 HTML 和 Javascript 的组合,会产生一个持久的 WebSocket 连接到攻击者的 Web 服务器(通过互联网,而不是在 PoisonTap 设备上)
- WebSocket 保持打开状态,允许攻击者在将来的任何时刻连回被植入后门的机器,并在任何已植入后门的源上执行请求(Alexa 排名前 1,000,000 的站点——见下文)
- 如果后门在一个站点(例如 nfl.com)上打开,但用户想要攻击另一个域名(例如 pinterest.com),攻击者可以加载 nfl.com 上的一个 iframe 指向 pinterest.com 的后门(http://pinterest.com/PoisonTap)
- 同样,域名上的任何“X-Frame-Options”、跨域资源共享和同源策略安全性都会被完全绕过,因为请求会命中 PoisonTap 留下的缓存,而不是真实域名

内部路由器后门与远程访问