
UAC是微软为提高系统安全性在Windows Vista中引入的技术。UAC要求用户在执行可能影响计算机运行的操作或者在进行可能影响其他用户的设置之前,拥有相应的权限或者管理员密码。UAC在操作启动前对用户身份进行验证,以避免恶意软件和间谍软件在未经许可的情况下在计算机上进行安装操作或者对计算机设置进行更改。
在Windows Vista及更高版本的操作系统中,微软设置了安全控制策略,分为高、中、低三个等级。高等级的进程有管理员权限;中等级的进程有普通用户权限;低等级的进程,权限是有限的,以保证系统在受到安全威胁时造成的损害最小。
需要UAC的授权才能进行的操作列举如下:
UAC有如下四种设置要求:
在Windows系统中,默认的UAC设置为仅在程序试图更改我的计算机时通知我,这意味着当本地Windows使用高级别的权限时,不会通知用户。例如mmc.exe、eventvwr.exe、wusa.exe、msra.exe,这类程序是以高权限运行时不会触发UAC的白名单程序。利用这样的程序去启动其他程序,会以管理员权限去执行该程序,这样也就绕过了UAC限制。
CompMgmtLauncher.exe是一个白名单程序,程序在启动时会依次查询如下注册表项:
通过Process Monitor可以很清楚地看到该程序在启动时会查询注册表项HKCU\Software\Classes\mscfile\shell\open\command,如果不存在这继续向下查询,如图所示。

值得注意的是,HKCU\Software\Classes\mscfile\shell\open\command注册表项默认不存在,且普通用户可以修改,所以可以使用如下命令,添加一个不存在的键值cmd.exe,劫持原来的启动流程,即可启动高权限的cmd进程,添加成功后效果如图所示。
reg add HKCU\Software\Classes\mscfile\shell\open\command
/ve /t REG_SZ /d cmd.exe
此时,点击CompMgmtLauncher.exe,使用Process Explorer可以看到启动了一个高权限的cmd进程,绕过了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关键代码如下:
#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进程,如图所示。

关于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设置为“始终通知”或者删除该用户的本地管理员权限(这样设置后,会像在Windows Vista中一样,总是弹出警告)。另外,可以使用微软的EMET或MalwareBytes来更好地防范0day漏洞。
本文分享自 Ms08067安全实验室 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!