漏洞信息 2021年9月,Citrix官网爆出了Citrix ShareFile Storage Zones Controller未授权RCE漏洞CVE-2021-22941: 影响版本:v5.11.20之前版本。从小伙伴那里要来了安装文件,然后就有了下面这篇分析文章。 漏洞点分析 从漏洞通告的描述来看,问题应该出在`brettle.web.neatupload.dll`上: 反编译该dll进行分析。由于`brettle.web.neatupload.dll`核心功能是文件上传,首先将审计精力放在写文件相关代码中。 经过分析,注意到一个写文件操作的函数,位于`Brettle.Web.NeatUpload.UploadContext.WritePersistFile`: 通过FileStream实现了一个写操作。写入的文件名称主要由固定路径`str`加上`this.PostBackID`组合实现,写入的内容也包含了`this.PostBackID`。如果能够控制`this.PostBackID`,可能就可以实现路径穿越。 寻找`Brettle.Web.NeatUpload.UploadContext.WritePersistFile`的调用链条: 通过多层调用后,最终找到了`Brettle.Web.NeatUpload.UploadHttpModule.Init(HttpApplication)`,`UploadHttpModule`继承于`System.Web.IHttpModule`接口,该接口主要用于创建或注册自定义HTTP模块。在web.config中寻找`Brettle.Web.NeatUpload.UploadHttpModule`的配置信息: `Brettle.Web.NeatUpload.UploadHttpModule.Application_BeginRequest`函数: 这里限制了请求URL必须为`upload.aspx`,所以可以初步构造一个请求数据包: 顺利进入断点。 参数传递分析 回到调用链上来,要想进入`Brettle.Web.NeatUpload.UploadContext.WritePersistFile`函数,首先定位分析调用链中的关键点:`Brettle.Web.NeatUpload.FilteringWorkerRequest.ParseOrThrow`函数: 这里对请求的GET参数进行了判断,可以看出来有这么几个参数:
同时注意到第435行,这里需要取出`fieldNameTranslator.PostBackID`,如果为null将无法继续往下走。`Brettle.Web.NeatUpload.FieldNameTranslator`在构造函数中完成对`PostBackID`的赋值,调试一下: 可见,要想给`PostBackID`赋值,请求参数中应该包含`id`或者`uploadid`。加上id后就可以赋值了,然后进入了`Brettle.Web.NeatUpload.UploadContext.WritePersistFile`,FileStream断点命中: 但是此时`Brettle.Web.NeatUpload.UploadContext中的PostBackID`并没有完成赋值。定位赋值的地方: 发现赋值过程和前面分析的调用链一样,都位于`Brettle.Web.NeatUpload.ParseOrThrow`中: 想要进入赋值操作,这里有2个前提:
0x01 CopyUntilBoundary 先看`CopyUntilBoundary`函数: 如果想返回True,函数`FindBoundary`就必须返回True,进入`FindBoundary`: 第129行进行了if判断,主要用于判断缓冲区大小是否已经读取超过了边界,而默认定义的缓冲区大小为4096: 替换payload,让其大小超过4096: 可以顺利进入while循环。 0x02 FileFieldNameToControlID 现在解决第二个问题,定位`FileFieldNameToControlID`: 所以需要将上传文件name设置为`NeatUpload_`开头即可。 漏洞复现 重新构造请求,并尝试穿越: 成功实现文件写入。 漏洞利用 虽然实现了文件名称、路径、内容的可控,但是从上面分析可以知道,由于`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`框架: 可以充分利用Razor标记语法绕过非法字符,构造特殊内容上传并实现RCE:
最终效果: 修复方式 `Brettle.Web.NeatUpload.FieldNameTranslator`构造函数增加了`IsUploadIdValid`验证: 将`FieldNameTranslator.PostBackID`的值限制为数字字母或下划线,导致无法进行路径穿越。 由于传播、利用此文档提供的信息而造成任何直接或间接的后果及损害,均由使用本人负责,且听安全团队及文章作者不为此承担任何责任。 |
|