这个概念验证专注于 BEAST(针对 SSL/TLS 的浏览器攻击)攻击背后的密码学,该攻击由 Thai Duong 和 Juliano Rizzo 于 2011 年 9 月 23 日提出。这是一种选择明文攻击,如果所使用的传输层安全协议是 TLS1.0 或 SSLv3,它允许你检索敏感信息。 原始概念验证可在此处找到:Here come the Ninjas
注意:这也是对最初由 Phillip Rogaway 发现的漏洞的一种实现。该漏洞于 2002 年被发现,直到 2011 年 BEAST 出现之前都没有公开的利用代码。OpenSSL 早已知道这个问题,这也是他们在 2006 年 4 月将 TLS1.0 更新到 TLS1.1 的原因。
2 除第一条记录外,每条记录的 CBC IV 都是前一条记录的最后一个密文块。因此,这种加密方式对于能够自适应选择明文的攻击者来说是不安全的;
SSLv3/TLS1.0 是用于加密/解密并保护你的数据的协议。在我们的场景中,它们都使用 CBC 密码模式链接。明文根据加密算法(AES、DES、3DES)被分成块,长度为 8 或 16 的倍数。如果明文没有填满长度,会在末尾添加填充以补足缺失的空间。我强烈建议你打开这张加密和解密的图片来阅读本自述。
| 加密 | 解密 |
|---|---|
| Ci = Ek(Pi ⊕ Ci-1), 且 C0 = IV | Pi = Dk(Ci) ⊕ Ci-1, 且 C0 = IV |
基本上这只是些简单的 XOR,你也可以观看这个视频(不是我)https://www.youtube.com/watch?v=0D7OwYp6ZEc。
我将在下一点介绍 IV。请记住,所有这些性质都将帮助我们发起攻击。
当我们使用 CBC 时,需要一种称为 IV 的初始化向量。这个 IV 是随机的(或固定的),但无论如何,任何人都不应能预测它。在 TLS1.0 和 SSLv3 中,请求的第一个 IV 是随机的,这没问题。但为了节省时间,不必每次都生成新的随机 IV,TLS1.0 和 SSLv3 的实现将前一个密文的最后一个块用作 IV。换句话说,IV 现在可以猜测了。 我们假设每个块的长度为 8(DES),并且攻击者通过 MiTM 获取所有密文。
示例:
C0 | C... | Ci-1 | Ci | Ci+1 |Cn
现在是有趣的部分,以下是该攻击为了恢复一个字节所经历的不同密码学步骤:
bbbbbbbTHIS_IS_A_SECRET_COOKIE你可以注意到秘密 cookie 前面的七个 b。如果块的长度是 8,我们需要推入 7 个已知字节。这个信息非常重要,攻击者知道第一个块的前 7 个字节。
但为什么?这让我们只需 256 种可能性就能找到一个字节,而不是用 256^8 来找 8 个字节!
现在受害者发送请求,它将被这样加密:
C0 | C1 | C2 | C3 | C4
其中 C0 = Ek(IV ⊕ bbbbbbbT) = Ek(C²n ⊕ bbbbbbbT)
P'0 = C²n ⊕ C4 ⊕ bbbbbbbX
唯一未知的元素是 X,共有 256 种可能性,因此他最多尝试 256 个字符。
请求被发送并按如下方式加密:
C'0 = Ek(P'0 ⊕ IV')
C'0 = Ek(C²n ⊕ C4 ⊕ bbbbbbbX ⊕ IV'),其中 C4 ⊕ IV' = 0
C'0 = Ek(C²n ⊕ bbbbbbbX)
C'0 = Ek(IV ⊕ bbbbbbbX)
现在他比较 C'0 和 C0:如果它们相等,那么他就找到了第 8 个位置的字节 X。如果不匹配,他会用另一个字符重试并再次比较,依此类推。
现在我们有了一个字节,可以通过将之前的请求向左移动一位来获得另一个字节:bbbbbbTHIS_IS_A_SECRET_COOKIE。他现在有六个 b,而且我们也知道 T,所以还剩一个未知字符。我们构造新的 P'0 = C0 ⊕ C4 ⊕ bbbbbbTX,依此类推。
注意:另一种只需两个请求的方法是将明文的第一个块设置为该信息,并将其用于三个 XOR。我们不再需要 C² 的最后一个块。C1 = Ek(C0 ⊕ bbbbbbbT),然后 P'0 = C0 ⊕ C4 ⊕ bbbbbbbX。他还需要比较 C'0 和 C1。 这是另一种做法,你可以在 PoC 中注意到我把两种可能性都编码了 :)
我们现在可以恢复所有字符了!
python BEAST-poc.py
攻击者无法使用 HTTP 协议,因为第一个块会被 GET / HTTP/1.1\r\n 填充。
...无法控制每个请求的前几个字节,因为它们总是被设置为固定字符串,例如 GET /、POST / 等。相反,他可以使用套接字。
他还需要向恶意页面注入一些 javascript。受害者需要连接到这个页面,并在攻击完成前一直停留在该页面。 这是一种选择明文攻击,因此攻击者可以通过 javascript 代码发送他想要的任何明文,并通过中间人(Man in The Middle)拦截结果。这是攻击的示意图:

这次攻击需要一些重要条件才能成功(TLS1.0 或更低版本、CBC 密码模式、MiTM、恶意 javascript)。但 Thai Duong 和 Juliano Rizzo 证明了它是可行的,并通过在 Paypal 网站上窃取 cookie 展示了他们的漏洞利用。
现在一切都已修复,这种攻击实现的可能性很小。