-
A checker (site and tool) for CVE-2014-0160: https://github.com/FiloSottile/Heartbleed
-
ssltest.py: Quick and dirty demonstration of CVE-2014-0160 by Jared Stafford http://pastebin.com/WmxzjkXJ
-
SSL Server/Clien Test https://www.ssllabs.com/ssltest/index.html
-
Metasploit Module: https://github.com/rapid7/metasploit-framework/pull/3206/files
-
Nmap NSE script: Detects whether a server is vulnerable to the OpenSSL Heartbleed: https://svn.nmap.org/nmap/scripts/ssl-heartbleed.nse
-
Nmap NSE script: Quick'n'Dirty OpenVAS nasl wrapper for ssl_heartbleed based on ssl_cert_expiry.nas https://gist.github.com/RealRancor/10140249
-
Heartbleeder: Tests your servers for OpenSSL: https://github.com/titanous/heartbleeder?files=1
-
Heartbleed Attack POC and Mass Scanner: https://bitbucket.org/fb1h2s/cve-2014-0160 (Good website,similar github)
-
Heartbleed Honeypot Script: http://packetstormsecurity.com/files/126068/hb_honeypot.pl.txt
-
HTTPS/SMTP/SSH/SFTP/POP3/IMAP/VPN Online Check :http://www.vulnhunt.com/sslscan/
-
Firefox addons :https://addons.mozilla.org/en-US/firefox/addon/heartbleed-checker/
-
Chrome addons:https://chrome.google.com/webstore/detail/eeoekjnjgppnaegdjbcafdggilajhpic
- SSL测试网站::https://testssl.sh/
-
HeartBleed Test(Need FQ):https://filippo.io/Heartbleed/
-
360、jiasule等各大厂商也有相关,不多弄了,没价值。
-
乌云关于此漏洞的分析报告:http://drops.wooyun.org/papers/1381
-
freebuff上也有类似报告,FT的一份报告也比较形象。
2014/5/1更新
转自:http://hi.baidu.com/bluerust/item/cea3c4015493588c02ce1bf4
漏洞成因比较简单,直接看[参6]就行了, 这里就不赘述了。
☆ 1. 环境搭建
a. 受影响版本下载:
https://www.openssl.org/source/openssl-1.0.1f.tar.gz
b. 为了方便测试,可以patch一下t1_lib.c
;------------------------------------------------------------------
--- t1_lib.cMon Jan 06 21:47:42 2014
+++ t1_lib_m.cWed Apr 30 15:21:20 2014
@@ -2583,13 +2583,15 @@
/* Enter response type, length and copy payload */
*bp++ = TLS1_HB_RESPONSE;
s2n(payload, bp);
-memcpy(bp, pl, payload);
+memset(bp, 'B', payload);
+if ( (unsigned short)payload > 2 ) memset(bp+1, 'A', payload-2);
bp += payload;
/* Random padding */
-RAND_pseudo_bytes(bp, padding);
-
+RAND_pseudo_bytes(bp, padding);
+fprintf( stderr, "[DEBUG] leak addr: %p, payload: %8.8x\n", pl, payload );
r = ssl3_write_bytes(s, TLS1_RT_HEARTBEAT, buffer, 3 + payload + padding);
-
+fprintf( stderr, "[DEBUG] payload sent, return: %8.8x\n", r );
+
if (r >= 0 && s->msg_callback)
s->msg_callback(1, s->version, TLS1_RT_HEARTBEAT,
buffer, 3 + payload + padding,
;------------------------------------------------------------------
c. 生成证书
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout server.key -out server.crt
d. 启动服务器
openssl s_server -debug -accept 443 -cert server.crt -certform PEM -key server.key -ssl3
因为SSL v3, TLS v1.0, TLS v1.1, TLS v1.2都受影响,所以在测试时应当把ssl3/tls1/tls1_1/tls1_2
都试一次。
☆ 2. 测试工具
直接使用如下命令行可以查看目标是否支持HeartBeat扩展[参9]:
openssl s_client -connect domain.com:443 -tlsextdebug 2>&1 | grep 'server extension "heartbeat" (id=15)' || echo safe
Metaploit已有相应模块[参1],算是支持全了的。nmap的ssl-heartbleed.nse模块至今
没支持SSL v3, 简单patch一下就可以了:
;---------------------------------------------------------------------------
--- ssl-heartbleed.nseThu Apr 17 22:49:28 2014
+++ ssl-heartbleed_m.nseWed Apr 30 15:32:40 2014
@@ -43,7 +43,7 @@
-local arg_protocols = stdnse.get_script_args(SCRIPT_NAME .. ".protocols") or {'TLSv1.0', 'TLSv1.1', 'TLSv1.2'}
+local arg_protocols = stdnse.get_script_args(SCRIPT_NAME .. ".protocols") or { 'SSLv3', 'TLSv1.0', 'TLSv1.1', 'TLSv1.2'}
;---------------------------------------------------------------------------
很多厂商在实现扫描的时候都漏了 SSL v3, 这其中包括nessus[参2]和我们的。而还有
个别厂商在线扫描至今只支持TLS v1.1。
另外推荐两个比较方便的小工具,一个是 Hacker Fantastic 的 HeartBleed.c[参3],
我作了一点修改,使其支持SSL v3, 挪到windows上,有需要的可以到 https://github.com/bluerust/HeartBleed
下载。另外一个不错的小工具是https://github.com/robertdavidgraham/heartleech。
HeartBleed.c 我是细看了的,见着的bug都随手修正了, heartleech我没怎么看。
☆ 3. 非破坏性扫描
扫描应该尽量不影响目标业务正常运作,所以payload应该尽量小,避免触及不可读内
存而导致目标崩溃。很多扫描器使用的payload长度都是0x4000, 能不能更小? 答案是
可以的。这事儿还得分情况讨论:
1. 如果完成SSL Handshake之后发送HeartBleed, payload可以小到1。
2. 如果没完成SSL Handshake就发送HeartBleed, 想要及时得到回应,payload最小值
应该是0xFE9,计算方法见下面代码注释。这种扫描方法的缺点是开销大,慢。
存在这个区别是因为一般情况下 SSL 握手完成之前(SSL *)s->wbio->method 是
methods_buffer, methods_buffer.bwrite 是 buffer_write:
static int buffer_write(BIO *b, const char *in, int inl)
{
int i,num=0;
BIO_F_BUFFER_CTX *ctx;
if ((in == NULL) || (inl <= 0)) return(0);
ctx=(BIO_F_BUFFER_CTX *)b->ptr;
if ((ctx == NULL) || (b->next_bio == NULL)) return(0);
BIO_clear_retry_flags(b);
start:
i=ctx->obuf_size-(ctx->obuf_len+ctx->obuf_off);
/* add to buffer and return
*
* 如果缓冲区未满,则暂缓发送, 一般情况下,ctx->obuf 大小为0x1000 bytes,
* 也即意味着要想让服务器及时回发数据,应该要保证
* payload > 0x1000 - 1 - 2 - 16 - 5, 最后这个5是SSL Record头的长度。
*/
if (i >= inl)
{
memcpy(&(ctx->obuf[ctx->obuf_off+ctx->obuf_len]),in,inl);
ctx->obuf_len+=inl;
return(num+inl);
}
/* else */
/* stuff already in buffer, so add to it first, then flush */
if (ctx->obuf_len != 0)
{
if (i > 0) /* lets fill it up if we can */
{
memcpy(&(ctx->obuf[ctx->obuf_off+ctx->obuf_len]),in,i);
in+=i;
inl-=i;
num+=i;
ctx->obuf_len+=i;
}
/* we now have a full buffer needing flushing */
for (;;)
{
/* 调用下层io方法发送数据 */
i=BIO_write(b->next_bio,&(ctx->obuf[ctx->obuf_off]),
ctx->obuf_len);
...
而SSL 握手完成后,(SSL *)s->wbio->method 是 methods_sockp, methods_sockp.bwrite
是 sock_write, 这个函数是直接把数据交给下层Socket。
☆ 4. 参考资料
[1] openssl_heartbleed.rb
https://github.com/rapid7/metasploit-framework/blob/master/modules/auxiliary/scanner/ssl/openssl_heartbleed.rb
[2] Heartbleed profile not working correct?
https://discussions.nessus.org/thread/7287
[3] CVE-2014-0160 heartbleed OpenSSL information leak exploit
https://github.com/HackerFantastic/Public/blob/master/exploits/heartbleed.c
[4] Test your server for HeartBleed ( CVE-2014-0160 )
https://filippo.io/Heartbleed/
[5] Demonstrates the "heartbleed" problem using full OpenSSL stack
https://github.com/robertdavidgraham/heartleech
[6] patch
http://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff;h=96db902
[7] OpenSSL Security Advisory [07 Apr 2014]
https://www.openssl.org/news/secadv_20140407.txt
[8] Transport Layer Security (TLS) and Datagram Transport Layer Security (DTLS) Heartbeat Extension
https://tools.ietf.org/rfc/rfc6520.txt
[9] Is there a way, to manually check for openssl CVE-2014-0160 vulnerability?
http://serverfault.com/questions/587839/is-there-a-way-to-manually-check-for-openssl-cve-2014-0160-vulnerability