地狱怪客

弹性边界 – 通过环境变量扩展提升特权

弹性边界 – 通过环境变量扩展提升特权

漏洞, Windows, 代码注入, 绕过UAC, 海拔, 环境变量, 路径重定向, UAC, 可变扩展 enSilo破坏恶意软件

英文原版:https://blog.ensilo.com/elastic-boundaries-elevating-privileges-by-environment-variables-expansion

环境变量(我们在命令注入/高程 – 环境变量中讨论的)也是任何体面操作系统的重要组成部分,包括但不限于所有类型的Unix(Linux,BSD),Windows和OS X.

在微软操作系统的世界中,它们存在于DOS的第一个版本中,进入了Windows的第一个版本,自然也在当前的版本中。

其中一个被他们关注的时代是ShellShock漏洞的发布,它允许通过环境变量注入来在Unix系统上执行命令。

过程的环境

简而言之,环境是一个变量的集合,可供进程或用户读取或写入。

这些变量可以由用户,程序或操作系统来设置,用于在运行过程时提供灵活性。

一些示例是文件系统中的路径,控制执行流的用户名和标志。

WINDOWS环境

Windows中的环境变量可以使用DOS命令来读写:

读:

设置<变量>

写:

设置<变量> = <值>

在命令行中单独键入“set”将显示当前所有可用的变量。

请注意,在这种情况下“当前可用”意味着可用于相同的进程 – 用户运行的命令解释器。

还有一个API函数可以以编程方式使用,而不是“set”命令:

KERNEL32!SetEnvironmentVariable方法

它产生相同的结果。

改变这些值只会对当前进程及其子进程产生影响。

只要允许,系统将用其值替换%VARIABLE%。这个替换过程被称为“扩展”。

例如,如果我们在命令行上键入:

echo%username%

结果输出是扩展后变量的值。该命令与我们最初键入我们的用户名而不是%username%具有相同的效果。

环境波动

如前所述,由进程设置的环境变量可用于该进程及其子进程。这种类型的环境被Windows术语称为“易失性环境”。当进程正在运行时它仍然存在,并且在进程终止时不留下任何痕迹。

在Windows中,还有另外一种环境变量集合,它在系统范围内并在重新启动时保持不变。它可以由管理员在系统属性页面中设置,并通过使用“setx”命令或直接通过设置键值下的注册表值来影响所有用户:

HKEY_CURRENT_USER \环境

易变的环境变量

注册表值的扩展

Windows注册表支持值类型REG_EXPAND_SZ,这是一个类型为string的注册表值,用于指示读取进程在其中扩展任何变量。该扩展过程在应用程序使用该值之前执行。此过程可确保依赖注册表中值的程序的顺利运行,而不会强制开发人员跟踪环境变量值。

WINDOWS程序扩展

通过注册表进行搜索很清楚,许多程序,库和对象是使用扩展路径引用的,而扩展路径依赖于环境。

最常见的变量名为“SystemRoot”。在正常情况下,它指向安装Windows的路径,通常为“C:\ Windows”。

简而言之

我们有可用于Windows进程的环境变量,可以自动扩展并可以由用户设置。

一些Windows的库也被这些路径引用。

基于环境变量扩展的攻击场景

情况1:没有注入的DLL注入

假设

如果一个DLL文件被扩展的环境字符串加载,攻击者可以通过在创建之前更改提供给该进程的环境变量来加载它。

换句话说,任何处于攻击者控制下的进程的子进程都将具有攻击者为其设置的环境。

可能性

加载的DLL,无论是复制,修改或完全替换将具有相同的加载它的进程的权限。

这是在不使用任何注入技术的情况下将“注入”到不同进程的有效方法。

应用

最简单的方法是使用命令行。一般来说,流程将类似于:

  1. 复制C:\ Windows在C:\ Wherever *
  2. 设置环境变量:
    设置SystemRoot = C:\ Wherever
  3. 杀死并重新启动explorer.exe进程
    taskkill / F / IM explorer.exe
    C:\ Windows \ explorer.exe
  4. 资源管理器将启动并从攻击者的目录加载相当多的DLL。攻击者可以替换它们并更改执行流程

*只有几个文件是真正需要的,但方法是故意简单

方案2:加载远程DLL而不注入

这与前面的情况基本相同,只是另外一个因素被添加到等式中,如下所示。

在Windows中,需要文件或目录路径的API通常会接受指向远程计算机的UNC路径。

该过程将尝试使用SMB协议访问给定的路径。

假设

如果攻击者将%SystemRoot%展开为UNC网络路径,则Windows将尝试使用SMB协议从该远程路径加载映像。

可能性

SMB从攻击者控制下的服务器远程加载DLL也会泄露受害者机器的IP地址。

