信息安全 当前位置: 网站首页 >> 信息安全 >> 正文 >

PowerShell远程管理功能中的安全问题

发布时间:2016-04-29 浏览次数:

利用PowerShell远程管理功能来管理Windows系统是官方推荐的一种操作方式。在默认配置下,Windows Server 2012 R2会自动启用PowerShell远程管理功能。我们在这篇文章中,将会对PowerShell远程管理功能中存在的安全问题进行讨论,并会给出安全研究专家们的建议,广大用户在阅读完本文章之后,将会了解到如何才能够更好地在生产实践中使用PowerShell远程管理功能。

PowerShell远程管理是什么?

PowerShell远程管理功能使用的是Windows的远程管理组件(WinRM),通过这项功能,用户可以在远程计算机中执行PowerShell命令。除此之外,你可以在执行远程控制命令的时候了解到更多关于如何使用PowerShell远程管理功能的信息。

PowerShell远程管理功能与单纯的命令行工具不同,它不会使用计算机名称作为操作参数,它使用的是远程过程调用协议(RPC)来作为其底层的操作协议。

PowerShell远程管理中的默认设置

PowerShell远程管理(包括WinRM在内)会对下列端口进行监听:

HTTP: 5985

HTTPS: 5986

默认设置下,PowerShell远程管理仅允许目标计算机系统管理员组中的成员进行连接。发起的会话连接也会根据用户的操作环境进行相应地改变。

在私人网络环境中,Windows防火墙默认会允许PowerShell远程管理功能接收所有的通信链接请求。在公共网络环境下,Windows防火墙在默认仅允许同一子网中的用户与PowerShell远程管理功能进行连接。所以,如果我们需要在公共网络环境下使用PowerShell远程管理功能,那么就必须修改系统防火墙的规则。

警告:针对公共网络环境的防火墙规则能够保护计算机不受外部恶意链接的攻击,当我们需要修改相应的防火墙规则时,一定要注意。

进程隔离

在计算机之间的通信过程中,PowerShell远程管理使用了Windows远程管理组件(WinRM)WInRMWindows操作系统利用网络服务账号运行的服务,并且在操作系统的运行过程中,系统会使用一个单独的进程来加载PowerShell实例。在一个正在运行的PowerShell实例中,用户不能够访问另一名用户所运行的PowerShell实例。

PowerShell远程管理生成的事件日志

关于事件日志和其他由PowerShell远程管理会话所生成的安全信息,FireEye公司已经提供了非常详细的资料,感兴趣的用户可以在这篇标题为“PowerShell的攻击调查”的文章中获取到更多的信息。

加密技术和传输协议

我们可以从以下两个方面来考虑PowerShell远程连接的安全性:初始认证和持续通信。

暂且不论PowerShell远程管理功能使用的是HTTP协议还是HTTPS协议,PowerShell总是会对所有的通信数据进行加密处理。在系统通过了初始认证之后,PowerShell会使用AES-256对称密钥来对通信数据进行加密。

初始认证

服务器会对用户的身份进行认证,并且在理想情况下,用户也可以对服务器的合法性进行验证。

当用户使用计算机名称(例如server01,或者server01.contoso.com)来与域名服务器进行连接时,Kerberos为其默认使用的认证协议。Kerberos认证协议可以在不发送任何可重复使用的证书的情况下,对客户端和服务器端的身份进行验证。

Kerberos 是一种网络认证协议,其设计目标就是通过密钥系统为客户端和服务器端的应用程序提供强大的认证服务。该认证过程的实现不依赖于主机操作系统的认证,无需基于主机地址的信任,不要求网络上所有主机物理层面上的安全,并且它会默认假定网络上传送的数据包可以被任意地读取、修改和插入数据。在以上情况下, Kerberos 作为一种可信任的第三方认证服务,是通过传统的密码技术(:共享密钥)执行认证服务的。

具体的认证过程如下:客户机向认证服务器(AS)发送请求,要求得到某服务器的证书,然后 AS 的响应信息包含这些用客户端密钥加密的证书。证书的构成为: 1) 服务器 “ticket ; 2) 一个临时加密密钥(又称为会话密钥 “session key) 。客户机将 ticket (包括用服务器密钥加密的客户机身份和一份会话密钥的拷贝)传送到服务器上。会话密钥可以(现已经由客户机和服务器共享)用来认证客户机或认证服务器,也可用来为通信双方以后的通讯提供加密服务,或通过交换独立子会话密钥为通信双方提供进一步的通信加密服务。

如果用户使用IP地址来与域名服务器或者工作组服务器进行连接时,使用Kerberos认证协议来进行身份验证也并非难事。在这种情况下,PowerShell远程管理使用的是NTLM认证协议。NTLM认证协议可以在不发送任何代理证书的情况下,对用户的身份进行验证。为了验证用户的身份信息,NTLM协议将会需要客户端和服务器在不改变用户密码的情况下,共同利用用户密码计算出通信会话所需的密钥。

通常情况下,服务器是不知道用户密码的,而域名控制器知道用户的密码,所以它会与域名控制器进行通信,并且计算出相应的会话密钥。

但是,NTLM协议并不能验证服务器的有效身份。对于所有利用NTLM协议来进行身份验证的协议而言,如果攻击者能够访问已加入同一个域中的计算机账号,那么他就可以调用域名控制器来计算NTLM协议的会话密钥了。这也就意味着,这名攻击者可以搭建一台伪造的服务器来进行下一步的攻击。

大多数情况下,基于NTLM协议的身份认证功能是默认禁用的,但是我们可以通过配置WinRM或者修改服务器的相关设置来进行相应的修改。

在基于NTLM的通信连接中使用SSL证书来验证服务器的身份

既然NTLM身份认证协议不能够保证目标服务器身份的真实性,那么我们就可以配置一台使用SSL证书来进行身份验证的目标服务器。为目标服务器分配一个SSL证书,然后启用NTLM认证协议来对客户端和服务器的身份进行验证。

默认情况下,PowerShell远程控制会使用Kerberos协议(如果条件允许)或者NTLM协议来进行身份验证。这两个协议都可以在不向远程服务器发送证书的情况下,对客户端和服务器进行身份验证。

持续通信

当系统完成了初始认证之后,PowerShell远程控制协议会利用AES-256对称密钥来对所有正在通信的数据进行加密处理。


版权所有:长春工程学院现代教育技术中心(信息化建设办公室)