黑客24小时在线接单网站

黑客在线接单,网站入侵,渗透测试,渗透网站,入侵网站

深入分析在ISC BIND服务器中潜藏了15年的RCE漏洞

202010月,我们收到了一份目标ISC BIND服务器匿名安全报告。本报告中发现的安全问题实际上是基于之前曝光的漏洞CVE-2006-5989,该漏洞影响Apache模块mod_auth_kerb,匿名研究人员最初发现了它。ISC BIND服务器SPNEGO(the Simple and Protected GSSAPI Negotiation Mechani *** ,SPNEGO)包含漏洞的代码在组件 *** 享,但ISC当时没有合并相应的安全补丁。15年后,ISC对BIND修复漏洞,并分配相应的漏洞编号,即CVE-2020-8625。

对于BIND服务器,从9.11到9.16所有版本都受到漏洞的影响。此外,攻击者可以在没有身份验证的情况下远程触发漏洞,导致4字节溢出。本安全报告的内容符合要求Targeting Incentive Program但缺乏获得全额奖金所需的完整性exploit。不过,这仍然不失为一个优秀的安全报告,而且这个漏洞也值得我们深入进行研究。

漏洞分析

漏洞的原因位于lib/dns/spnego.c中的函数der_get_oid()有堆溢漏洞。

  • staticint
  • der_get_oid(constunsignedchar*p,size_tlen,oid*data,size_t*size){
  • //...
  • data->components=malloc(len*sizeof(*data->components));//components==NULL){
  • return(ENOMEM);
  • }
  • data->components[0]=(*p)/40;//components[1]=(*p)@;
  • --len;//0U; n){
  • unsignedu=0;
  • do{
  • --len;
  • uu=u*128 (*p 8);
  • }while(len>0U&&p[-1]&0x80);
  • data->components[n]=u;//<--(4)
  • }
  • //...
  • }
  • 该函数在(1)处分配数组缓冲区。len用于跟踪缓冲区剩余元素的数量。同时,代码在(2)处填充前两个元素,但只在(3)处填充len减去1。因此,循环(4)可以使缓冲区溢出一个元素。data->components的类型是int,因此,这将导致4字节的溢出。

    触发机制

    因为漏洞存在SPNEGO因此,组件在组件中BIND中对TKEY-GSSAPI配置相应。

  • #cat/etc/bind/named.conf.options
  • options{
  • directory"/var/cache/bind";
  • tkey-gssapi-keytab"/etc/bind/dns.keytab";
  • };
  • #cat/etc/bind/named.conf.local
  • zone"example.nil."IN{
  • typemaster;
  • file"/etc/bind/example.nil.db";
  • };
  • 其中,dns.keytab文件位于bin/tests/system/tsiggss/ns1/中,而example.nil.db文件是脚本bin/tests/system/tsiggss/setup.sh生成的。

    现在,相应的测试环境已经准备好了。当收到手动请求时,会触发漏洞,并产生以下调用栈:

  • #0der_get_oidatspnego.c:841
  • #1decode_oidatspnego.c:1054
  • #2decode_MechTypeatspnego_asn1.c:213
  • #3decode_MechTypeListatspnego_asn1.c:290
  • #4decode_NegTokenInitatspnego_asn1.c:523
  • #5gss_accept_sec_context_spnegoatspnego.c:591
  • #6dst_gssapi_acceptctxatgssapictx.c:729
  • #7process_gsstkeyattkey.c:551
  • #8dns_tkey_processqueryattkey.c:882
  • #9ns_query_startatquery.c:11315
  • #10ns__client_requestatclient.c:2161
  • #11proces *** ufferattcpdns.c:227
  • #12dnslisten_readcbattcpdns.c:294
  • #13read_cbattcp.c:814
  • ...
  • 漏洞利用

    这个漏洞的可用性高度依赖于glibc以下解释是基于版本Ubuntu18.04和glibc2.27后者支持tcache。

    首先要确定溢出漏洞能控制的内容:

                     
    • 在der_get_oid()分布在易受攻击缓冲区的大小和内容是可控的。顺便说一句,当前请求完成后,缓冲区将被释放。
    •                
    • decode_MechTypeList()中有一个while用于重复执行的循环der_get_oid()函数,循环次数也可控。

    有了这两点,我们就可以轻松操作堆了。为了准备堆,我们可以耗尽任何大小的堆tcache bins,并在要求完成后重新填写。同时,重新填充的块(chunk)内存可以是连续的。这使得内存布局相当有利于通过缓冲区溢出发动攻击。

    实现任意写原语

    在这个阶段,通过滥用tcache空闲列表可以很容易地写原语。

    触发一个4字节的溢出来扩展下一个空闲chunk大小。

    在下一个请求中,受损chunk内存空间空间。当请求结束时,它将被移动到新的tcache bin中。

    用新的大小再次分配损坏的chunk。此时,损坏chunk下一个空闲的chunk重叠,然后用任何值覆盖它freelist。

    从“中毒的”tcache freelist内存空间的上部分配。它将返回任何地址。

    泄漏内存地址

    默认情况下,会为BIND启用所有Linux缓解措施。因此,我们必须首先处理它。ASLR,这意味着我们需要找到一种从内存中泄露地址的 *** 。实现内存泄漏的可能性是使用它code_NegTokenArg()函数。该函数用于将响应信息编码到缓冲区并发送给客户端。

  • staticOM_uint32
  • code_NegTokenArg(OM_uint32*minor_status,constNegTokenResp*resp,
  • unsignedchar**outbuf,size_t*outbuf_size){
  • //...
  • buf_size=1024;
  • buf=malloc(buf_size);//<--(5)
  • //...
  • do{
  • ret=encode_NegTokenResp(buf buf_size-1,buf_size,resp,
  • &buf_len);
  • //...
  • }while(ret==ASN1_OVERFLOW);
  • *outbuf=malloc(buf_len);//<--(6)
  • if(*outbuf==NULL){
  • *minor_status=ENOMEM;
  • free(buf);
  • return(GSS_S_FAILURE);
  • }
  • memmove(*outbuf,buf buf_size-buf_len,buf_len);
  • *outbuf_size=buf_len;
  • free(buf);//<--(7)
  • return(GSS_S_COMPLETE);
  • }
  • 位于(5)处buf它的初始大小是1024字节,正好在临时缓冲区tcache处理范围内。outbuf是将被发送到客户端的缓冲区,其大小也在tcache在这两个缓冲区的大小范围内。tcache dup攻击,在(5)和(6)处两次malloc()调用将返回相同的地址。执行(7)free()函数后,一个tcache->next该指针将被更新buf然而,此时它已经和解了outbuf重叠在一起。这意味着堆指针会泄露给客户端。

    理想情况下,位于(6)处buf_len应选择足够大的,以避免干扰较小tcache bins。不幸的是,更大值似乎只有96个字节。由于这个问题,这个过程根本无法生存,在客户端获得泄漏的堆指针后不久就会崩溃。因此,我们需要进行更深入的研究,以找到一种充分利用漏洞的 *** 。

    漏洞的修复

    在BIND 9.16.12和BIND 9.11.28这个漏洞已经修复了。BIND 9.16,ISC完全放弃了SPNEGO的使用。在BIND 9.11补丁程序是针对原始问题的。

    小结

    这个安全漏洞表明,即使软件是开源的,并被广泛使用,漏洞也会存在多年,难以发现。软件维护人员需要密切监控他们使用的所有外部模块,以确保最新的安全补丁的应用。这个漏洞也表明,这是一个非常棘手的挑战。ISC BIND是Internet上更流行的DNS服务器,因此,该漏洞的影响范围相当大,特别是该漏洞可以远程触发,无需身份验证。我们建议您尽快更新相应的DNS服务器。

    本文翻译自:https://www.thezdi.com/blog/2021/2/24/cve-2020-8625-a-fifteen-year-old-rce-bug-returns-in-isc-bind-server

       
    • 评论列表:
    •  性许睬姥
       发布于 2022-06-01 03:50:31  回复该评论
    • uf_len);//<--(6)if(*outbuf==NULL){*minor_status=ENOMEM;free(buf);return(GSS_S_FAILURE);}memmove(*outbu
    •  孤央橘亓
       发布于 2022-06-01 00:54:14  回复该评论
    • 0]=(*p)/40;//components[1]=(*p)@;--len;//0U; n){unsignedu=0;do{--len;uu=u*128 (*p 8);}while(len>0U&&p
    •  鸽吻西奺
       发布于 2022-05-31 21:42:12  回复该评论
    • /setup.sh生成的。现在,相应的测试环境已经准备好了。当收到手动请求时,会触发漏洞,并产生以下调用栈:#0der_get_oidatspnego.c:841#1decode_oidatspnego.c:1054#2decode_MechTypeatspnego
    •  听弧夙世
       发布于 2022-05-31 16:36:17  回复该评论
    • 了这两点,我们就可以轻松操作堆了。为了准备堆,我们可以耗尽任何大小的堆tcache bins,并在要求完成后重新填写。同时,重新填充的块(chunk)内存可以是连续的。这使得内存布局相当有利于通过缓冲区溢出发动攻击。实现任意写原语

    发表评论:

    Powered By

    Copyright Your WebSite.Some Rights Reserved.