我已经寻找这个问题的解决方案好几天了,基本上我正在尝试测试我的网络是否存在 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