【经典回顾系列】CVE-2021-22941 Citrix ShareFile 从路径穿越到RCE完整利用链分析

渗透技巧 2年前 (2022) admin
797 0 0
关注公众号回复“漏洞”获取研究环境或工具




漏洞信息


2021年9月,Citrix官网爆出了Citrix ShareFile Storage Zones Controller未授权RCE漏洞CVE-2021-22941:


【经典回顾系列】CVE-2021-22941 Citrix ShareFile 从路径穿越到RCE完整利用链分析


影响版本:v5.11.20之前版本。从小伙伴那里要来了安装文件,然后就有了下面这篇分析文章。




漏洞点分析


从漏洞通告的描述来看,问题应该出在`brettle.web.neatupload.dll`上:


【经典回顾系列】CVE-2021-22941 Citrix ShareFile 从路径穿越到RCE完整利用链分析


反编译该dll进行分析。由于`brettle.web.neatupload.dll`核心功能是文件上传,首先将审计精力放在写文件相关代码中。


经过分析,注意到一个写文件操作的函数,位于`Brettle.Web.NeatUpload.UploadContext.WritePersistFile`:


【经典回顾系列】CVE-2021-22941 Citrix ShareFile 从路径穿越到RCE完整利用链分析


通过FileStream实现了一个写操作。写入的文件名称主要由固定路径`str`加上`this.PostBackID`组合实现,写入的内容也包含了`this.PostBackID`。如果能够控制`this.PostBackID`,可能就可以实现路径穿越。


寻找`Brettle.Web.NeatUpload.UploadContext.WritePersistFile`的调用链条:


【经典回顾系列】CVE-2021-22941 Citrix ShareFile 从路径穿越到RCE完整利用链分析


通过多层调用后,最终找到了`Brettle.Web.NeatUpload.UploadHttpModule.Init(HttpApplication)`,`UploadHttpModule`继承于`System.Web.IHttpModule`接口,该接口主要用于创建或注册自定义HTTP模块。在web.config中寻找`Brettle.Web.NeatUpload.UploadHttpModule`的配置信息:


【经典回顾系列】CVE-2021-22941 Citrix ShareFile 从路径穿越到RCE完整利用链分析


`Brettle.Web.NeatUpload.UploadHttpModule.Application_BeginRequest`函数:


【经典回顾系列】CVE-2021-22941 Citrix ShareFile 从路径穿越到RCE完整利用链分析


这里限制了请求URL必须为`upload.aspx`,所以可以初步构造一个请求数据包:


【经典回顾系列】CVE-2021-22941 Citrix ShareFile 从路径穿越到RCE完整利用链分析


【经典回顾系列】CVE-2021-22941 Citrix ShareFile 从路径穿越到RCE完整利用链分析


顺利进入断点。




参数传递分析


回到调用链上来,要想进入`Brettle.Web.NeatUpload.UploadContext.WritePersistFile`函数,首先定位分析调用链中的关键点:`Brettle.Web.NeatUpload.FilteringWorkerRequest.ParseOrThrow`函数:


【经典回顾系列】CVE-2021-22941 Citrix ShareFile 从路径穿越到RCE完整利用链分析


这里对请求的GET参数进行了判断,可以看出来有这么几个参数:


  • uploadtool

  • bp

  • accountid


同时注意到第435行,这里需要取出`fieldNameTranslator.PostBackID`,如果为null将无法继续往下走。`Brettle.Web.NeatUpload.FieldNameTranslator`在构造函数中完成对`PostBackID`的赋值,调试一下:


【经典回顾系列】CVE-2021-22941 Citrix ShareFile 从路径穿越到RCE完整利用链分析


可见,要想给`PostBackID`赋值,请求参数中应该包含`id`或者`uploadid`。加上id后就可以赋值了,然后进入了`Brettle.Web.NeatUpload.UploadContext.WritePersistFile`,FileStream断点命中:


【经典回顾系列】CVE-2021-22941 Citrix ShareFile 从路径穿越到RCE完整利用链分析


但是此时`Brettle.Web.NeatUpload.UploadContext中的PostBackID`并没有完成赋值。定位赋值的地方:


【经典回顾系列】CVE-2021-22941 Citrix ShareFile 从路径穿越到RCE完整利用链分析


发现赋值过程和前面分析的调用链一样,都位于`Brettle.Web.NeatUpload.ParseOrThrow`中:


【经典回顾系列】CVE-2021-22941 Citrix ShareFile 从路径穿越到RCE完整利用链分析


想要进入赋值操作,这里有2个前提:


  • while循环(函数`CopyUntilBoundary`)必须满足True

  • `fieldNameTranslator.FileFieldNameToControlID`函数必须返回True


0x01 CopyUntilBoundary


先看`CopyUntilBoundary`函数:


【经典回顾系列】CVE-2021-22941 Citrix ShareFile 从路径穿越到RCE完整利用链分析


如果想返回True,函数`FindBoundary`就必须返回True,进入`FindBoundary`:


【经典回顾系列】CVE-2021-22941 Citrix ShareFile 从路径穿越到RCE完整利用链分析


第129行进行了if判断,主要用于判断缓冲区大小是否已经读取超过了边界,而默认定义的缓冲区大小为4096:


【经典回顾系列】CVE-2021-22941 Citrix ShareFile 从路径穿越到RCE完整利用链分析


替换payload,让其大小超过4096:


【经典回顾系列】CVE-2021-22941 Citrix ShareFile 从路径穿越到RCE完整利用链分析

可以顺利进入while循环。


0x02 FileFieldNameToControlID


现在解决第二个问题,定位`FileFieldNameToControlID`:


【经典回顾系列】CVE-2021-22941 Citrix ShareFile 从路径穿越到RCE完整利用链分析


所以需要将上传文件name设置为`NeatUpload_`开头即可。




漏洞复现


重新构造请求,并尝试穿越:


【经典回顾系列】CVE-2021-22941 Citrix ShareFile 从路径穿越到RCE完整利用链分析


成功实现文件写入。


【经典回顾系列】CVE-2021-22941 Citrix ShareFile 从路径穿越到RCE完整利用链分析



漏洞利用


虽然实现了文件名称、路径、内容的可控,但是从上面分析可以知道,由于`id`嵌入到了文件路径中,这就意味着特殊字符无法写入,比如:


< (less than)> (greater than): (colon - sometimes works, but is actually NTFS Alternate Data Streams)" (double quote)/ (forward slash) (backslash)| (vertical bar or pipe)? (question mark)* (asterisk)...


所以无法写入服务端可解析的aspx文件(`<`符号等无法使用),系统是基于微软.NET WebForm技术进行构建,支持aspx、ashx等没有问题,同时发现其实也存在`ASP.NET MVC`框架:


【经典回顾系列】CVE-2021-22941 Citrix ShareFile 从路径穿越到RCE完整利用链分析


【经典回顾系列】CVE-2021-22941 Citrix ShareFile 从路径穿越到RCE完整利用链分析


可以充分利用Razor标记语法绕过非法字符,构造特殊内容上传并实现RCE:


Razor标记语法

https://www.runoob.com/aspnet/razor-intro.html


最终效果:


【经典回顾系列】CVE-2021-22941 Citrix ShareFile 从路径穿越到RCE完整利用链分析


【经典回顾系列】CVE-2021-22941 Citrix ShareFile 从路径穿越到RCE完整利用链分析




修复方式


`Brettle.Web.NeatUpload.FieldNameTranslator`构造函数增加了`IsUploadIdValid`验证:


【经典回顾系列】CVE-2021-22941 Citrix ShareFile 从路径穿越到RCE完整利用链分析


【经典回顾系列】CVE-2021-22941 Citrix ShareFile 从路径穿越到RCE完整利用链分析


【经典回顾系列】CVE-2021-22941 Citrix ShareFile 从路径穿越到RCE完整利用链分析


将`FieldNameTranslator.PostBackID`的值限制为数字字母或下划线,导致无法进行路径穿越。



由于传播、利用此文档提供的信息而造成任何直接或间接的后果及损害,均由使用本人负责,且听安全团队及文章作者不为此承担任何责任。



点关注,不迷路!

【经典回顾系列】CVE-2021-22941 Citrix ShareFile 从路径穿越到RCE完整利用链分析

关注公众号回复“漏洞”获取研究环境或工具

原文始发于微信公众号(且听安全):【经典回顾系列】CVE-2021-22941 Citrix ShareFile 从路径穿越到RCE完整利用链分析

版权声明:admin 发表于 2022年1月21日 上午5:19。
转载请注明:【经典回顾系列】CVE-2021-22941 Citrix ShareFile 从路径穿越到RCE完整利用链分析 | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...