网站建设、公众号开发、微网站、微商城、小程序就找牛创网络 !

7*24小时服务专线: 152-150-65-006 023-68263070 扫描二维码加我微信 在线QQ

漏洞公告团结互助,让我们共同进步!

当前位置:主页 > 技术资讯 > 网络安全 > 漏洞公告 >

我们的优势: 10年相关行业经验,专业设计师量身定制 设计师一对一服务模式,上百家客户案例! 企业保证,正规流程,正规合作 7*24小时在线服务,售后无忧

CVE-2020-1362漏洞分析:WalletService处理CustomProperty对象的过程中越界读写,可导致攻击者获得管理员权限。

文章来源:重庆网站建设 发布时间:2020-08-11 12:59:46 围观次数:
分享到:

摘要: WalletService服务是Windows上的一种服务,用于保存钱包客户端使用的对象,并且仅存在于Windows 10中。 CVE-2020-1362是WalletService

  WalletService服务是Windows上的一种服务,用于保存钱包客户端使用的对象,并且仅存在于Windows 10中。

  CVE-2020-1362是WalletService处理CustomProperty对象时发生的越界读取和写入。此漏洞可能导致攻击者获得管理员权限,该漏洞被评为高风险。

  Microsoft在2020年7月更新中发布该漏洞的补丁程序。


环境设定


  1.复制环境:Windows 10专业版1909(内部版本18363.815)。

  2.将WalletService服务启动类型设置为自动。

blob.png

  3.调试环境:windbg -psn WalletService。


漏洞原理与分析


  漏洞是CustomProperty对象的Group的get方法和set方法不检查边界。

  1. get方法的a2参数不检查边界,可能泄漏堆上的某些地址。

blob.png

 2. set方法的a2参数没有检查边界,可以覆盖到对象的虚拟表指针,从而控制程序流程。

blob.png


漏洞利用过程


  创建CustomProperty对象

  WalletService服务由WalletService.dll提供。WalletService.dll实际上是动态链接库形式的Com组件,由svchost.exe加载。我们可以在自己的程序(以下称为客户端)中使用CoCreateInstance()或CoGetClassObject()之类的函数来创建对象,并通过调用获取的对象的类方法来使用服务提供的功能。

  如何创建与脆弱功能相对应的对象?最简单的方法是下载msdn的符号表并查看函数名称。

  我们要创建一个CustomProperty对象,ida 搜索一下,发现有两个用于创建此对象的函数:Wallet :: WalletItem :: CreateCustomProperty()和Wallet :: WalletXItem :: CreateCustomProperty()。

blob.png

 因此,我们需要WalletXItem对象或WalletItem对象来创建CustomProperty,那么我们应该使用哪一个呢? 继续使用ida搜索CreateWalletItem或CreateWalletXItem,您将仅找到CreateWalletItem。

blob.png

  因此,在这里我们需要一个WalletX对象。如果继续使用ida搜索,则会发现找不到CreateWalletX,但是如果搜索WalletX,则会找到WalletXFactory :: CreateInstance()。如果具有Com组件开发的经验,会知道这是个工厂类创建接口类的函数。上面提到的CoCreateInstance()函数将使WalletService调用此函数来创建传出接口类,并将其返回给客户端。

blob.png

  那么如何调用WalletXFactory :: CreateInstance()并创建一个WalletX对象呢?我们需要在客户端使用CoCreateInstance()。

HRESULT CoCreateInstance(
    REFCLSID rclsid, // CLSID,用于找到工厂类
    LPUNKNOWN pUnkOuter, // 设置为 NULL 即可
    DWORD dwClsContext, // 设置为 CLSCTX_LOCAL_SERVER,一个宏
    REFIID riid, // IID, 提供给工程类,用于创建接口类实例
    LPVOID *ppv // 接口类实例指针的地址
);

  1.首先,我们需要WalletXFactory的CLSID,可以使用OLEViewDotNet工具进行查看。

blob.png

  2.其次,我们需要一个WalletX IID,可以使用ida直接查看WalletXFactory :: CreateInstance()函数。

blob.png

  使用WalletXFactory的CLSID和WalletX的IID,然后在客户端上调用CoCreateInstance(),WalletService将调用与CLSID对应的WalletXFactory工厂类的CreateInstance(),创建与IID对应的WalletX对象,然后将该对象返回给客户端。

  然后根据上面的分析,使用WalletX :: CreateWalletItem()创建一个WalletItem对象,然后使用WalletItem :: CreateCustomProperty()创建一个CustomProperty对象。

  伪造虚表,覆盖附表指针

  由于相同的动态库在不同的进程中具有相同的负载基址,因此我们可以知道所有dll中函数的地址,因此可以在伪虚拟表中获取函数的地址。

  那么在哪里放置虚拟表呢?直接的想法是将其放在桩上。

  但是,如果继续分析,我们会发现CustomProperty类中有一个字符串对象,可以使用CustomProperty :: SetLabel()修改字符串类。因此,我们可以在字符串类中修改beg指针和end指针,然后调用CustomProperty :: SetLabel()可以写入任何地址。

blob.png

  有了任意地址写入,我们选择将虚表放在WalletService.dll的.data节中,避免将其放在堆上导致程序崩溃。

  控制程序流到LoadLibrary函数

  使用伪造vtable和覆盖虚拟表指针的方法,我们可以通过调用虚拟函数来控制WalletService到任何地址的程序流程。

  那么如何提权呢?在Windows服务提权中,通常的方法是控制程序流,以便可以执行诸如LoadLibrary()之类的功能来加载由我们自己编写的动态链接库,因为在加载dll时,dll中的DllMain()将被执行。此方法是最强大和实用的。

  在这里,我们使用漏洞提交者的方法通过dxgi.dll中的ATL :: CComObject \ ::`vector删除destructor()覆盖虚拟表的地址,因为此函数调用的LoadLibraryExW()将使用全局变量作为要加载的dll的路径。

blob.png

  我们可以通过上面的SetLabel()进行任意地址写,修改上图中的全局变量Src以指向我们自己实现的动态链接库的路径,然后调用相应的虚拟表函数以使程序流执行到 LoadLibrarExW()。

  实施动态链接库

  在DllMain()中编写我们要以高权限执行代码,然后在虚拟表中调用相应的函数,这是WalletService的程序流程,可运行到LoadLibraryEx()。

  请注意,由于Windows服务在后台运行,因此需要在DllMain()中使用命名管道或套接字进行回显或交互。其次,由于执行是LoadLibraryExW(),因此此处的dll路径应使用宽字符。


漏洞利用


  可以获得管理员权限

blob.png


补丁前后


 修补后,get方法和set方法都向a2参数添加了边界检测。

blob.png

blob.png


本文由 重庆网站建设 整理发布,转载请保留出处,内容部分来自于互联网,如有侵权请联系我们删除。

相关热词搜索:CVE-2020-1362 漏洞分析 WalletService CustomProperty 越界读写 管理员权限

上一篇:CVE-2020-13699 TeamViewer漏洞:浏览特定网页时,无需密码黑客即可入侵计算机,悄悄地与计算机建立连接,并进一步利用该系统。
下一篇:Google Chrome浏览器CVE-2020-6519安全漏洞:攻击者利用漏洞绕过网络的内容安全策略(CSP),窃取用户数据并执行恶意代码。

热门资讯

鼠标向下滚动