Powershell JEA函数中嵌入命令的安全漏洞



这看起来很疯狂,所以我希望我没有发现太大的安全漏洞。。。我在服务器上成功地设置了Powershell JEA(刚好足够的管理),只允许某些管理功能。具体来说,我没有";net";命令完全允许。如果我做以下操作:

Invoke-Command -computername MYSERVER -configurationname MYCONFIG -scriptblock {
net stop "My windows service"
}

然后我得到下面的错误,正如预期的那样:

术语"net.exe"未被识别为cmdlet的名称,函数、脚本文件或可操作程序。检查的拼写名称,或者如果包含路径,请验证该路径是否正确,并且再试一次。+CategoryInfo:ObjectNotFound:(net.exe:String)[],CommandNotFoundException+FullyQualifiedErrorId:CommandNotFoundException

但是,如果我把我的";net.exe";在函数内部使用,它实际上是有效的:

Invoke-Command -computername MYSERVER -configurationname MYCONFIG -scriptblock {
function StopService($servicename) {
net stop "$($servicename)"
}   
StopService "My windows service"
}

上述操作不会引发错误,实际上会停止服务。WTF?

这不仅仅是";net";命令另一个例子是:;输出文件";不允许。以下代码失败:

Invoke-Command -computername MYSERVER -configurationname MYCONFIG -scriptblock {
"hacked you" | Out-File C:test.txt
}

错误:

术语"Out File"未被识别为cmdlet的名称,函数、脚本文件或可操作程序。检查的拼写名称,或者如果包含路径,请验证该路径是否正确,并且再试一次。+CategoryInfo:ObjectNotFound:(输出文件:字符串)[],CommandNotFoundException+FullyQualifiedErrorId:CommandNotFoundException+PSComputerName:vxcazdev01

但如果我这样做,它会起作用:

Invoke-Command -computername MYSERVER -configurationname MYCONFIG -scriptblock {
function DoIt() {
"hacked you" | Out-File C:test.txt
}

DoIt
}

为什么会发生这种情况?我是不是错过了什么?github上的JEA项目现在是只读的,所以我不能在那里打开问题。

编辑添加:如果我使用Enter PSSession而不是Invoke Command,也会出现同样的问题。

编辑以添加相关的会话配置:我的会话配置文件只有一些来自New-PSSessionConfigurationFile命令生成的默认文件的自定义:

SessionType = 'Default'
RunAsVirtualAccount = $true
RoleDefinitions = @{
'MYDOMAINMYADGROUP'    = @{ RoleCapabilities = 'MyCustomRole' }
}

MYADGROUP是我的测试用户所属的唯一组。然后在服务器上注册,如下所示:

Register-PSSessionConfiguration -Path "C:Program FilesWindowsPowerShellModulesMyJEAModuleVSM.pssc" -Name 'MYCONFIG' -Force

我只想自己回答这个问题:设计安全漏洞。

文件上写着:

自定义函数的主体(脚本块)以系统的默认语言模式运行,不受JEA的语言约束。

至少对我来说,JEA会让你在安全沙盒中锁定服务器上的操作,这相当令人惊讶,但一旦有人编写了自己的自定义函数,他们就对机器拥有完全的管理权限,并且已经开箱即用。允许或限制通过语言模式创建自定义函数是一回事,但绕过设置的安全权限是另一回事。在我看来,用户编写的自定义函数应该受到完全的安全限制;如文档所示,在角色功能文件中编写的自定义函数应该具有完全的管理权限。

HAL9256的另一个答案很好,但它描述了JEA的好处,这不是本文的主题。

我不会说这是一个安全漏洞,而是你清楚地展示了当你没有设置完全安全的配置时,系统上会发生什么。微软甚至表示,JEA不保护管理员,因为";他们可以简单地RDP并改变配置";。我们需要SessionTypeRoleDefinitions的正确组合,并且它们适用于两种不同的配置。

您的示例演示了一个配置设置,即使我们锁上了房子的前门,我们还是从一个所有门窗都打开的房子开始。完全可以从后门进入,或者通过窗户打开前门,从而证明锁前门是徒劳的。例如,我不需要运行net stop,我可以只运行taskkill,或者。。。,或等

让我们来看看JEA的设计目的:

  • 减少计算机上的管理员数量使用虚拟帐户或组管理服务帐户代表常规用户执行特权操作
  • 通过指定用户可以运行的cmdlet、函数和外部命令来限制用户可以执行的操作
  • 更好地了解您的用户正在做什么使用转录本和日志,可以准确地显示用户在会话期间执行的命令

减少管理员数量

我们可以使用JEA从本地管理员组或更大的域管理员组中删除人员。然后,他们可以在需要时通过虚拟帐户选择性地获得提升的管理员权限。

如果我们用SessionType = 'Default'设置它,这将启用所有语言功能。我们基本上可以有一个Jr.技术分析师,没有域管理员权限,没有本地管理员权限,登录并履行管理职责。这就是会话类型的作用。

限制用户可以执行的操作

如果我们用SessionType = 'Default'设置它,这将启用所有语言功能。在模式中,我们限制什么命令并不重要,所有的门窗都是打开的,我们几乎可以随心所欲。Windows中的一条规则是,做某事总是有3-4种不同的方法。当一切都敞开的时候,你不可能把所有的洞都堵住。

@MathiasR.Jessen是对的,限制用户所能做的事情的唯一方法就是首先锁定系统。设置SessionType = 'RestrictedRemoteServer'将会话锁定为:

此类型的会话在NoLanguage模式下运行,并且只能访问到以下默认命令(和别名):

  • 清除主机(cls,Clear)
  • 退出PSSession(exsn,退出)
  • 获取命令(gcm)
  • 获取格式数据
  • 获取帮助
  • 度量对象(Measure)
  • 输出默认值
  • 选择对象(选择)

没有可用的PowerShell提供程序,也没有任何外部程序(可执行文件或脚本)。

这让我们从一个完全锁着的房子开始。然后,我们有选择地启用所需的命令。理想情况下,我们应该预先创建自定义函数,以便自定义函数是他们唯一可以运行的,从技术上讲,他们甚至根本不允许执行函数内的命令,这一切都由虚拟帐户处理。

您所做的基本上是利用这种自定义功能;欺骗;并创造我们自己的";自定义函数";它将在虚拟帐户范围内运行,而不是您自己的,这就是为什么它能够运行";不允许的";函数,而您不是。如果SessionType = 'RestrictedRemoteServer',您将无法创建脚本或自定义函数,如演示的,因此;"洞";不会在那里。

更好地了解用户在做什么

最后,JEA的另一个好处是,它可以记录所有运行的命令的转录本。这可能是出于审计原因而需要的,或者被输入SIEM解决方案,或者是为了了解Jr.技术分析师是如何破坏您的系统的;-)。

最新更新