26.11.2015

Приемы работы с удаленными системами через PowerShell

image

Я часто работаю с командами на удаленных системах через 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 открывают огромные возможности, как для администраторов, так и для пентестеров. Вне зависимости от ситуации, как вы будете работать с удаленными системами, все сводится к следующему:

  • Для запуска одиночной команды на удаленной системе используйте "Invoke-Command".
  • Для взаимодействия с одиночной системой используйте "Enter-PSSession".
  • Если вы хотите запускать множество команд во множестве систем, используйте фоновые сессии.

Надеюсь, эта статья оказалась для вас полезной.

Ссылки