在 CentOS 6.x 上编译 Heartbleed.c 测试器

在 CentOS 6.x 上编译 Heartbleed.c 测试器

我已经寻找这个问题的解决方案好几天了,基本上我正在尝试测试我的网络是否存在 heartbleed 漏洞,但我无法在 CentOS 6.x 上编译测试器,任何想法或建议都将非常感谢...

测试人员链接

http://www.exploit-db.com/download/32998

我收到的错误

[root@www ~]# gcc heartbleed.c -o heartbleed -lssl -lssl3 -lcrypto
/tmp/cc4cZa2B.o: In function `tls_bind':
heartbleed.c:(.text+0x47d): undefined reference to `SSL_CTX_SRP_CTX_init'
collect2: ld returned 1 exit status
[root@www ~]# 

答案1

对于 CentOS,建议将-lss3标志添加到编译行。 支持链接

您还可以尝试将 OpenSSL 静态链接到您的构建中,从与上面相同的链接。替换文件的位置*.a

#!/bin/bash
# Emerge openssl with static-libs to obtain all the *.a
mkdir -p heartbleed.d
cd heartbleed.d
ar x /usr/lib/libssl.a
ar x /usr/lib/libcrypto.a
ar x /usr/lib/libgmp.a
ar x /usr/lib/libz.a
cd ..
gcc -o heartbleed heartbleed.d/*.o heartbleed.c -ldl

如果你使用的是 Debian(为了完整起见,我知道这个问题与 CentOS 6.x 有关),那么你会遇到这个问题。然后此链接可能会帮助您解决问题,它提供了以下解决方案:

$ gcc heartbleed.c -o heartbleed -Wl,-Bstatic -lssl -Wl,-Bdynamic -lssl3 -lcrypto
$ uname -a
Linux xxxxx Debian 3.2.54-2 x86_64 GNU/Linux
$ ls -al heartbleed
-rwxr-xr-x 1 x x357603 Apr 11 23:20 heartbleed

这个链接有点让人困惑,它提出了 2013 年的确切问题,但只是说他们更新了编译头。所以也许应该再检查一下头文件中的注释?

解决您的问题的另一种方法可能是回答以下问题。您的网络运行的是哪个版本的 OpenSSL?以下是摘录自HeartBleed.com

OpenSSL 的哪些版本受到影响?

不同版本状态:

OpenSSL 1.0.1 到 1.0.1f(含)版本存在漏洞 OpenSSL 1.0.1g 不存在漏洞 OpenSSL 1.0.0 分支不存在漏洞 OpenSSL 0.9.8 分支不存在漏洞

OpenSSL 1.0.1g 版本已修复此问题:OpenSSL 安全公告

受影响的用户应升级至 OpenSSL 1.0.1g。无法立即升级的用户也可以使用 -DOPENSSL_NO_HEARTBEATS 重新编译 OpenSSL。

如果无法升级,您可以使用该标志重新编译旧版本。

答案2

似乎已通过 OpenSSL 库的构建选项停用了遗漏的功能。您可以尝试手动编译 openssl。

另外,你也可以使用 nmap(首先检查您当前的 nmap 版本,您可能已经有 heartbleed 脚本)。

答案3

gcc heartbleed.c -o heartbleed -lssl -lssl3 -lcrypto

看起来不错。-lssl是 OpenSSL 的 SSL/TLS 例程。-lcrypto是 OpenSSL 的加密例程。

但我不太清楚-lssl3。那是什么图书馆?


heartbleed.c:(.text+0x47d): 对“SSL_CTX_SRP_CTX_init”未定义引用

您的 OpenSSL 版本似乎不支持 Thomas Wu 的安全远程密码 (SRP). 或者它被编译了没有支持它。

根据OpenSSL 变更日志,SRP是在OpenSSL 1.0.1中添加的:

  *) Add SRP support.
     [Tom Wu <[email protected]> and Ben Laurie]

您可以使用以下命令验证 OpenSSL 库是否是在没​​有 SRP 的情况下构建的。

首先,找到 OpenSSL SSL/TLS 库:

$ find /usr/ -iname libssl.*
/usr/lib/libssl.0.9.7.dylib
/usr/lib/libssl.0.9.8.dylib
/usr/lib/libssl.dylib
/usr/local/ssl/android-14/lib/libssl.a
/usr/local/ssl/android-14/lib/libssl.so
/usr/local/ssl/android-14/lib/libssl.so.1.0.0
/usr/local/ssl/android-18/lib/libssl.a
/usr/local/ssl/android-18/lib/libssl.so
/usr/local/ssl/android-18/lib/libssl.so.1.0.0
...

其次,查看符号是否被导出:

$ nm /usr/lib/libssl.0.9.7.dylib | grep SSL_CTX_SRP_CTX_init
$

在我的例子中,SRP 不可用,因为 Apple 的默认库是所以低级别(版本 0.9.7)。

我还有另一份抄袭的图书馆副本(版本 1.0.1i):

$ nm /usr/local/ssl/macosx-x64/lib/libssl.dylib | grep SSL_CTX_SRP_CTX_init
0000000000034920 T _SSL_CTX_SRP_CTX_init

我的1.0.1i版本有该例程。


有时你可以构建没有SRP. 检查 OpenSSL 是否已配置没有建议零售价:

$ cat /usr/local/ssl/macosx-x64/include/openssl/opensslconf.h | grep -A 1 SRP
$

在上面的例子中,我针对 SRP 进行了配置。

OpenSSL 配置完成后的样子如下没有一个功能(我配置没有SSLv2:

$ cat /usr//local/ssl/macosx-x64/include/openssl/opensslconf.h | grep -A 1 SSL2
#ifndef OPENSSL_NO_SSL2
# define OPENSSL_NO_SSL2
#endif
--
# if defined(OPENSSL_NO_SSL2) && !defined(NO_SSL2)
#  define NO_SSL2
# endif

SSL_CTX_SRP_CTX_init在两个地方使用。要修复此问题,只需将其注释掉即可。

首先,第 355 行:

 /* SSL_CTX_SRP_CTX_init(c->sslContext); */

第二,第499行:

 /* SSL_CTX_SRP_CTX_init(c->sslContext); */

相关的是,漏洞的作者可能会关注 OpenSSL 的版本号。该库提供OPENSSL_版本号(3)就是为了这种事。比如:

#if (OPENSSL_VERSION_NUMBER >= 0x10001000L) && !defined(OPENSSL_NO_SRP)
    SSL_CTX_SRP_CTX_init(c->sslContext);
#endif

相关内容