3 种零防御 UAC 绕过技术

本文选自《内网安全攻防:红队之路》

扫描二维码75折购书

UAC是微软为提高系统安全性在Windows Vista中引入的技术。UAC要求用户在执行可能影响计算机运行的操作或者在进行可能影响其他用户的设置之前,拥有相应的权限或者管理员密码。UAC在操作启动前对用户身份进行验证,以避免恶意软件和间谍软件在未经许可的情况下在计算机上进行安装操作或者对计算机设置进行更改。

在Windows Vista及更高版本的操作系统中,微软设置了安全控制策略,分为高、中、低三个等级。高等级的进程有管理员权限;中等级的进程有普通用户权限;低等级的进程,权限是有限的,以保证系统在受到安全威胁时造成的损害最小。

需要UAC的授权才能进行的操作列举如下:

  • 增加/删除账户。

  • 更改账户类型。

  • 更改UAC的设置。

  • 安装ActiveX。

  • 安装/卸载程序。

  • 安装设备驱动程序。

  • 文件移动/复制Program Files或Windows目录下。

  • 查看其他用户的文件夹。

UAC有如下四种设置要求:

  • 始终通知:这是最严格的设置,每当有程序需要使用高级别的权限时都会提示本地用户。

  • 仅在程序试图更改我的计算机时通知我:这是UAC的默认设置。当本地Windows程序要使用高级别的权限时,不会通知用户。但是,当第三方程序要使用高级别的权限时,会提示本地用户。

  • 仅在程序试图更改我的计算机时通知我(不降低桌面的亮度):与上一条设置的要求相同,但在提示用户时不降低桌面的亮度。

  • 从不提示:当用户为系统管理员时,所有程序都会以最高权限运行。

使用白名单程序绕过UAC分析

在Windows系统中,默认的UAC设置为仅在程序试图更改我的计算机时通知我,这意味着当本地Windows使用高级别的权限时,不会通知用户。例如mmc.exe、eventvwr.exe、wusa.exe、msra.exe,这类程序是以高权限运行时不会触发UAC的白名单程序。利用这样的程序去启动其他程序,会以管理员权限去执行该程序,这样也就绕过了UAC限制。

CompMgmtLauncher.exe是一个白名单程序,程序在启动时会依次查询如下注册表项:

  • HKCU\Software\Classes\mscfile\shell\open\command

  • HKCR\mscfile\shell\open\command

通过Process Monitor可以很清楚地看到该程序在启动时会查询注册表项HKCU\Software\Classes\mscfile\shell\open\command,如果不存在这继续向下查询,如图所示。

值得注意的是,HKCU\Software\Classes\mscfile\shell\open\command注册表项默认不存在,且普通用户可以修改,所以可以使用如下命令,添加一个不存在的键值cmd.exe,劫持原来的启动流程,即可启动高权限的cmd进程,添加成功后效果如图所示。

bash 复制代码
reg add HKCU\Software\Classes\mscfile\shell\open\command/ve /t REG_SZ /d cmd.exe

此时,点击CompMgmtLauncher.exe,使用Process Explorer可以看到启动了一个高权限的cmd进程,绕过了UAC的限制,如图所示。

使用Com组件绕过UAC分析

COM提升名称(COM Elevation Moniker)技术允许运行在用户账户控制下的应用程序用提升权限的方法来激活COM类,以提升COM接口权限。COM组件是微软公司为了计算机工业的软件生产更加符合人类的行为方式开发的一种新的软件开发技术。在COM构架下,人们可以开发出各种各样的功能专一的组件,然后将它们按照需要组合起来,构成复杂的应用系统。

CLSID是指Windows系统对于不同的应用程序,文件类型,OLE对象,特殊文件夹以及各种系统组件分配的一个唯一表示它的ID代码,用于对其身份的标识和与其他对象进行区分,应用程序通过CLSID来调用对象。

CMSTPLUA COM 接口存在Com接口{3E5FC7F9-9A51-4367-9063-A120244FBEC7},ICMLuaUtil中实现了 ShellExec 方法可供调用,ShellExec方法被调用时会执行任意命令,由于父进程DllHost.exe(/Processid:{3E5FC7F9-9A51-4367-9063-A120244FBEC7})已经作为高权限进程来启动,所以就绕过了UAC。

CMSTPLUA 的C++实现可以参考https://gist.github.com/api0cradle/d4aaef39db0d845627d819b2b6b30512,绕过启动cmd关键代码如下:

objectivec 复制代码
#define T_CLSID_CMSTPLUA L"{3E5FC7F9-9A51-4367-9063-A120244FBEC7}"#define T_IID_ICMLuaUtil L"{6EDD6D74-C007-4E75-B76A-E5740995E24C}"......r = CMLuaUtil->lpVtbl->ShellExec(CMLuaUtil, L"C:\\windows\\system32\\cmd.exe", NULL, NULL, SEE_MASK_DEFAULT, SW_SHOW);

编译后执行即可绕过UAC限制,启动一个高权限的cmd进程,如图所示。

UACME的使用

关于UAC的绕过,目前存在很多方法,hfiref0x在github上整理了各种UAC绕过技术的实现,链接:https://github.com/hfiref0x/UACME,该项目默认采用C#编写,使用Visual studio即可进行编译。

UACME编译成功将在Source\Akagi\output目录生成Akagi.exe,通过传入不同的调用方法编号,即可测试不同的绕过UAC的方法。如下图所示,采用61号方法,该方法通过劫持slui.exe的注册表项HKCU\Software\Classes\exefile\shell\open,绕过UAC限制,最后成功启动了高权限的cmd.exe进程。

不难看出,该项目整理了众多绕过UAC的方法,攻击者可以从中提炼出特定的方法来进行武器化,防御者也可以通过测试每个方法的情况,来测试主机安全性。

针对绕过UAC提权的防御措施

在企业网络环境中,防止绕过UAC的最好的方法是不让内网机器的使用者拥有本地管理员权限,从而降低系统遭受攻击的可能性。

在家庭网络环境中,建议使用非管理员权限进行日常办公和娱乐等活动。使用本地管理员权限登录的用户,要将UAC设置为"始终通知"或者删除该用户的本地管理员权限(这样设置后,会像在Windows Vista中一样,总是弹出警告)。另外,可以使用微软的EMET或MalwareBytes来更好地防范0day漏洞。

--- 关于我们 ---

镇江刺掌信息科技有限公司成立于2020年,公司旗下MS08067安全实验室,专注于网络安全领域教育、培训、认证产品及服务提供商。近两年,线上培训人数近10万人次,培养网络安全人才近6000名。

公司被认定为国家高新技术企业、国家科技型中小企业、江苏省创新性中小企业、江苏省民营科技企业、江苏省软件企业。并荣获机械工业出版社"年度最佳合作伙伴"、电子工业出版社-博文视点"优秀合作伙伴"、镇江市企业发展服务中心优质合作伙伴、镇江市网络安全应急支撑服务单位等荣誉称号。

go 复制代码
如果喜欢我们










欢迎 在看丨留言丨分享至朋友圈 三连