当前位置: 首页 > article >正文

11月1日笔记(UAC绕过)

Bypass UAC

用户账户控制(User Account Control,UAC)是 Windows 操作系统采用的一种控制机制,可以阻止自动安装未经授权的应用并防止意外更改系统设置,有助于防止恶意软件损坏计算机。用户账户控制使应用程序和任务始终在非管理员账户的安全上下文中运行,除非管理员专门授予管理员级别的权限。开启用户账户控制后,每个需要使用管理员访问令牌的应用都必须提示征得用户同意.

当非 RID 500的管理员用户登录后,系统会为其创建两个单独的访问令牌:标准用户访问令牌和管理员访问令牌。标准用户访问令牌包含与管理员访问令牌相同的用户特定信息,只是移除了 Windows 管理特权和相关 SID。标准用户访问令牌用于启动不执行管理任务的应用程序(标准用户应用程序)。当管理员需要执行高权限管理任务时Windows 会自动提示用户予以批准,同意后则允许使用管理员访问令牌.

在实战中,如果测试人员可以绕过 Windows UAC 机制,使非 RID 500 的管理员账户可以不需用户批准直接使用管理员访问令牌,从而获得全部的管理权限。注意,UAC实际上是一种权限保护机制,而 Bypass UAC 仅仅是绕过了这一保护机制,本质上并不能将其看作一种真正的提权。

UAC 白名单

微软在用户账户控制中为一些系统程序设置了白名单机制,所有白名单中的程序将不再询问,以静默方式自动提升到管理员权限运行,如 slui.exe、wusa.exe、taskmgr.exe.msra.exe、eudcedit.exe、eventvwr.exe、CompMgmtLauncher.exe、rundll32.exe,explorer.exe等。测试人员可以通过对这些白名单程序进行 DLL 劫持、DLL 注入或者注册表劫持等绕过 UAC 并提升权限。

在寻找白名单程序时,可以使用微软官方提供的工具 Sigcheck 和 Strings。

Sigcheck下载地址:https://docs.microsoft.com/en-us/sysinternals/downloads/sigcheck?spm=5176.28103460.0.0.49e35d27S7T0WC

白名单程序拥有一个共同的特性,就是 Manifest数据中 autoElevate 属性的值为 True。Sigcheck 可以检测程序是否具有 autoElevate 属性,以 ComputerDefaults.exe 为例。

sigcheck.exe /accepteula -m C:\Windows\System32\ComputerDefaults.exe

Strings 可以找出所有具有 autoElevate 属性的程序。

strings.exe /accepteula -s C:\Windows\System32\*.exe | findstr /i "autoElevate"

下面以 ComputerDefaults.exe 为例进行分析,并通过该程序绕过 UAC 实现提权ComputerDefaults.exe 运行后会打开Windows 的默认应用。

直接到 System32 目录下运行 ComputerDefaults.exe 程序,打开“默认应用”界面并未出现 UAC 弹窗。

使用进程监控器 Process Monitor 监控 ComputerDefaults.exe进程的所有操作行为(主要是监控注册表和文件的操作)。可以发现,ComputerDefaults.exe 进程会先查询注册表 HKCU\Software\Classes\ms-settings\shell\open\command 中的数据,发现该路径不存在后,继续查询注册表 HKCR\ms-settings\Shell\Open\Command\DelegateExecute 中的数据并读取。

通常情况下,以“shell\open\command”命名的注册表中存储的可能是可执行文件的路径,程序会读取其中的键值并运行相应的可执行文件。由于ComputerDefaults.exe 是UAC白名单中的程序,运行时默认提升了权限,因此在运行该键值中的可执行文件时默认为管理员权限。

reg add "HKCU\software\classes\ms-settings\shell\open\command" /d "c:\handler.exe" /f
reg add "HKCU\software\classes\ms-settings\shell\open\command" /v DelegateExecute /t REG_SZ /d "c:\handler.exe" /f 

