漏洞信息
Commvault是全球知名的数据备份与恢复解决方案。它包含多个组件,混合利用了.NET和Java技术框架。
最近ZDI爆出了Commvault存在多个漏洞。
由于官网试用版本不好下载,在网上搜索很久,皇天不负有心人,最终还真找到一个研究环境(有需要环境的小伙伴可以点关注)。下面给小伙伴们分享下CVE-2021-34993。
结构分析
Commvault整个体系比较庞大,启动后开启了多个服务:
其中80端口对应Tomcat的Java服务,81端口对应IIS的.NET服务。这里我们重点先关注一下81端口:
IIS也启动了多个组件服务,定位`SearchSvc`服务,对应路径为`C:\Program Files\Commvault\ContentStore\CVSearchService`:
分析`web.config`,找到一个Module对象`CVAuthHttpModule`:
定位相关类`CVInfoMgmtService.CVAuthHttpModule`,位于`CVInfoMgmtService.dll`之中:
以`CVSearchService.svc`为例,查看访问接口:
以`downLoadFile`为例:
提示需要认证,定位`CVAuthHttpModule#OnEnter`函数:
函数`denyAccess`对认证信息进行检测,返回401。
认证绕过
从上面分析可知,要想绕过认证,需要`this.reject`为`false`,回到`CVAuthHttpModule#OnEnter`函数:
第13行通过`CVAuthHttpModule.readHeader`从HTTP头中取出`array`数组,并将第一个元素赋值给`text`变量,先跟进`readHeader`:
可见第一个元素来源于cookie,回到`OnEnter`函数:
我们访问的URL是`CVSearchService.svc`,所以`IsRestWebService`返回`false`,重点关注`canByPassCheck`函数:
这里只是将cookie进行base64编码,然后与硬编码的列表元素进行匹配:
static NonSecureOperations(){ NonSecureOperations.list.Add("TG9naW4uR2V0TG9nb25MaXN0"); NonSecureOperations.list.Add("TG9naW4uTG9naW4="); NonSecureOperations.list.Add("Q0kuR2V0RE1TZXR0aW5n"); NonSecureOperations.list.Add("TG9naW4="); NonSecureOperations.list.Add("Q0kuR2V0RE1TZXR0aW5ncw=="); NonSecureOperations.list.Add("UmV0cmlldmVJdGVt"); NonSecureOperations.list.Add("U2VhcmNoLkdldFBhbmVsQ29sdW1uQ29uZmln"); NonSecureOperations.list.Add("RGF0YVNlcnZpY2UuUG9wdWxhdGVEYXRh"); NonSecureOperations.list.Add("Z2V0T2VtSWQ="); NonSecureOperations.list.Add("TG9naW4uV2ViQ2xpZW50TG9naW4="); NonSecureOperations.list.Add("Z2V0R2xvYmFsUGFyYW0=");}
上述元素base64解码后如下:
Login.GetLogonListLogin.LoginCI.GetDMSettingLoginCI.GetDMSettingsRetrieveItemSearch.GetPanelColumnConfigDataService.PopulateDatagetOemIdLogin.WebClientLogingetGlobalParam
因此可以很容易构造数据包,使得`this.reject`的值为`false`,从而实现认证绕过:
文件下载
定位`CVSearchSvc`类中的`downLoadFile`函数:
参数`path`完全可控,可以实现任意文件下载,结合上面分析的认证绕过机制,构建匿名文件下载链:
将数据进行base64解码即可得到文件内容。