一、什么是UAC
UAC(用户账户控制)是微软自windows7以及后续windows系统中引入的一种访问控制功能(之后几乎所有Windows版本都包含了UAC)。UAC的主要目的是确保应用程序只限于标准用户权限,当需要其他权限时,会弹框提示询问 “是否允许以下程序对此计算机进行更改?”,举个小例子,当我们每次安装新软件的时候,都会弹出一个对话框,询问我们是否允许此程序对计算机进行更改
二、UAC的工作流程
如图:
从图上我们可以看到,如果要获得管理员权限,可以通过以下路径:
- 进程已经拥有管理员权限控制;
- 进程被用户允许通过管理员权限运行
- 未开启UAC
三·UAC绕过
1.白名单程序绕过
参考连接:Bypass-UAC(用户帐户控制)的那些事-腾讯云开发者社区-腾讯云
找白名单程序脚本学习连接:https://blog.youkuaiyun.com/2301_80520893/article/details/135913174
有些系统程序是直接获取管理员权限,而不会触发UAC弹框,这类程序称为白名单程序,例如:slui.exe、wusa.exe、taskmgr.exe、msra.exe、eudcedit.exe、eventvwr.exe、CompMgmtLauncher.exe,rundll32.exe,explorer.exe等等。常见的利用方式有:
DLL注入(RDI技术),一般注入到常驻内存的可信进程,如:explorer DLL劫持,常和注册表配合使用达到劫持目的
DLL劫持
exe文件运行时会加载许多dll文件,这些dll文件的加载顺序是
程序所在目录 系统目录即SYSTEM32目录 16位系统目录即SYSTEM目录PATH环境变量中列出的目录 同时,dll加载也遵循着Know DLLs注册表项的机制:Know DLLs注册表项指定的DLL是已经被操作系统加载过后的DLL,不会被应用程序搜索并加载。在注册表 Windows目录 程序加载目录(SetCurrentDirecctory) HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLS处可以看见这些dll
- 1·KnownDLLs 注册表项(优先从缓存加载)
- 2·程序加载目录
- 3·系统目录 (System32)
- 4·16 位系统目录 (System)
- 5·PATH 环境变量中的目录
在knowdlls表项中的dll是预先就加载进内存空间的,被诸多应用调用着,改动需要高权限。
如果我们在应用程序找到正确的dll之前,将我们自己创造的dll放入优先级更高的搜索目录让应用程序优先加载此dll文件,这就造成了dll劫持。但这只是dll劫持的其中一种途径,他有这些途径:
(1) DLL替换:用恶意的DLL替换掉合法的DLL
(2) DLL搜索顺序劫持:当应用程序加载DLL的时候,如果没有带指定DLL的路径,那么程序将会以特定的顺序依次在指定的路径下搜索待加载的DLL。通过将恶意DLL放在真实DLL之前的搜索位置,就可以劫持搜索顺序,劫持的目录有时候包括目标应用程序的工作目录。(3) 虚拟DLL劫持:释放一个恶意的DLL来代替合法应用程序加载的丢失/不存在的DLL(4) DLL重定向:更改DLL搜索的路径,比如通过编辑%PATH%环境变量或 .exe.manifest/.exe.local文件以将搜索路径定位到包含恶意DLL的地方。
(5) WinSxS DLL替换:将目标DLL相关的WinSxS文件夹中的恶意DLL替换为合法的DLL。此方法通常也被称为DLL侧加载
(6) 相对路径DLL劫持:将合法的应用程序复制(并有选择地重命名)与恶意的DLL一起放入到用户可写的文件夹中。在使用方法上,它与(签名的)二进制代理执行有相似之处。它的一个变体是(有点矛盾地称为)“自带LOLbin”,其中合法的应用程序带有恶意的DLL(而不是从受害者机器上的合法位置复制)。
. DLL 替换:
- 位置:直接替换目标 DLL 的真实路径(通常是在 System32、应用程序目录等)。
- 劫持点:当合法的 DLL 被恶意 DLL 替换时,操作系统在执行正常的 DLL 搜索路径时,将加载恶意 DLL。该过程通常在 System32 或应用程序目录下进行。
2. DLL 搜索顺序劫持:
- 位置:应用程序目录或其他优先于合法 DLL 所在路径的位置。
- 劫持点:此攻击利用了应用程序加载 DLL 时,未指定 DLL 完整路径的特性。通过将恶意 DLL 放在优先于合法 DLL 的搜索路径中(如应用程序目录),它会在搜索到合法 DLL 之前加载恶意 DLL。搜索顺序中,应用程序目录和当前工作目录通常位于前列,因此容易被劫持。
- 3. 虚拟 DLL 劫持:
- 位置:应用程序期望的 DLL 路径中,但该 DLL 丢失或不存在。
- 劫持点:当应用程序试图加载一个不存在的 DLL,恶意 DLL 会被放置在搜索路径的一个优先位置,如应用程序目录或系统目录,来代替合法 DLL 被加载。这通常在搜索顺序的第一步(应用程序目录)进行。
- 4. DLL 重定向:
- 位置:通过更改环境变量(如 %PATH%)或使用 .manifest 文件、.local 文件重定向 DLL 加载路径。
- 劫持点:通过修改 DLL 搜索路径,使得系统从恶意的目录中加载 DLL。这可以发生在路径中的任何步骤,具体取决于如何配置重定向。例如,通过修改 %PATH% 环境变量,恶意目录会被插入到 DLL 搜索路径的前面。
- 5. WinSxS DLL 替换(Side-loading,DLL 侧加载):
- 位置:WinSxS(Windows Side-by-Side)文件夹中,Windows 用来管理不同版本的 DLL。
- 劫持点:通过替换 WinSxS 文件夹中的合法 DLL 为恶意 DLL,系统将加载恶意的版本,而不是合法的版本。这个步骤通常依赖于 WinSxS 机制,而不是传统的 DLL 搜索顺序。
- 6. 相对路径 DLL 劫持:
- 位置:用户可写的文件夹,通常是应用程序所在的目录或某些可写目录。
- 劫持点:通过将合法的应用程序与恶意的 DLL 放在同一文件夹中(特别是在用户可写的文件夹中),当应用程序加载 DLL 时,恶意 DLL 被优先加载。这种攻击利用了应用程序的相对路径加载机制,通常会在应用程序目录或工作目录中进行。
2.伪装进程PEB绕过UAC
上面在利用COM接口的ShellExec执行命令的时候,因为执行该操作的进程身份是不可信的,所以会触发UAC弹窗。为了能够迷惑系统,通过修改PEB结构,让系统误认为这是一个可信进程,伪装的可信进程可以是calc.exe、rundll32.exe、explorer.exe等。
四.防御和缓解措施:
- 启用 UAC 并使用推荐设置:确保 UAC 处于开启状态,并且设置为“总是通知”,这样即使是 autoElevate 程序也会需要用户确认。
- 使用 AppLocker 或 Windows Defender Application Control (WDAC):限制不受信任的程序或 DLL 加载,减少被恶意利用的可能性。
- 保持系统和软件更新:许多 UAC 绕过技术依赖于系统漏洞,及时打补丁可以修复这些漏洞。
- 限制用户权限:避免给普通用户分配管理员权限,尽量使用标准用户账户进行日常操作。
- 监控可疑的计划任务:定期检查任务计划程序中的任务,查看是否有未经授权的高权限任务。
补充:
autoElevate属性这个属性是什么
在 Windows 系统中,autoElevate 属性是与用户账户控制(UAC)相关的一个设置。它主要用于系统内的某些特定程序,使它们在执行时自动获得管理员权限,而不弹出 UAC 提示框。这些程序被称为“白名单程序”。
具体来说,autoElevate 属性存在于程序的清单文件(manifest)中,该清单文件包含了程序的执行配置。autoElevate 属性的值为 True 时,意味着该程序在启动时会自动以管理员身份运行,并且不会向用户展示 UAC 弹窗。
工作机制:
- autoElevate=True:程序在启动时会自动静默提升权限,不弹出 UAC 提示。
- autoElevate=False 或未设置:程序正常运行,如果需要提升权限,系统会弹出 UAC 提示,要求用户确认。
例子:
一些 Windows 自带的系统程序如 taskmgr.exe(任务管理器)和 eventvwr.exe(事件查看器)是白名单程序,它们通常拥有 autoElevate=True 的属性,因此不需要用户手动确认权限提升。
PEB
Know DLLs注册表项的机制
KnownDLLs 注册表项是 Windows 操作系统中的一个机制,用来指定一些系统核心的 DLL 文件,并优化这些 DLL 的加载方式。通过 KnownDLLs,操作系统可以确保这些 DLL 文件是从系统目录中加载的,并避免重复加载多个副本,从而节省内存和提高效率。
KnownDLLs 的作用:
当应用程序请求加载 DLL 时,Windows 操作系统会首先检查 KnownDLLs 列表中的内容。如果该 DLL 存在于 KnownDLLs 中,系统会直接从预先加载的内存区域中提供它,而不需要从磁盘上重新加载。这种机制大幅提升了常用 DLL 文件的加载速度,并防止恶意或不正确的 DLL 文件替换系统核心的 DLL 文件。
KnownDLLs 的注册表路径:
KnownDLLs 列表存储在以下注册表路径中:
mathematica HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs
在这个路径下,注册表项列出了系统认为“已知”的 DLL 文件名,Windows 会优先从系统目录加载这些 DLL,而不考虑应用程序或其他位置的相同文件名。
例如,在典型的 KnownDLLs 注册表中,可以看到一些系统核心的 DLL 文件:
- kernel32.dll
- user32.dll
- gdi32.dll
- ntdll.dll
这些 DLL 是 Windows 系统的核心组件,几乎所有应用程序都会使用到它们。通过 KnownDLLs 机制,操作系统可以优化这些常用 DLL 的加载和管理。
KnownDLLs 机制的具体工作方式:
- DLL 加载流程
- 2.DLL 优先级
- 共享内存机制
KnownDLLs 的用途:
- 提高性能
:
常用 DLL 文件通过 KnownDLLs 机制直接从共享内存区域加载,减少了磁盘访问和重复加载的开销,提升了性能。
- 安全性
:
通过优先加载 KnownDLLs 中的 DLL,操作系统可以防止某些 DLL 劫持攻击。应用程序无法覆盖或替换这些关键的系统 DLL,降低了系统受到恶意软件攻击的风险。
- 内存优化
:
通过共享常用 DLL 的内存副本,多个进程可以同时使用同一份 DLL,而不需要为每个进程加载独立的副本,从而节省了内存。
如何修改 KnownDLLs:
虽然可以通过注册表编辑器手动修改 KnownDLLs 项,但这种操作风险较高,通常不建议进行修改。错误的修改可能会导致系统无法正常加载关键的 DLL,进而引发系统崩溃或严重的稳定性问题。
- 修改 KnownDLLs 通常只应由系统管理员或高级用户进行,并且在修改前需要做好备份。
- 在某些情况下,恶意软件可能试图修改 KnownDLLs 来操纵系统的 DLL 加载行为,因此监控这些注册表项的完整性对安全管理至关重要。