再绕UAC:如何利用模拟可信目录绕过UAC

一、媒介

在钻研绕过UAC(用户账户节制)的新型技巧时,我发清楚明了一种新的绕过措施。虽然微软并不觉得UAC属于安然界限范畴,但我们依然将这个问题反馈给微软,也乐意在此处与大年夜家分享。我们已经在Windows 10 Build 17134上测试过这种措施。在深入阐发绕过措施之前,本文首先将简要回首一下UAC的背景常识,以便赞助大年夜家懂得UAC的内部事情道理。

二、背景常识

当附属于Administrators组的用户想履行必要高权限的某个进程时,系统就会弹出UAC提示窗口,确认用户提升进程权限。然而,Windows系统中并非所有的特权可履行法度榜样都邑弹出UAC窗口,某些例外环境下并不会弹出该窗口,而会“自动提升”目标可履行文件的权限,这样就能绕过UAC机制(许多人肯定会认为异常惊疑)。

系统对这类受相信的可履行文件做了其他一些安然反省,以确保这些文件切实着实可托,不会被进击者滥用。之前的UAC绕过技巧中广泛使用了这种措施,本文的使用思路也不例外。然而,为了成功绕过UAC,我们必要在进击历程中跳过一些“坑”。假如我们的可履行文件想实现“自动提权”,就必须遵照某些强制性前提。为了阐发全部历程,这里我将给大年夜家展示appinfo.dll(处置惩罚权限提升的AIS办事,属于UAC的核心组件之一)中的一些反汇编代码片段。

前提1:autoElevate为True

当呈现法度榜样权限提升环境时,系统就会对AIS(appinfo.dll)履行RPC调用,将目标可履行文件的路径作为调用参数。随后,该办事会映射目标可履行文件的内容以便后续读取,系统会考试测验读取可履行文件的manifest信息,解析autoElevate字段(假如该字段存在)的值。

图1. 读取可履行文件的Manifest信息解析可能存在的autoElevate值

假如该字段存在并且值为True,那么系统会觉得这是一个可以自动提升权限的可履行文件,随后履行权限提升,绕过UAC提示框(条件是该文件已经由过程另一个限定前提,下文会提到这个问题)。然而,这种autoElevate规则依然存在一个例外环境。无论manifest的详细内容是什么,假如文件名匹配某个白名单中的EXE名称,系统也会将其当成具备“自动提升权限的”可履行文件。如下图所示,代码中在manifest反省历程后有一个bsearch调用,反省文件名是否匹配白名单可履行文件名列表。假如文件名满意前提,那么就会自动提升权限,疏忽manifest数据。

图2. bsearch调用测试可履行文件名是否匹配自动提升权限的exe文件名

硬编码的白名单文件名部分列表如下:

cttunesvr.exe

inetmgr.exe

migsetup.exe

mmc.exe

oobe.exe

pkgmgr.exe

provisionshare.exe

provisionstorage.exe

spinstall.exe

winsat.exe’

前提2:颠末署名

假如UAC哀求所对应的二进制文件已设置设置设备摆设摆设为“自动提升权限”,那么系统就会应用wintrust!WTGetSignatureInfo来反省文件的署名。这意味着进击者无法简单地构造manifest信息或者可履行文件名来实现自动权限提升,由于进击者的文件很可能没有颠末精确的署名处置惩罚,并且很有可能无法满意第3个前提(即从可托目录中履行)。

前提3:从可托目录中履行

实现自动权限提升的第3个前提:目标可履行文件位于“可托目录”中,比如C:\Windows\System32。如图3所示,AIS会反省权限提升哀求所对应的文件路径,在本例中,“可托目录”为C:\Windows\System32。

图3. 反省可托路径

既然本文的名字为“若何经由过程模拟可托目录绕过UAC”,大年夜家应该能猜到我们下文的内容了。

三、绕过UAC

在背景常识中我们提到过,假如满意如下前提,则可以实现权限自动提升(UAC绕过):

1、设置设置设备摆设摆设为权限自动提升;

2、颠末精确署名;

3、从可托目录(C:\Windows\System32)中履行。

在反省可托目录时,Appinfo.dll(AIS)会应用RtlPrefixUnicodeString这个API来反省目标可履行文件路径是否以C:\Windows\System32\作为前缀。这是异常靠得住的反省历程,由于系统会反省目标可履行文件的标准路径。为了绕过这个反省步骤,我构造了一个目录:C:\Windows \(请留意Windows后面随着一个空格符)。当然这个路径并不能绕过RtlPrefixUnicodeString,并且因为Windows不容许在目录名末端附加一个空格符,是以这并不是一个有效的目录名(或者至少不是一个“友好的”目录名)。然而,假如我们应用CreateDirectory API,然后在待创建的目录名前加上\\?\,那么我们就可以绕过系统的一些命名规则,将目录创建哀求直接发送给文件系统。

图4. 调用API

这将导致系统中呈现一个为难的目录,能够与真正的C:\Windows\目录折衷共存(然而我们不能在Windows资本治理器中对这个目录做任何操作)。

图5. 目录删除哀求无法成功,也无法经由过程重命名来删除末真个空格符

现在我们已经创建了一个C:\Windows \目录,我们可以在该目录中创建一个system32目录,然后将C:\Windows\System32目录中颠末署名的、能够自动提升权限的可履行利用拷贝到该目录中。这里我选择拷贝winSAT.exe(这是位于自动提升权限白名单中的一个Windows可履行文件)。当我们考试测验运行C:\Windows \System32\winSAT.exe时,appinfo.dll在反省可托目录时会先调用如下API(如图6所示)。这一点异常关键,这也是我们为什么能绕过UAC的缘故原由所在。

[1] [2]下一页

图6. API调用历程

当哀求权限提升历程将这个为难的目录发送到AIS时,该路径会通报给GetLongPathNameW函数,该函数会将该路径转换回C:\Windows\System32\winSAT.exe(删除了空格符)。异常完美,现在这个路径已经变成了可托目录(可以经由过程RtlPrefixUnicodeString的反省)。加倍完美的是,当完成可托目录反省后,后续反省(以及终极的权限提升哀求)依然会应用原始的文件名(带有空格符)。这样我们就能经由过程其他所有反省,终极让appinfo.dll履行我们复制的winSAT.exe,自动提升权限(由于该文件已颠末精确署名,并且处于自动提升权限的白名单中)。

为了经由过程这种措施真正履行进击者的代码,我将一个捏造的WINMM.dll(该dll会被winSAT.exe加载)开释到了C:\Windows \System32\中,经由过程本地dll挟制技巧履行我们的代码。完备的流程如下图所示。

图7. 完备使用历程

完备代码可以造访Github下载。

上一页[1] [2]

赞(0) 打赏
分享到: 更多 (0)
免责申明:本站所有资料均来自于网络,版权归原创者所有!本站不提供任何保证,不保证真实性,并不承担任何法律责任

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

阿里云优惠网 更专业 更优惠

阿里云优惠券阿里云大礼包