c - 如何通过 TLS 测试 POODLE?

标签 c security ssl openssl cryptography

我希望能够通过 TLS 测试 POODLE 漏洞。

已经有几种方法可以做到这一点,例如 Qualys SSLLabs,但它限制太多(互联网上只有服务器的 TCP 端口 443 可用)。 还有这个链接,但我在测试时得到了很多误报/否定:http://www.exploresecurity.com/testing-for-poodle_tls-manually/

所以现在我正在尝试修改 OpenSSL 1.0.2d 的 TLS 实现,以便能够发送无效数据包(使用 openssl s_client ...)并查看服务器的行为。

即使我不太熟悉 C,我也可以在 crypto/evp/e_aes_cbc_hmac_sha1.c 的 OpenSSL 中找到实现 AES-CBC-SHA 填充的有趣代码(根据 RFC 2246)第 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 请求...

所以我的问题是:这不是我修改的好文件还是其他东西?

非常感谢您的帮助。

最佳答案

我有同样的问题,回答here .基本上,您需要修改 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;
}

而且对于 block 对齐良好且没有填充的情况,最好增加填充大小。为此,只需添加:

i += bs;

就在这些行之前

/* we need to add 'i-1' padding bytes */
l += i;

关于c - 如何通过 TLS 测试 POODLE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31721567/

相关文章:

c - 为什么数组类型对象不可修改?

c - xcode 中的程序参数

c# - 用户登录逻辑属于哪里?三层应用

macos - 从 Firefox 11、Mac OSX 上传文件时出现 400 错误请求

caching - 从 JavaScript 清除 SSL 客户端证书状态

c++ - 我可以对不同的网址使用相同的 curl 句柄吗? (试图从一个网址的多个页面下载数据)

c - 如何在终端上显示 Xcode 输出?

尝试使用 libtomcrypt 库(rsa 公钥生成)时,Contiki mote 类型创建错误

java - 仅在使用 Java 的 Tomcat 8+ 上启用记录 SSL 握手失败(审计目的日志)

ruby-on-rails - Rails PDF 上传恶意内容漏洞