将尝试使用登录用户的凭据对远程服务器进行身份验证,为攻击者提供更多信息。

应用

与方案1相同,但使用远程路径。比如我们可以使用本地机器共享的C盘:

设置SystemRoot = \\ 127.0.0.1 \ c $ \ Windows 

DLL从远程路径加载

场景3:在启动时加载DLL

到目前为止,攻击并不是持久的,意味着重新启动系统,甚至重新启动进程,都会将所有事件重置为正常。

假设

攻击者可以设置对系统控制流程有影响的永久(非易失性)环境变量,无论是否重新启动。

可能性

在操作系统启动过程中,或在满足特定条件时,远程加载DLL。

应用

与场景1相同,攻击者可以使用setx代替set命令:

setx SystemRoot C:\ Wherever

重新启动系统将开始从攻击者的目录加载DLL到不同的进程。

方案4:提升权限#1

到目前为止,我们在攻击者的控制下讨论了可能影响其他进程的环境变量。这些其他进程都属于执行命令的用户,并以中等完整性级别运行。

但是,另一个缺陷存在。

如果允许用户按照Microsoft的用户帐户控制机制所定义的方式执行具有提升的进程,则该进程将被创建为具有不受用户控制的预设环境的svchost.exe的子进程。

问题是创建的子进程将获得当前用户环境的副本,尽管它是svchost.exe的子进程。

环境被复制

根据读者的理念,绕过Windows UAC机制可能会也可能不会被称为提升权限。一方面,微软并不认为这是一个漏洞,但通常会采取行动来解决这些问题。

根据道德规范,我们已经向微软报告了这个问题,并且在发布这篇文章之前收到了一个“非漏洞”响应。

假设

在默认配置下,没有用户的同意,有特定的进程被授予高完整性(或提升)。

一般来说,微软选择的可执行文件集合是允许无提示运行的。

这个列表应该在系统安全和用户友好的体验之间进行合理的权衡。攻击者可以利用这种妥协,并让操作系统运行这些特殊的可执行文件中的一个,同时加载一个不可信的DLL,从而绕过这个安全机制以提升的特权运行给定的DLL。

可能性

在没有用户同意的情况下提升权限或通知,这在默认配置下是可能的。

面向安全的管理员可以选择通过覆盖默认的UAC设置来提高安全性,从而使Windows显示任何请求此权限的进程的提示。

但是,攻击者仍然可以在用户同意的情况下放置一个恶意的DLL文件。

这种陷阱可以用很多合法的进程来设置,Windows任务管理器(taskmgr.exe)就是一个例子。

应用

  1. 按照场景3中的说明设置环境。
  2. 以管理员身份运行自动升级的进程。在我们的例子中,我们使用了lpksetup.exe 

     ShellExecute的(0,”运行方式”,” C:\\视窗\\ System32下\\ lpksetup.exe”,NULL,NULL,0);

高度完整的环境

方案5:提升权限#2

在前面的例子中,我们演示了使用ShellExecute运行升级的程序。Windows还提供用于加载的COM对象。COM的概念和内部工作不在本文的讨论范围之内,但对于我们的目的来说,它们与使用不同机制加载的常规进程,可执行文件或库没有多大区别。

假设

如果有一个COM对象被允许在未经用户同意的情况下使用提升特权进行加载,则攻击者可以使用该机制而不是执行命令并创建自己的进程。

可能性

提升权限,不会产生新的进程。

应用

在这个例子中,选择的对象是Windows提供的COM接口,允许更改防火墙设置。

该对象的CLSID是{752438CB-E941-433F-BCB4-8B7D2329F0C8}

  1. 与情景4/1相同。
  2. CoInitialize的(); 
    
    CoCreateInstance()与给定的CLSID,返回一个指向IFwlCpl接口的指针。
    
    IFwlCpl-> LaunchAdvancedUI()

这将加载mmc.exe,具有提升特权的Windows管理控制台unde svchost.exe,同时从攻击者的C:\ Wherever加载DLL

结论与思考

Windows中的环境变量扩展允许攻击者在攻击之前收集有关系统的信息,并最终在选择时通过运行单个用户级命令或更改一个注册表项来完成对系统的持续控制。

这个向量还可以让攻击者的代码以DLL的形式加载到其他供应商或操作系统本身的合法进程中,并将其行为伪装成目标进程的动作,而无需使用代码注入技术或使用内存操作。

代表管理员运行的第三方服务也可能容易受到此攻击,并允许常规用户在系统内提升其权限。

概念验证Python脚本在BreakingMalware GitHub存储库中可用。

概念验证 -  UAC旁路

 

 

码字很辛苦,转载请注明来自人生在世《弹性边界 – 通过环境变量扩展提升特权》

评论