Collection of Heartbleed Tools

本文详细介绍了Heartbleed漏洞的成因及测试方法,并提供了多种工具进行漏洞检测,包括环境搭建步骤、测试命令及非破坏性扫描建议。

                                                        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


转载于:https://my.oschina.net/u/1188877/blog/224196

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值