ESXi SLP漏洞复现
一、前言 关于SLP几个漏洞的成因与利用,网上已经有彭博士非常精彩且详细的分享(vSphere 攻防技法分享),这里不会做过多的赘述,写这个的意义只是记录一下针对特定低版本ESXi场景下32位SLP的利用心路。网上的一些公开利用,在低版本情况下皆无法成功。 安全研究人员在对某个目标进行研究时,经常会遇到一个场景,研究人员在一个正在开发的功能中发现漏洞,但因此功能未完善,无法进一步利用的遗憾。 笔者遇到的正是类似于此类场景,不过不是正在开发的功能场景,而是一个漏洞的触发路径上存在另一个漏洞,两个漏洞的相互影响下,导致利用无法完成的悲伤。 二、SLP历史漏洞 以下是SLP的历年漏洞 CVE编号 漏洞类型 CVE-2019-5544 堆溢出 CVE-2020-3992 UAF CVE-2021-21974 堆溢出 CVE-2022-31699 堆溢出 三、CVE-2021-21974漏洞利用 笔者最初选择的是CVE-2021-21974。 该漏洞存在于SLP的“目录代理通告”,目录代理 (DA) 是可选的 SLP 代理,用于存储和维护服务代理 (SA) 发送的服务广告的缓存。 在SLPParseSrvUrl函数中,会解析“目录代理通告”中的URL字段,如下面代码所示 /* allocate space for structure + srvurl + longest net family tag */ *parsedurl = (SLPParsedSrvUrl *)xmalloc(sizeof(SLPParsedSrvUrl) + SLP_NF_MAX_SIZE /* long enough for longest net family */ + srvurllen + 1); /* +1 for null-terminator */ if (*parsedurl == 0) return ENOMEM; /* point to family tag buffer, copy url to buffer space */ (*parsedurl)->family = (char *)*parsedurl + sizeof(SLPParsedSrvUrl); slider1 = slider2 = (*parsedurl)->family + SLP_NF_MAX_SIZE; memcpy(slider1, srvurl, srvurllen); /* find end and terminate url copy */ endptr = slider1 + srvurllen; *endptr = 0; /* parse out the service type */ (*parsedurl)->srvtype = slider1; slider2 = strstr(slider1, "://"); if (slider2 == 0) { xfree(*parsedurl); *parsedurl = 0; return EINVAL; /* ill-formatted URL - missing "://" */ } 问题出现在 slider2 = strstr(slider1, "://")...