再次执行 ComputerDefaults.exe 时,恶意程序就会随着 ComputerDefaults.exe 的启动默认通过 UAC 控制并以提升的权限运行。成功监听到,得到的监听就是管理员权限了。

DLL劫持

Windows 系统中的很多应用程序并不是一个完整的可执行文件,被分割成一些相对独立的动态链接库(Dynamic Link Library,DLL)文件,其中包含程序运行所使用的代码和数据。当应用程序启动时,相应的 DIL文件就会被加载到程序进程的内存空间。测试人员可以通过一些手段,欺骗合法的、受信任的应用程序加载任意的 DLL 文件,从而造成 DLL 劫持。

当应用程序加载 DLL 时,如果没有指定 DLL 的绝对路径,那么程序会以特定的顺序依次在指定路径下搜索待加载的 DIL。在开启安全 DLL 搜索模式(SafeDllSearchMode.Windows XP SP2 后默认开启)的情况下,将按以下顺序进行搜索:程序安装目录 → 系统目录(C:Windows\System32)→16位系统目录(C:|Windows\System)→ Windows目录(C:\Windows)→当前工作目录→PATH 环境变量中列出的各目录。

如果将同名的恶意 DIL 文件放在合法 DLL 文件所在路径之前的搜索位置,当应用程序搜索 DLL 时,就会以恶意 DLL 代替合法的 DLL 来加载。这就是经典的 DLL 预加载劫持情景,利用的前提是拥有对上述目录的写入权限,并且恶意 DLL 需要与原始 DLL拥有相同的导出表函数。

测试人员可以通过 DLL 劫持技术来执行攻击载荷,通常可能是为了实现权限的持久化。但是,如果加载 DLL 文件的应用程序是在提升的权限下运行,那么其加载的 DLL 文件也将在相同的权限下运行,因此 DLL 劫持也可以实现权限提升。基于上述原理,通过劫持 UAC 白名单程序所加载的 DLL 文件,测试人员就可以借助白名单程序的自动提升权限来 Bypass UAC。

注意:这些白名单程序所加载的 DLL 文件几乎都位于系统可信任目录中,而这些目录对标准用户来说通常都是不可写的;

所以需要掌握模拟可信任目录的技术。

模拟可信任目录

在各种 Bypass UAC 的手法中总会出现白名单程序的影子。UAC 白名单中的程序在用户启动时不会弹出提示窗口,可以自动提升权限来运行。并且,白名单程序都拥有一个共同的特性,即Manifest中 autoElevate 属性的值为 True。

Manifest 文件的主要作用都是提供应用程序或组件的元数据信息,帮助操作系统、浏览器或其他工具正确地加载和管理这些组件。

当启动的程序请求自动提升权限时,系统会先读取其可执行文件的 Manifest 信息,解析 autoElevate 属性字段的值。如果该字段存在并且值为 True,就会认为这是一个可以自动提升权限的可执行文件。并且,系统会检查可执行文件的签名,这意味着无法通过构造 Manifest 信息或冒充可执行文件名来实现自动权限提升。此外,系统会检查可执行文件是否位于系统可信任目录中,如 C:\Windows\System32 目录。当这三个条件全部通过后,则允许程序自动提升权限,有任意一个条件不通过都会被系统拒绝

系统在检查可信任目录时,相关函数会自动去掉可执行文件路径中的空格。如果可执行文件位于“C:\Windows \System32”目录(在“Windows”后有一空格,下文统称“模拟可信任目录”)中,系统在检查时会自动去除路径中的空格,这样就通过了最一个条件的检查。基于此原理,测试人员根据可信任目录来创建一个包含尾随空格的模拟可信任目录一个白名单程序复制到模拟可信任目录中,配合 DLL劫持等技术即可成功绕过 UAC。

执行如下命令:

md "\\?\C:\Windows "
md "\\?\C:\Windows \System32"
copy C:\Windows\System32\WinSAT.exe "\\?\C:\Windows \System32\WinSAT.exe"

