Я часто работаю с командами на удаленных системах через PowerShell как во время пентестов, так и при решении повседневных задач. Запуска удаленных команд происходит через протокол WinRM (Windows Remote Management), который, насколько мне известно, поддерживается в Windows Vista SP 1, Windows 7, Windows Server 2008 и Windows Server 2012.
Автор: Scott Sutherland
Введение
Я часто работаю с командами на удаленных системах через PowerShell как во время пентестов, так и при решении повседневных задач. Запуска удаленных команд происходит через протокол WinRM (Windows Remote Management), который, насколько мне известно, поддерживается в Windows Vista SP 1, Windows 7, Windows Server 2008 и Windows Server 2012.
Первоначальные настройки
Перед тем как начать работу с удаленной системой, необходимо выполнить настройку.
1. Запустите консоль PowerShell от имени администратора и выполните следующую команду:
Enable-PSRemoting –force
Команда выше разрешает запуск команд на удаленных системах. Если у вас возникли проблемы, используйте команды ниже:
2. Убедитесь в том, что служба WinRM запускается автоматически.
# Устанавливаем нужный режим
Set-Service WinRM -StartMode Automatic
# Проверяем, что служба запущена
Get-WmiObject -Class win32_service | Where-Object {$_.name -like "WinRM"}
3. Устанавливаем у всех хостов статус «достоверный» (можно сделать позже).
# Доверяем всем хостам
Set-Item WSMan:localhost\client\trustedhosts -value *
# Проверяем настройку достоверных хостов
Get-Item WSMan:\localhost\Client\TrustedHosts
Примеры работы с удаленными системами
Перед ознакомлением с примерами рекомендую вам прочитать прекрасную статью, посвященную работе с удаленными командами в PowerShell.
Запуск одиночной команды на удаленной системе
Команда "Invoke-Command" предназначена для запуска команд на удаленных системах. Можно работать от имени текущего пользователя, либо использовать стороннюю учетную запись, если вы работаете в системе, которая не является частью домена:
Invoke-Command –ComputerName MyServer1 -ScriptBlock {Hostname}
Invoke-Command –ComputerName MyServer1 -Credentials demo\serveradmin -ScriptBlock {Hostname}
Если установлен модуль для работы с ActiveDirectory, становится возможным запуск команд на множестве систем при помощи каналов (pipeline):
Get-ADComputer -Filter * -properties name | select @{Name="computername";Expression={$_."name"}} |
Invoke-Command -ScriptBlock {hostname}
Иногда на удаленной системе требуется запустить скрипт, хранящийся локально:
Invoke-Command -ComputerName MyServer1 -FilePath C:\pentest\Invoke-Mimikatz.ps1
Invoke-Command -ComputerName MyServer1 -FilePath C:\pentest\Invoke-Mimikatz.ps1 -Credentials demo\serveradmin
Если вы генерируете команды или функции динамически, которые затем передаются на удаленную систему можно использовать связку команд invoke-expression и invoke-command:
$MyCommand = "hostname"
$MyFunction = "function evil {write-host `"Getting evil...`";iex -command $MyCommand};evil"
invoke-command -ComputerName MyServer1 -Credentials demo\serveradmin -ScriptBlock
{Invoke-Expression -Command "$args"} -ArgumentList $MyFunction
Организация интерактивной консоли на удаленной системе
Организовать интерактивную консоль в PowerShell на удаленной системе можно при помощи команды "Enter-PsSession" (немного похожа на SSH). Команда "Enter-PsSession" также запускается либо от имени текущего пользователя, либо при помощи альтернативной учетной записи:
Enter-PsSession –ComputerName server1.domain.com
Enter-PsSession –ComputerName server1.domain.com –Credentials domain\serveradmin
Закрытие сессии выполняется при помощи команды "Exit-PsSession":
Exit-PsSession
Создание фоновых сессий
Еще одна полезная возможность позволяет создавать фоновые сессии (команда "New-PsSession"). Фоновые сессии могут оказаться полезны при запуске множества команд во множестве систем. Как и предыдущие команды, команда "New-PsSession" запускается от имени текущего пользователя, либо при помощи альтернативной учетной записи:
New-PSSession -ComputerName server1.domain.com
New-PSSession –ComputerName server1.domain.com –Credentials domain\serveradmin
Если установлен модуль для работы с ActiveDirectory, становится возможным единовременное создание фоновых сессий для множества систем (этот трюк можно выполнить различными способами). Ниже показан пример создания фоновых сессий для всех систем, входящих в домен. В примере создание сессий происходит в системе, не входящей в домен, при помощи альтернативной учетной записи домена.
New-PSDrive -PSProvider ActiveDirectory -Name RemoteADS -Root "
" -Server a.b.c.d -credential domain\user
cd RemoteADS:
Get-ADComputer -Filter * -Properties name | select @{Name="ComputerName";Expression={$_."name"}}
| New-PSSession
Вывод перечня фоновых сессий
Как только создано несколько фоновых сессий, можно просмотреть их перечень при помощи команды "Get-PsSession".
Get-PSSession
Взаимодействие с фоновыми сессиями
Первое время у меня было ощущение схожее с тем, как я работал с сессиями в MetaSploit. Однако фоновые сессии в PowerShell чуть более стабильны. Ниже показан пример взаимодействия при помощи идентификатора сессии:
Enter-PsSession –id 3
Для выхода из сессии используйте команду "Exit-PsSession". Сессия перейдет обратно в фоновый режим.
Exit-PsSession
Запуск команд через фоновые сессии
Если вы хотите выполнить команду во всех активных сессиях, используйте связку команд "Invoke-Command" и "Get-PsSession".
Invoke-Command -Session (Get-PSSession) -ScriptBlock {Hostname}
Удаление фоновых сессий
Для удаления всех активных сессий используйте команду "Disconnect-PsSession"
Get-PSSession | Disconnect-PSSession
Заключение
Удаленные команды в PowerShell открывают огромные возможности, как для администраторов, так и для пентестеров. Вне зависимости от ситуации, как вы будете работать с удаленными системами, все сводится к следующему:
Надеюсь, эта статья оказалась для вас полезной.
Ссылки
Если вам нравится играть в опасную игру, присоединитесь к нам - мы научим вас правилам!