Poodle 攻击(Padding Oracle On Downgraded Legacy Encryption)的概念验证:
一种中间人攻击,它利用了 Internet 和安全软件客户端回退到 SSL 3.0 的机制
如果所使用的传输层安全协议是 SSLv3,Poodle 攻击可让您检索客户端发送到服务器的加密数据。但它无法让您获取用于加密请求的私钥。

SSLv3 是一种用于加密/解密并保护数据的协议。在我们的场景中,它使用 CBC 密码块链接模式。明文根据加密算法(AES、DES、3DES)分成若干块,且长度为 8 或 16 的倍数。如果明文未填满该长度,会在末尾添加填充以补足缺失的空间。我强烈建议您在阅读本说明时打开这张加密和解密示意图。
| 加密 | 解密 |
|---|---|
| Ci = Ek(Pi ⊕ Ci-1), and C0 = IV | Pi = Dk(Ci) ⊕ Ci-1, and C0 = IV |
基本上这只是简单的 XOR 运算,您也可以观看这个视频(不是我做的)https://www.youtube.com/watch?v=0D7OwYp6ZEc。
使用 SSLv3 通过 HTTPS 发送的请求将使用 AES/DES 和 CBC 模式加密。SSlv3 相对于 TLS1.x 的特殊之处在于填充。在 SSLv3 中,填充由随机字节构成,只有最后一个字节等于填充长度。
示例:
T|E|X|T|0xab|0x10|0x02 其中 0xab|0x10|0x02 是填充。
T|E|X|T|E|0x5c|0x01 其中 0x5c|0x01 是填充。
此外,最后一个块也可以填满一整块填充,这意味着最后一个块除最后一个字节外可以全是随机字节。
T|E|X|T|E|0x5c|0x01|0x3c|0x09|0x5d|0x08|0x04|0x07 其中 |0x5c|0x01|0x3c|0x09|0x5d|0x08|0x04|0x07 是填充,攻击者只知道其中的 0x07。因此,如果攻击者能够影响填充块,他就能知道最后一个块的最后一个字节等于一个块的长度。
攻击者必须能够让受害者发送请求(例如通过利用 XSS 注入 javascript)。然后他可以控制每个请求的路径和数据:
示例:在请求的路径中添加 "A" 字节
GET / HTTP/1.1\r\nSECRET COOKIE\r\n\r\n
GET /AAA HTTP/1.1\r\nSECRET COOKIE\r\n\r\nDATA
利用这种技术,他可以影响填充。
SSLv3 还使用 HMAC 来检查明文的完整性和真实性。
键控哈希消息认证码(HMAC)是一种特定类型的消息认证码(MAC),它结合了加密哈希函数(因此称为 'H')与一个机密加密密钥
因此,攻击者无法拦截并篡改请求后再将其发回。如果服务器遇到问题,它会发送一个 HMAC 错误。
SSLv3 协议使用以下流程:它接收来自客户端的数据,解密数据,并使用 HMAC 检查完整性。
先 MAC 后加密(MAC-then-Encrypt): 不会对密文提供任何完整性保护,因为在解密消息之前,我们无法知道它究竟是真实的还是被伪造的。 仅提供明文完整性。 如果密码方案是可延展的,则有可能修改消息使其显得有效并拥有有效的 MAC。当然,这是一个理论上的观点,因为实际上 MAC 密钥 > 应该能提供保护。 在这里,MAC 也无法提供关于明文的任何信息,因为它已被加密。
https://crypto.stackexchange.com/questions/202/should-we-mac-then-encrypt-or-encrypt-then-mac
这意味着我们可以在服务器不知情的情况下篡改密文。这真的很棒 :)
首先,最后一个块需要填满填充,正如我们之前看到的,攻击者使用请求的路径并检查请求的长度。
由于最后一个块除最后一个字节外全为随机字节,他可以用想要解密的块 Ci 替换这最后一个块 Cn。篡改后的请求被发送到服务器。
服务器:
通过替换最后一个块,攻击者同时也会改变最后一个块的最后一个字节(即填充长度)。替换到填充块中的最后一个字节与原来相同的概率为 1/256,在这种情况下不会出现填充错误,攻击者可以通过以下运算利用这次 XOR 操作来获取块 Ci 的最后一个字节:
Pn = Dk(Cn) ⊕ Cn-1
Pn = Dk(Ci) ⊕ Cn-1
Pn = Dk(Ci) ⊕ Cn-1
xxxxxxx7 = Dk(Ci) ⊕ Cn-1
Dk(Ci) = xxxxxxx7 ⊕ Cn-1
Pi ⊕ Ci-1 = xxxxxxx7 ⊕ Cn-1
Pi = Ci-1 ⊕ xxxxxxx7 ⊕ Cn-1
(xxxxxxx7 或 xxxxxxx15,其中 x 为随机字节)
块的最后一个字节可以通过 Pi[7] = Ci-1[7] ⊕ xxxxxxx7 ⊕ Cn-1[7] 获取。 如果出现填充错误,攻击者需要关闭 SSL 会话以进行另一次握手(获取新的 AES 密钥)并获得新的密文,然后替换最后一个块,依此类推。(通常需要 +300 次握手)
一旦获取一个字节,他就可以通过在路径中添加一个字节并在数据中移除一个字节来获取该块的所有其他字节:
| 用于获取字节 E,I,K,O 的请求 |
|---|
| GET /a SECRET_COOKIE dataazerty PADDING_7 |
| GET /aa SECRET_COOKIE dataazert PADDING_7 |
| GET /aaa SECRET_COOKIE dataazer PADDING_7 |
| GET /aaaa SECRET_COOKIE dataaze PADDING_7 |
尽管 TLS 规范要求服务器检查填充,但一些实现未能正确验证填充,这使得某些服务器即使禁用了 SSL 3.0 也容易受到 POODLE 攻击
TLS 通常对 Poodle 是安全的,但一些实现不检查填充,就像使用了 SSLv3 一样,这就是为什么某些 TLS 版本容易受到攻击。
本仓库中有三个文件:
这个 PoC 探索了攻击背后的密码学原理。该文件让我们能够以简单的方式理解攻击的工作原理。
python3 poodle-poc.py
parallelization-poodle.py 文件是一个项目,也是一个想法 :) 查看 https://github.com/mpgn/poodle-PoC/issues/1
python3 parallelization-poodle.py
这是真正的漏洞利用程序。如果您在渗透测试期间,想针对使用了老旧服务器和浏览器的客户演示 Poodle 攻击的概念验证,它非常有用。只需将恶意代理的 IP 和正确端口配置到浏览器中,代理会处理其余的事情。
要求:
security.tls.version.min: 0 强制仅使用 SSLv3。或者,如果客户端也使用 TLS,您可以强制降级
💀 如果您满足这些前提条件,就可以开始攻击了 💀:
此漏洞利用程序有两种方案可选:
$> echo 1 > /proc/sys/net/ipv4/ip_forward
$> iptables -i vmnet1 -t nat -A PREROUTING -p tcp --dport 1337 -j REDIRECT --to-ports 1337
arpspoof、ettercap 或 bettercap 工具运行 ARP 欺骗攻击$> bettercap -iface vmnet1
net.show
set arp.spoof.internal true
arp.spoof on
⋊> ~/T/poodle-Poc on master ⨯ python3 poodle-exploit.py -h 13:10:24
usage: poodle-exploit.py [-h] [--start-block START_BLOCK]
[--stop-block STOP_BLOCK] [--simpleProxy SIMPLEPROXY]
proxy port server rport
Poodle Exploit by @mpgn_x64
positional arguments:
proxy ip of the proxy
port port of the proxy
server ip of the remote server
rport port of the remote server
optional arguments:
-h, --help show this help message and exit
--start-block START_BLOCK
start the attack at this block
--stop-block STOP_BLOCK
stop the attack at this block
--simpleProxy SIMPLEPROXY
Direct proxy, no ARP spoofing attack
$> python3 poodle-exploit.py 192.168.13.1 4443 192.168.13.133 443 --start-block 46 --stop-block 50
选择块:如果您不指定块选项,所有块都将被解密,但这可能需要很长时间。我强烈建议您先了解请求的格式,并使用脚本 request-splitter.py 来确定您想要解密的块(理想情况下是 cookie 块!:)
然后,例如通过 XSS 将恶意 javascript 代码(poodle.js)注入易受攻击的网站。启动 python 脚本并输入 help,然后输入 search,最后输入 active。在此期间,只需要与 javascript 进行两次交互(search 和 active 命令)。
更新 01/04/2018:漏洞利用程序已新增降级选项。当漏洞利用程序检测到 TLS 协议时,输入命令 downgrade 即可降级到 SSLv3.0。
它是如何工作的?在握手期间(客户端 hello 之后),漏洞利用程序发送一个 handshake_failure 15030000020228,然后浏览器应重新发送一个以 SSLv3.0 为默认协议的客户端 hello。已在 Chrome 15 版本上测试,但在 Firefox 上不起作用(我认为它不支持协议重新协商),请查看 #4
漏洞利用的完整视频:

Asciinema: