PowerShell Remoting本质上是一种原生的Windows远程命令执行功能,它是建立在Windows远程管理(WinRM)协议之上。根据我的谷歌的结果,Windows Vista Service Pack 1或更高版本,Windows7和Windows Server2008和Windows Server2012操作系统都带有WinRM。
启用PowerShell Remoting
在开始使用之前,我们要确保PowerShell Remoting已经在你的电脑上配置成功。
在PowerShell命令行中以管理员身份运行。
Enable-PSRemoting –force
这已经足够了,如果遇到问题的话,运行以下命令确保WinRM服务已经设置好自动启动。
Set-Service WinRM -StartMode Automatic
Get-WmiObject -Class win32_service | Where-Object {$_.name -like "WinRM"}
设置远程所有主机为信任主机。
Set-Item WSMan:localhostclienttrustedhosts -value *
Get-Item WSMan:localhostClientTrustedHosts
使用PowerShell Remoting执行远程命令
在远程主机中执行单条命令。
Invoke-Command命令能够用来在远程主机上执行命令。它可以以当前用户身份来运行,或者是使用一个非域主机的一个伪造的令牌。命令在下面。
Invoke-Command –ComputerName MyServer1 -ScriptBlock {Hostname}
Invoke-Command –ComputerName MyServer1 -Credentials demoserveradmin -ScriptBlock {Hostname}
如果ActiveDirectory PowerShell模块已经被安装了,那就有可能使用管道在许多主机上快速的执行命令。以下是一个基本的例子。
Get-ADComputer -Filter * -properties name | select @{Name="computername";Expression={$_."name"}} | Invoke-Command -ScriptBlock {hostname}
有的时候,在远程主机上运行本地存储的脚本是不错的选择。
Invoke-Command -ComputerName MyServer1 -FilePath C:pentestInvoke-Mimikatz.ps1
Invoke-Command -ComputerName MyServer1 -FilePath C:pentestInvoke-Mimikatz.ps1 -Credentials demoserveradmin
另外,如果您的动态生成的命令或函数被传递到远程系统,您可以使用调用表达式调用执行命令,如下图所示。
$MyCommand = "hostname"
$MyFunction = "function evil {write-host `"Getting evil...`";iex -command $MyCommand};evil"
invoke-command -ComputerName MyServer1 -Credentials demoserveradmin -ScriptBlock {Invoke-Expression -Command "$args"} -ArgumentList $MyFunction
在远程系统上建立一个交互的PowerShell控制台
一个交互式的powershell命令行能够通过Enter-PsSession命令来获得。有点像ssh的样子。类似"Invoke-Command", "Enter-PsSession"这些命令能够以当前用户的身份运行,或者是使用一个非域主机的一个伪造的令牌。命令在下面。
Enter-PsSession –ComputerName server1.domain.com
Enter-PsSession –ComputerName server1.domain.com –Credentials domainserveradmin
如果你想要退出powershell会话,那么执行
Exit-PsSession
创建一个后台会话
PowerShell Remoting另外一个比较帅气的命令是如果运行New-PsSession这条命令,能够让用户创建一个后台运行的会话。如果你想对多个系统执行命令的话,那么后台运行的会话能够派上用场。
类似"New-PsSession"这条命令能够以当前用户的身份运行,或者是使用一个非域主机的一个伪造的令牌。命令在下面。
New-PSSession -ComputerName server1.domain.com
New-PSSession –ComputerName server1.domain.com –Credentials domainserveradmin
如果ActiveDirectory PowerShell模块已经被安装了,那就有可能会在多个系统上创建后台会话(方法有很多)。下面这条命令是如何在所有的域主机中创建后台会话。这条命令能够以当前用户的身份运行,或者是使用一个非域主机的一个伪造的令牌。
New-PSDrive -PSProvider ActiveDirectory -Name RemoteADS -Root "" -Server a.b.c.d -credential domainuser
cd RemoteADS:
Get-ADComputer -Filter * -Properties name | select @{Name="ComputerName";Expression={$_."name"}} | New-PSSession
列出所有的后台会话
使用Get-PsSession命令能够列出所有确定了的后台会话。
与后台会话交互
最开始的时候,我使用类似metasploit的获取会话的方式,当时这种方式只有一小部分是稳定的。下面的命令是如何使用一个会话id与一个活动的会话进行交互。
Enter-PsSession –id 3
通过后台会话执行命令
如果你的目的是在所有的活动会话上执行命令。那么"Invoke-Command" 和 "Get-PsSession"能够一起使用。
Invoke-Command -Session (Get-PSSession) -ScriptBlock {Hostname}
移除后台会话
最后,你可以通过Disconnect-PsSession命令移除所有的活动会话。
原文来自:https://blog.netspi.com/powershell-remoting-cheatsheet/
翻译:小歪
本文始发于微信公众号(关注安全技术):PowerShell Remoting笔记
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论