基于COM组件ICMLuaUtil接口来实现UAC绕过

前言:Y4er哥之前遇到的一个环境,需要进行uac,但是存在卡巴,最后解决的COM组件ICMLuaUtil接口,自己也整理下UAC这个知识点

参考文章:https://payloads.online/archivers/2020-03-02/2
参考文章:http://blog.leanote.com/post/snowming/ec21a4823438
参考文章:https://cloud.tencent.com/developer/article/1623517

UAC(用户帐户控制):

UAC(User Account Control)是微软在 Windows Vista 以后版本引入的一种安全机制,通过 UAC,应用程序和任务可始终在非管理员帐户的安全上下文中运行,除非管理员特别授予管理员级别的系统访问权限。

UAC 可以阻止未经授权的应用程序自动进行安装,并防止无意中更改系统设置。

UAC需要授权的动作包括:配置Windows Update;增加或删除用户账户;改变用户的账户类型;改变UAC设置;安装ActiveX;安装或移除程序;安装设备驱动程序;设置家长控制;将文件移动或复制到Program Files或Windows目录;查看其他用户文件夹等。

什么时候需要绕过UAC

举例一个环境:当我们当前获得的权限是存在于管理员组的时候但并不是administrator这个用户,此时就可能需要我们进行绕过UAC的操作,否则虽然是管理员组但是实际上并没有管理员所对应的高权限操作(其实是有的)

这里的一个问题,我说的"其实是有的"具体是什么意思?这里我讲下当上面说的管理员组,但并不是administrator用户的时候,当这个用户通过LSA验证批准之后,它会生成一个受限的凭证令牌和一个高权限的凭证令牌,默认在桌面使用的时候都是基于受限的凭证令牌的,如下图所示

注意:我这里说的"基于受限的凭证令牌"也就是基于图中的explorer.exe该进程所启动的进程

为什么有的应用程序不需要提示UAC

因为普通应用执行权限有限,某些操作必然会要求更高的管理员权限。此时,通常就需要一个权限提升的操作。程序可以向系统请求提权,系统会将此请求通过提一个提示框,请用户确认。

如果当前用户的用户组权限不是管理员,提权操作是要求输入管理员密码的,这点和在Linux中的相应操作类似。

猜想所以有的应用程序不需要提示UAC,应该是类似的windows自带的某些必然需要运行的程序,而且该程序默认要求更高的管理员权限来进行维持相对应的需要,所以自然不需要用户的确认来确定该操作,其中还有一个特性就是拥有自动权限提升属性的文件,当默认以管理员权限运行,不需要经过用户的授权。

上面讲的关于有的应用程序不需要提示UAC的问题,也就是我们其中的白名单程序的绕过的方式

绕过UAC的两种方法

所以一般绕过UAC的方法主要有两种方法,一种就是利用白名单提权机制,另外一种就是利用COM组件接口技术

利用白名单提权机制

倾旋的文章中提到了:拥有自动权限提升属性的文件,当默认以管理员权限运行,不需要经过用户的授权的程序则可以成为我们白名单程序

这里其实还需要指出一点:仅仅找到拥有自动权限提升的属性的程序还是不够的,为什么不够?难道我们可以叫它帮我们进行其他命令的执行吗?不可以

但是可以尝试去挖掘,如果我们能够劫持它所需要的dll文件来执行我们所需要的才真正成功了

到时候差不多介绍完白名单的提权机制了

那么如何进行寻找白名单的程序并且成功利用呢?

这里用到的工具Sigcheck.exe

这里还需要普及下程序运行的三种权限属性:asInvoker 和 highestAvailable 和 requireAdministrator

asInvoker:启动的时候跟随的是当前用户的权限。

highestAvailable:以当前用户可以获得的最高权限运行。

requireAdministrator:仅以系统管理员权限运行。

那么我们找的话肯定要找highestAvailable属性的,因为如果我们都能以管理员权限运行了,肯定就不需要bypass UAC了

UAC提权

这里我们观察的应用程序是eventvwr.exe,首先用 Sigcheck.exe 进行查看相关的信息,命令为sigcheck64.exe -m c:\windows\system32\eventvwr.exe,满足了其中的一点,它的启动是以最高权限启动的

那么继续寻找它是否调用了什么东西,这里需要用到的工具是 Process Monitor

进行对应的过滤规则的选择,找到程序eventvwr.exe,找到其调用过程,可以发现这条注册表的项它会进行查询

尝试进行修改该注册表的项,看看它的结果

再次运行,发现会弹出相应的calc,同时进行查看该calc计算器的权限

一次完整的绕过UAC的流程就是这样,在这里自己还有点问题,为什么要找这个点,其他的注册表进行查询也很多难道不可以利用吗?

那么再试试改其他注册表查询键对应的值,看看会不会进行相对应的运行操作,这里随机选择的一条注册表的项进行修改为calc的启动路径,然后重新进行运行eventvwr.exe

发现结果直接报错,并且找不到该项,因为程序运行到这就直接报错结束,如下图所示,所以并不是只要是注册表查询项都可以进行利用,前提还需要保证程序的稳定运行。

利用COM组件接口技术

这里也需要先介绍下,顺便自己也学习下

这里查看COM组件的工具用的是oleView

想要利用COM接口,需要知道以下三个东西,分别是"标识COM组件"、"标识接口","接口的虚函数表"

  • 标识COM组件的GUID,即CLSID

  • 标识接口的GUID,即IID

  • 该接口的虚函数表,主要用来找到ShellExec的函数偏移地址来进行调用

关于CLSID

首先要知道在windows系统对于不同的应用程序,文件度类型,OLE对象,特殊文件夹以及各种系统组件分配一个唯一表示它的ID代码,用于对已知身份的标识和与其他对象进行区分,这个ID就是GUID。

而其中CLSID则是特定类型的GUID,用来标识COM类对象。

IID

IID代表COM组件类中的导出接口,这个COM组件中不止含有一个导出接口,所以IID是用户指出该COM组件中的哪一个导出接口

UAC提权

COM组件能够实现BypassUAC从而执行命令的都需要有三个特点:

  • Elevation属性开启

  • Auto Approval属性开启

  • COM组件中的接口存在可以命令执行的地方

COM组件中的接口存在可以命令执行的地方,例如ICMLuaUtil的ShellExec函数

可以看到最后实现的代码中利用了虚函数表中记录的ShellExec地址来进行调用执行命令,代码看8懂 以后再慢慢看

在文章中发现当用exe进行编译的时候这样还是无法成功绕过uac,而通过rundll32.exe来进行dll文件中调用导出函数却能够成功绕过uac,这里的根本原因是系统的可信进程,比如在通过火绒中可以观察到相关系统的可信进程,如下图所示

当通过修改PEB来进行伪装可信进程explorer.exe之类的则可以进行绕过,代码看8懂,以后再慢慢看

现在继续说为什么dll可以呢?因为rundll32.exe是系统可信进程所以可以直接绕过

win10环境下进行实验:

posted @ 2020-05-19 19:33  zpchcbd  阅读(364)  评论(0编辑  收藏  举报