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

SSLv3 是一种用于加密/解密和保护数据的协议。在我们的案例中,它使用 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。
使用 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-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 client。已在 Chrome 15 版本上测试,但在 Firefox 上无效(我认为它不支持协议重新协商),查看 #4
漏洞利用的完整视频:

Asciinema: