欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

CVE-2020-0787:未公开RPC函数中的提权漏洞分析

来源:本站整理 作者:佚名 时间:2020-03-13 TAG: 我要投稿

本文介绍了我在Background Intelligent Transfer Service(BITS,后台智能传输服务)中发现的一个任意文件移动漏洞,这是Windows 10中的一个特权文件操作滥用问题。这个bug创新点不多,但本身比较有趣,隐藏在未公开函数中。因此这里我将与大家分享发现该漏洞的过程,介绍挖掘逻辑缺陷中使用的逆向分析过程。

 
0x01 背景介绍
如果大家对Windows的这个功能不大了解,可以参考微软官方文档中的描述(链接):
程序员及系统管理人员可以使用BITS来下载文件,或者将文件上传至HTTP Web服务器及SMB文件共享。BITS在传输过程中会权衡传输成本以及网络使用情况,尽可能少影响用户前台工作。即使主机重启,BITS也可以处理网络中断、暂停并自动恢复传输。
该服务提供了多个COM对象,包括多个不同的“Control Class”(控制类)以及一个“Legacy Control Class”(旧版控制类),后者可以用来获取指向旧版IBackgroundCopyGroup接口的指针,该接口包含2个未公开的方法:QueryNewJobInterface()及SetNotificationPointer()。
如果用户调用IBackgroundCopyGroup接口(即旧版接口)的CreateJob()方法,就能得到指向旧版IBackgroundCopyJob1接口的一个指针。如果用户调用同一个接口的QueryNewJobInterface()方法,就能得到指向新IBackgroundCopyJob接口的一个指针。
这里的问题在于,目标服务在处理该调用时,并没有采用模拟(impersonation)方式。这意味着用户得到的IBackgroundCopyJob接口的指针位于NT AUTHORITY\SYSTEM上下文中。目标服务在其他方法中实现了模拟,因此这个问题的影响程度有限,但仍然会造成一些后果。
当创建传输任务、文件被添加到队列中时,服务也会创建一个临时文件。当服务完成文件写入操作后,就会调用MoveFileEx()将该文件重命名为用户指定的文件名。这里的问题在于,当使用QueryNewJobInterface()返回接口指针时,最后执行的操作并没有采用模拟机制。
因此普通用户可以利用这一点,通过挂载点(mountpoint)、机会锁(oploick)及符号链接将任意文件移动到受限区域。
 
0x02 BITS COM类工作原理
BITS提供了多个COM对象,我们可以使用OleViewDotNet来查看这些类(再次感谢James Forshaw小伙伴)。

这里我们主要关注的是Background Intelligent Transfer(BIT)Control Class 1.0、Legacy BIT Control Class及相关的主接口,分别为IBackgroundCopyManager及IBackgroundCopyMgr。

“新版” BIT Control Class
BIT Control Class 1.0的工作过程如下:
1、我们首先必须使用CoCreateInstance()请求创建BIT Control Class(CLSID:4991D34B-80A1-4291-83B6-3328366B9097)的一个实例,请求指向IBackgroundCopyManager接口的一个指针。
2、调用IBackgroundCopyManager::CreateJob()创建一个“任务”,获取指向IBackgroundCopyJob接口的一个指针。
3、调用IBackgroundCopyJob::AddFile()将文件加入任务中。该调用需要两个参数:URL及本地文件路径。URL可以为UNC路径。
4、由于任务创建时处于SUSPENDED状态,因此我们必须调用IBackgroundCopyJob::Resume(),当任务状态变成TRANSFERRED时,我们需要调用IBackgroundCopyJob::Complete()。
CoCreateInstance(CLSID_4991D34B-80A1-4291-83B6-3328366B9097)       -> IBackgroundCopyManager*
|__ IBackgroundCopyManager::CreateJob()                            -> IBackgroundCopyJob*
    |__ IBackgroundCopyJob::AddFile(URL, LOCAL_FILE)
    |__ IBackgroundCopyJob::Resume()
    |__ IBackgroundCopyJob::Complete()
虽然BITS运行在NT AUTHORITY\SYSTEM上下文中,这些操作都会模拟RPC客户端来完成,因此这里我们无法实现权限提升。
Legacy Control Class
Legacy Control Class的工作过程有点不同,多了一个步骤。
1、我们必须使用CoCreateInstance()创建Legacy BIT Control Class(CLSID:69AD4AEE-51BE-439B-A92C-86AE490E8B30)的一个实例,请求指向IBackgroundCopyQMgr接口的一个指针。
2、调用IBackgroundCopyQMgr::CreateGroup()创建一个“组”,获取指向IBackgroundCopyGroup接口的一个指针。
3、调用IBackgroundCopyGroup::CreateJob(),创建一个“任务”,获取指向IBackgroundCopyJob1接口的一个指针。
4、调用IBackgroundCopyJob1::AddFiles(),将文件添加到“任务”中,该函数的参数为一个FILESETINFO结构。
5、由于任务创建时处于SUSPENDED状态,我们需要调用IBackgroundCopyJob1::Resume(),当任务状态变为TRANSFERRED,我们需要调用IBackgroundCopyJob1::Complete()。
CoCreateInstance(CLSID_69AD4AEE-51BE-439B-A92C-86AE490E8B30)       -> IBackgroundCopyQMgr*
|__ IBackgroundCopyQMgr::CreateGroup()                             -> IBackgroundCopyGroup*

[1] [2] [3] [4]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载