创建 C:\Windows \System32 模拟可信任目录,并将白名单程序 WinSAT.exe 复制到该目录。启动模拟可信任目录中的 WinSAT.exe,同时使用 Process Monitor 检测其进程所加载的 DLL。使用Process Monitor检测其进程加载的DLL。

如果程序尝试在当前包含空格的目录加载 DLL 并且都失败了,可以编写一个恶意的 DLL 文件并将其放入该目录进行 DLL 劫持,这里选择的是 WINMM.dll。注意,构造的恶意 DLL 需要与原来的 DLL 具有相同的导出函数。可以使用 ExportsToC++,类似的工具还有 AheadLib 获取原 DLL 文件的导出函数并自动生成 C++代码。简单修改生成代码,在 DLLMain 入口函数中加入要执行的操作,并通过 Visual Studio 创建项目,编译生成 64 位 DLL 文件。 将生成的 WINMM.dll 放入前面创建的模拟可信任目录,运行 WinSAT.exe(模拟可信任目录中)后,即可弹出一个关闭了UAC 的命令行窗口。

相关辅助工具

1、UACME

UACME 是一个专用于绕过 Windows UAC的开源项目,目前已包含了 70多种 BypassUAC的方法。在UACME项目中,每种Bypass UAC 的方法都有一个数字编号,由一个名为Akagi.exe(需要自行编译生成)的主程序进行统一调用。

akagi.exe [Key] [Param]
# Key,指定要使用的方法的编号
#Param,指定绕过 UAC后要运行的程序或命令,默认启动一个关闭了 UAC的 CMD 窗口
常见的Key有 23 41 61 62

项目地址:https://github.com/hfiref0x/UACME

先在visual studio上编译好项目,把可执行文件上传到目标机,经尝试发现41能绕过UAC。

Akagi.exe 41 C:\Windows\System32\cmd.exe

配合msf能获得系统管理员权限。

2、Metasploit下的UAC利用

MetaSploit 渗透框架中内置了几个用于绕过 UAC 的模块。

成功利用这些模块,将得到一个关闭了UAC保护的 Meterpreter,然后执行 getsystem命令,可直接提升至SYSTEM 权限。


http://www.kler.cn/a/380467.html

相关文章:

  • Python知识图谱框架
  • 振动分析-46-设备振动监测和故障诊断能力提升需要理解和掌握的知识体系
  • 直流有刷电机多环控制(PID闭环死区和积分分离)
  • Linux服务器端自动挂载存储设备(U盘、移动硬盘)
  • c++ [spdlog 配置与使用]
  • leetcode之hot100---2两数相加(C++)
  • Golang | Leetcode Golang题解之第535题TinyURL的加密与解密
  • PHP单商户多门店会员管理系统小程序源码
  • react jsx基本语法,脚手架,父子传参,refs等详解
  • 【系统架构设计师】2023年真题论文: 论软件可靠性评价的设计与实现(包括和素材和论文)
  • 大厂面试真题-说说redis的分片方式
  • 深入研究 RAG 流程中的关键组件
  • Kubernetes架构及核心组件
  • Soul App创始人张璐团队自研多模态大模型,亮相GITEX GLOBAL获好评
  • 【Arch Linux 上安装 Appium 】
  • 进程介绍!
  • AcWing 1073 树的中心 树形dp (详解)
  • 图书管理系统(JDBC)
  • Elasticsearch Date类型,时间存储相关说明
  • 创新材料科技:铜冷却壁助力高炉节能降耗
  • 【React】初学React
  • 新能源汽车火灾应急处置程序
  • w~大模型~合集20
  • 在 Oracle 数据库中,SERVICE_NAME 和 SERVICE_NAMES 有什么区别?
  • 云原生后端:现代应用程序开发的关键技术
  • 【vue项目中添加告警音频提示音】