打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
【经典回顾系列】CVE-2021-22941 Citrix ShareFile 从路径穿越到RCE完...


漏洞信息

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参数进行了判断,可以看出来有这么几个参数:

  • uploadtool

  • bp

  • accountid

同时注意到第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个前提:

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

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

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:

Razor标记语法

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

最终效果:



修复方式

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

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

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

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
asp.net neatUpload使用方法
记某cms的漏洞挖掘之旅
【网络安全学习】什么是RCE漏洞?其危害是什么?
WI登录桌面不弹出citrix toolbar
citrix如何重定向桌面中“我的文档”路径和不显示“我的文档”
Redis未授权访问漏洞利用方式
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服