UAC
用户帐户控制(User Account Control,简写作UAC)是微软公司从Windows Vista版本操作系统开始采用的一种控制机制。
原理
界面操作是:通过询问用户是否授权给应用程序,使用硬盘驱动器和系统文件的权力。以达到阻止恶意程序(“恶意软件”)损坏系统的效果。
内部逻辑是:
在触发 UAC 时,操作系统会创建一个consent.exe进程,用来确定是否创建具有管理员权限的进程(通过白名单和用户选择判断),然后creat process。请求进程将要请求的进程cmdline和进程路径,通过LPC接口传递给appinfo的RAiLuanchAdminProcess函数,该函数首先验证路径是否在白名单中,并将结果传递给consent.exe进程,该进程验证被请求的进程签名,以及,发起者的权限,是否符合要求,然后决定是否弹出UAC框,让用户确认。这个UAC框会创建新的安全桌面,遮挡之前的界面。同时这个UAC框进程是SYSTEM账户的进程,其他标准用户进程无法与其通信交互。用户确认之后,会调用CreateProcessAsUser函数,以管理员权限启动请求的进程。
所以,病毒木马想要实现高权限操作,就不得不绕过UAC弹窗,在没有通知用户情况下, 悄悄地将普通权限,提升为管理员权限启动进程,从而使程序得到高权限的操作。
绕过UAC ,UAC Bypass
绕过 UAC的方法:
- 白名单提权机制;
- DLL 劫持;
- Windows 自身漏洞提权;
- 远程注入;
- COM 接口技术。
计划任务
路径欺骗。
其余的如通过计划任务、路径欺骗等方式不算入绕过,因为经过了用户确认。
实现Bypass UAC的方法主要有两种方法:一种是利用白名单提权机制,另一种是利用COM组件接口技术。
利用系统自带的UAC白名单程序提权
autoElevate(elevate 提拔,晋升,提升),白名单提权机制。
用户账户控制限制着程序使用高级权限才能进行的操作,但是,UAC同样也会对系统本身的程序造成影响,微软也不希望运行系统程序也需要询问用户,因为系统程序是安全的。因此,微软则在 UAC 中添加了白名单机制,即在系统中记录有一张表单,表单中的系统程序,将不限制其直接提升到管理员权限。 系统中的白名单程序有多个,其中,msconfig、taskmgr、perfmon、cleanmgr 等平时常用的程序都在其中。
操作系统的UAC白名单程序,默认以管理员权限运行,而且不弹出UAC窗口确认。这些白名单程序,都具有微软的签名是操作系统可信的。
一些系统的UAC白名单程序:
在C:\Windows\System32下
sdclt.exe , dccw.exe , eventvwr.exe , computerdefaults.exe , fodhelper.exe
系统调用这些高权限程序,会调用 HKCR( HKEY_CLASSES_ROOT)下的键值。 所以,修改 HKCR( HKEY_CLASSES_ROOT)下的键值,把原本的键值改为 cmd.exe 等 shell 程序。
如果高权限的程序,在运行过程中调用此处被修改过的键值,就会以高权限启动我们设定的程序。
从而实现绕过 UAC提权。难点在于找到注册表的关键位置。
注册表内:
HKCU = HKEY_CURRENT_USER
HKLM = HKEY_LOCAL_MACHINE
HKCR = HKEY_CLASSES_ROOT
我们在Windows 7中利用特权应用程序eventvwr.exe绕过UAC,此特权应用程序的作用类似于微软管理控制台(Microsoft Management Console,MMC)的快捷方式。
当eventvwr.exe启动时,它将检查是否使用特定的二进制文件,为事件查看器提供MMC管理单元的功能。为此,它在注册表键值 ”HKCU\Software\Classes\mscfile\shell\open\command” 中查找特定的二进制位置。如果它存在,它将在此路径上执行二进制文件。否则,将加载Windows事件查看器的默认MMC管理单元,此注册表键值的内容是可绕过UAC的可执行二进制文件。
eventvwr.exe 的权限为 high;
启动程序eventvwr.exe 首先查询键值 HKCU\Software\Classes\mscfile\shell\open\command,查询结果为 NAME NOT FOUND;
eventvwr.exe 接着查询键值 HKCR\mscfile\shell\open\command,结果为 SUCCESS。
更改:
首先需要修改键值 HKEY_CURRENT_USER\Software\Classes\mscfile\shell\open\command,为测试可以把值改为 calc.exe(我们需要绕过UAC的程序)。
因为我这里的 regedit 中的键值只到 HKCU\Software\Classes\ 这层目录,所以我新增了后面的表项,并把值设为 C:\Windows\System32\cmd.exe。
由于Windows更新和安全修复程序的关系,对于不同的Windows版本,特权应用程序和注册表键值可能会有所不同。
其实此方法 2016 年就提出来了, Win10 系统已对该处做了修复。
由于这两种技术都依赖于相同的原理,所以对它们的缓解措施也是一样的。这与将UAC级别设置为Always Notify属性一样简单。
对于不希望将UAC级别设置为Always Notify的系统环境,可以使用其他的保护方法,但是,从系统的安全角度来讲不建议使用。这些方法包括监控并防止以下注册表键值的注册表更改:
1.HKEY_CURRENT_USER\Software\Classes\mscfile\shell\open\command;
2.HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\App Paths\control.exe;
除这些缓解措施外,还建议在可能的情况下使用非特权帐户。
eventvwr.exe 接着查询键值 HKCR\mscfile\shell\open\command,结果为 SUCCESS,因为修改注册表HKCU\Software\Classes\mscfile\shell\open\command得值只需要普通用户权限,所以修改为calc.exe进行测试
但是,测试发现win10没有加载这个注册表路径,win7存在,但是需要手动添加后面得选项\shell\open\command。
Win10的处理
使用特权程序(白名单程序:ComputerDefaults),它具有微软的签名,用户运行它时系统不会弹出UAC窗口。
1. 创建注册表键 HKEY_CURRENT_USER\Software\Classes\ms-settings\shell\open\command;
2. 创建无数据的 HKEY_CURRENT_USER\Software\Classes\ms-settings\shell\open\command\DelegateExecute的值;
3.把要提权启动的程序绝对路径写入HKEY_CURRENT_USER\Software\Classes\ms-settings\shell\open\command\(default)的值里;
4.执行特权程序白名单程序:ComputerDefaults,或者其他系统设置程序,就会委托调用程序了。由ComputerDefaults创建的代理进程自动获得管理员权限。 但是由显示设置程序。
如果装有杀毒软件,在启动程序时,会提示警示
也有很多技术人员在争论这个安全问题,是否是严格意义上的权限提升漏洞。一个主要原因是James Forshaw在演示这个漏洞时,是通过此漏洞来劫持UAC默认级别下自动提权的ComputerDefaults程序,从而实现在默认UAC设置下静默从中完整性级别启动高完整性级别的程序。
把程序加入白名单
运行信任程序时不再弹出用户账户控制窗口 ,把程序加入白名单
解决:
1、打开注册表,找到在 HKEY_CURRENT_USERS\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers,下面会有一些全路径的程序;
2、找到要修改为信任的程序,将值数据修改为“RunAsInvoker”;
3、如果没有你要的程序,右键->新建->字符串值,值的名字是程序的全路径(如:D:\Program\WinRAR\WinRAR.exe),数值数据为“RunAsInvoker”;