如何测试TLS中的POODLE漏洞?

9
我希望能够测试TLS的POODLE漏洞。
已经有几种方法可以实现,例如Qualys SSLLabs,但它太过局限(只能测试互联网上的TCP端口443服务器)。
还有这个链接,但我在测试时得到了很多误报和漏报:http://www.exploresecurity.com/testing-for-poodle_tls-manually/ 因此,我现在正在尝试修改OpenSSL 1.0.2d的TLS实现,以便能够发送无效数据包(使用openssl s_client ...),并观察服务器的行为。
即使我不太熟悉C语言,我也能在OpenSSL中找到一个有趣的代码实现AES-CBC-SHA的填充(根据RFC 2246),位于crypto/evp/e_aes_cbc_hmac_sha1.c的第518行:
/* pad the payload|hmac */
plen += SHA_DIGEST_LENGTH;
for (l = len - plen - 1; plen < len; plen++)
  out[plen] = l;

我将其修改为以下内容,以更改第一个填充字节,使其不符合RFC规范:
/* pad the payload|hmac */
plen += SHA_DIGEST_LENGTH;
for (l = len - plen - 1; plen < len; plen++) {
  if (plen == len - l - 1)
    out[plen] = (l + 1) % 256;
  else
    out[plen] = l;
}

然后进行编译和测试:
./config
make
./apps/openssl s_client -connect www.google.com:443 -servername www.google.com -tls1 -cipher AES128-SHA

我能够连接并发起HTTP请求,并得到响应……

所以我的问题是:我修改的是正确的文件吗?还是其他什么原因呢?

非常感谢您的帮助。

1个回答

2
我遇到了同样的问题,这里有答案:链接。基本上,你需要修改ssl3_enc函数(在s3_enc.c文件中),并替换掉原来的代码。
memset(&rec->input[rec->length], 0, i);

使用

for(size_t j = 0; j < i; ++j) {
    rec->input[rec->length + j] = rand() % 256;
}

此外,当块对齐并且没有填充时,增加填充大小是最好的选择。只需添加以下内容即可:

i += bs;

在这些行之前
/* we need to add 'i-1' padding bytes */
l += i;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接