Удаленное управление через Powershell

PowerShell Remoting — настройка и удаленное управление

Здесь минимум теории, в основном практическая часть. Описывается как настроить WinRM, как изменить профиль сетевого адаптера, дается скрипт по добавлению в TrustedHosts с фильтрацией, объясняется зачем нужны доверенные хосты, и рассматриваются поверхностно удаленные подключения так чтобы можно было сесть и сразу админить удаленные машины.

  • запустится служба WinRM (если запущена перезапустится)
  • служба WinRM перейдет в состояние — автоматический запуск при старте
  • будет создан прослушиватель WinRM для HTTP трафика на порту 5985 для всех локальных IP адресов
  • будет создано правило файрвола для прослушивателя WinRM. Внимание, этот пункт завершится с ошибкой если любая из сетевых карточек имеет тип сети «публичная», т.к. открывать порт на такой карточке не хорошо. Если у вас при конфигурировании вышла такая ошибка измените профиль это сетевушки командлетом Set-NetConnectionProfile и после этого запустите Enable-PSRemoting снова. Если вам нужна сетевая карточка с профилем «Публичная сеть» запустите Enable-PSRemoting с параметром -SkipNetworkProfileCheck в этом случае будут созданы правила файрвола только из локальной сети.

для проверки куда можно подключаться используем:

для разрешения подключаться ко всем

Если вы открываете доступ для всех указав * то WinRM будет подключаться ко ВСЕМ машинам без проверки. Помните, что вы открываете самого себя для потенциального взлома из локальной сети. Лучше указывать адреса хостов куда вам нужно подключится, тогда WinRM будет отклонять все остальные адреса или имена. Если машина с которой ведется управление находится в домене она будет доверять всем машинам этого домена. Если она не в домене, или в другом домене, то нужно указать в TrustedHosts адрес или имя машины на которую мы будем подключаться. Добавлять себя на машине к которой мы подключаемся не нужно.

в хелпе указаны команды, я их чуть чуть переделал в скрипт

он проверяет на есть ли такая запись, если нет то добавляет в список. Вызывать можно из командной строки указав адрес или имя.

Есть разница указывать имя или адрес. Если в TrustedHosts будет только адрес то открыть сессию по имени не получится, и наоборот — если указать имя то прицепится по адресу не получится. Учитывайте это.

Часто встречается ссылка на команду

это не тоже самое что Enable-PSRemoting

Enable-PSRemoting делает больше действий чем «winrm quickconfig». Командлет Set-WSManQuickConfig делает точно такие же действия как «winrm quickconfig». Enable-PSRemoting запускает Set-WSManQuickConfig когда ведет настройку системы

  1. запускат WinRM сервис
  2. устанавливает автостарт службы WinRM в автоматический
  3. создает прослушиватель
  4. добавляет исключения файрвола
  1. включает все зарегистрированные конфигурации сессий PowerShell для получения инструкций от удаленных машин
  2. регистрирует конфигурацию если она не зарегистрирована «Microsoft.PowerShell»
  3. регистрирует конфигурацию если она не зарегистрирована «Microsoft.PowerShell32» на 64 битных машинах
  4. убирает запрет «Deny Everyone» из дескриптора безопасности всех конфигураций сессий
  5. перезапускает сервис WinRM

Удаленные подключения
1. Сессии 1-to-1
открываются командой

Вы получите оболочку на удаленной машине. Подключится можно к самому себе указав localhost. Альтернативные кредиталы указываются с параметром -Credential, выход происходит командлетом Exit-PSSession

  • нельзя сделать второй прыжок — только 1 сессия, внутри сессии подключиться дальше нельзя
  • вы не можете использовать команды имеющие графический интерфейс. Если вы это сделаете оболочка повиснет, нажмите Ctrl+C чтобы отвисло
  • вы не можете запускать команды имеющие свой собственый шел, например nslookup, netsh
  • вы можете запускать скрипты если политика запуска на удаленной машине позволяет их запускать
  • нельзя прицепится к интерактивной сессии, вы заходите как «network logon», как будто прицепились к сетевому диску. Поэтому не запустятся логон скрипты, и вы можете не получить домашнюю папку на удаленной машине (лишний довод чтобы не мапать хом фолдеры логон скриптами)
  • вы не сможете взаимодействовать с юзером на удаленной машине даже если он туда залогинен. Не получится показать ему окошко или попечатать чтонибудь ему.

Комментарий.
объекты переданные по сети обрезаются и перестают быть живыми. У них удаляются методы, свойства остаются. Вытащить объект на свою машину, поколдовать и засунуть обратно не получится. Если нужно больше пишите, допишу отдельно.

2. Сессии 1-to-many

определяем что будем исполнять так:

передаем на удаленные машины Test1 и Test2

за раз можно забросить на 32 машины. Если альтернативные кредиталы то используем параметр -Credential

Чтобы передать целиком скрипт вместо параметра -ScriptBlock пишем -FilePath, удаленной машине НЕ нужно иметь доступ к файлу, он будет разобран на запчасти, передан через HTTP и выполнен с той стороны.

Запомним что на той стороне будет новый скоп, так что ваш скрипт не получит значений из вашей консоли, а переменные скрипта могут оказаться на той стороне пустыми. Поэтому передавайте сразу целиком готовые инструкции и скрипты с параметрами.

для полноценного использования Invoke-Command надо уметь превращать строки в скрипт блоки. Например у вас есть команды которые зависят от какогото списка, вам нужно сгенерировать строку, превратить ее в ScriptBlock и отправить на удаленный комп:

kuda78
В статье пропущен очень важный момент — передача параметров в скрипт на удаленной машине.

$deployRemote = param(
[string]$targetEnvName,
[string]$targetUsername)
$Global:ErrorActionPreference = «Stop»
#…
>

Invoke-Command -Session $session -ScriptBlock $deployRemote -ArgumentList ($targetEnvName, $targetUsername)

Да действительно пропущен. Сделал сознательно чтобы не загромождать обзор параметрами и описаниями. Спасибо. Параметр -ArgumentList работает как со скрипт блоками так и со сценариями

3. Сессии
Это когда с той стороны создается копия пошика постоянно висящая в памяти, и в нее отправляются команды. Как результат к ней можно переподключится, ченить долгое запустить на исполнение, цепляться из разных скриптов или разными юзерами. Например у вас есть набор скриптов решающих одну задачу по частям, каждый из них поочереди может подключатся к одной удаленной сессии, видеть результаты работы предыдущих команд, иметь одни загруженные модули, общие переменные, общее окружение, до тех пор пока сессия не будет принудительно закрыта.

Создание сессии происходит командлетом New-PSSession, результат можно поместить в переменную

использовать можно такие же параметры подключения как в Invoke-Command

Как использовать:
если 1-to-1

посмотреть какие сессии открыты можно с помощью Get-PSSession, закрыть Remove-PSSession
закрыть вообще все сессии

прицепится к сессии можно с помощью Connect-PSSession, отключиться через Disconnect-PSSession

Invoke-Command может создать сразу disconnected сессию, он отправляет команды на исполнение и отключатся, позже можно подключится и сгрузить результаты работы. Делается это параметром -Disconnected. Получение результатов через командлет Recieve-PSSession.

Сессии имеют очень много настроек, возможно даже создание сессий с обрезаным набором команд, модулей и т.п. Называется custom endpoints

Удаленное управление через Powershell

Как в Powershell подключиться к удаленному компьютеру

В Powershell есть несколько методов удаленного подключения. Это через:

Сегодня мы поговорим о PS remoting/WinRM. В его состав входит, в основном, два командлета — это:

Этот командлет устанавливает сессию c удаленным компьютером и мы сможем работать прям на нем. Если сравнивать с Linux, то это почти одно и то же:

И второй командлет, который нужен для удаленного выполнения команд как на одном, так и сотни компьютеров:

Где:
-ComputerName — имена компьютеров (или одного)
-Scriptblock — скрипт или командлет в скобках <>

Если опять же сравнить с Linux ssh, то это почти одно и то же:

Как настроить удаленное управление через Powershell?

Для того что бы суметь настроить нужно понять как это работает. Команды выше могут работать по протоколу HTTP (по порту 5985) и HTTPS (5986), за исключением версии Powershell 1.0, который работал в XP (там порт 80/443). По умолчанию у нас стоит HTTP, но и эти данные шифруются используя симметричный ключ AES-256. Сама аутентификация работает в 2 режимах NTLM и Kerberos(по умолчанию стоит он). Если у вас сеть с домен контроллером, т.е. есть Kerberos, то у вас должны работать команды выше. Если компьютеры в Workgroup, то они используют NTLM и для этого нужна дополнительная настройка. Кроме того, если вы вместо имен используете IP, то вы в любом случае используете NTLM и это по умолчанию не работает.

Если у вас не работают команды выше нужно проверить запущен ли сервис WinRM на том компьютере, к которому мы хотим подключиться:

Если не запушен:

В этом случае мы ставим запуск сервиса автоматически и настраиваем winrm в дефолтной конфигурации. Этот сервис дает возможность принимать команды Powershell и устанавливать сеансы.

Если вы работаете под профилем сети «Public» (не «Domain» или «Private»), то нужно выполнить еще один командлет, разрешающий работать в таких сетях:

Если мы выполним такую команду:

Получим ошибку:
Connecting to remote server 192.168.3.100 failed with the following error message : The WinRM client cannot process the request. Default authentication may be used with an IP address under the following conditions: the transport is HTTPS or the destination is in the TrustedHosts list, and explicit credentials are provided.

Которая говорит, что мы можем подключится по IP если используем HTTPS (для этого нужен сертификат) или добавить хост, к которому подключаемся в TrustedHost компьютера с которого хотим запустить команду. Для этого делаем:

После этого все будет работать, но команды должны исполняться с переменной, в которой будут лежать учетные данные пользователя. Т.е. так:

Где:
$cred — это переменная, куда мы сохраняем данные с формы Get-Credential
-Credential — сюда мы передаем переменную

Так же отмечу, что все команды, которые мы запускаем для удаленного выполнения через Poweshell, должны происходить от члена группы Администратора того хоста, к которому мы подключаемся.

Теперь мы можем устанавливать множество сессий с помощью командлета:

Получать ID этих сессий:

И подключаться по этим ID:

Или использовать с invoke существующую сессию, а командлет для удаленного компьютера запускать с файла:

А так же, т.к. WinRM настроен, выполнять командлеты где есть ключ -ComputerName, сразу на нескольких компьютерах. Этот командлет пропингует AD сразу с нескольких компьютеров:

Работа с удаленными сессиями Powershell

Не так давно пришлось потратить немного времени на настройку удаленного доступа через Powershell. Мне такой подход кажется очень хорошей альтернативной Remote Desktop Services в ряде случаев (перезапустить сервис на удаленном хостинге VDS, сделать резервные копии, посмотреть состояние системы и т.д.).

Возможность создания удаленных сеансов Powershell появилась в версии 2. Для этого используется командлет Enter-PSSession / Invoke-Command . Однако, перед их использованием следует подготовить среду.

Что делаем на сервере:

Шаг 1: Открываем консоль Powershell и разрешаем удаленные сессии командлетом Enable-PSRemoting с ключом Force .

Шаг 2: Убеждаемся в том, что служба WinRM запущена.

Шаг 3: Настраиваем правила в брэндмауэре, чтобы входящие подключения были возможны.

На компьютере, который будет использоваться как клиентский тоже необходимо выполнить несколько действий:

Шаг 1: Разрешить подключение к удаленным узлам. Для доступа к любым узлам можно воспользоваться следующей конструкцией:

Шаг 2: Убедиться, что брэндмауэр не блокирует исходящие соединения.

Теперь для подключения к удаленному узлу через Powershell можно осуществлять так:

Значения 192.168.1.160 и VMNAMEUser необходимо заменить адресом удаленного узла и именем пользователя Windows на сервере.

Теперь удаленный доступ через Powershell работает. Однако, есть еще один ньюанс. Возможно, кто-либо из вас пользуется профилями в Powershell. Профили – это специальные скрипты, которые запускаются при запуске самой консоли. Здесь, например, можно определить все необходимые алиасы и выполнить предварительные действия.

Проблема заключается в том, что профили не запускаются при использовании удаленных сеансов. Решить это можно путем использования разных конфигураций подключения. Для этого первоначально необходимо зарегистрировать конфигурацию на удаленном сервере. Сделать это можно путем выполнения коммандлета Register-PSSessionConfiguration . При этом каждой конфигурации присваивается имя. Для каждой конфигурации можно задать путь до скрипта, который будет выполняться при старте сессии.

После этого, при подключении к удаленному узлу, при использовании коммандлета Enter-PSSession следует указать имя конфигурации.

Теперь можно не тратить ресурсы сервера на создание сессии подключения через Remote Desktop Services и удаленно управлять сервером, используя Powershell.

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

Я часто работаю с командами на удаленных системах через PowerShell как во время пентестов, так и при решении повседневных задач. Запуска удаленных команд происходит через протокол WinRM (Windows Remote Management), который, насколько мне известно, поддерживается в Windows Vista SP 1, Windows 7, Windows Server 2008 и Windows Server 2012.

image

Автор: Scott Sutherland

Я часто работаю с командами на удаленных системах через PowerShell как во время пентестов, так и при решении повседневных задач. Запуска удаленных команд происходит через протокол WinRM (Windows Remote Management), который, насколько мне известно, поддерживается в Windows Vista SP 1, Windows 7, Windows Server 2008 и Windows Server 2012.

Первоначальные настройки

Перед тем как начать работу с удаленной системой, необходимо выполнить настройку.

1. Запустите консоль PowerShell от имени администратора и выполните следующую команду:

Команда выше разрешает запуск команд на удаленных системах. Если у вас возникли проблемы, используйте команды ниже:

2. Убедитесь в том, что служба WinRM запускается автоматически.

# Устанавливаем нужный режим

Set-Service WinRM -StartMode Automatic

# Проверяем, что служба запущена

Get-WmiObject -Class win32_service | Where-Object

3. Устанавливаем у всех хостов статус «достоверный» (можно сделать позже).

# Доверяем всем хостам

Set-Item WSMan:localhostclienttrustedhosts -value *

# Проверяем настройку достоверных хостов

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

Перед ознакомлением с примерами рекомендую вам прочитать прекрасную статью, посвященную работе с удаленными командами в PowerShell.

Запуск одиночной команды на удаленной системе

Команда «Invoke-Command» предназначена для запуска команд на удаленных системах. Можно работать от имени текущего пользователя, либо использовать стороннюю учетную запись, если вы работаете в системе, которая не является частью домена:

Invoke-Command –ComputerName MyServer1 -ScriptBlock
Invoke-Command –ComputerName MyServer1 -Credentials demoserveradmin -ScriptBlock

Если установлен модуль для работы с ActiveDirectory, становится возможным запуск команд на множестве систем при помощи каналов (pipeline):

Get-ADComputer -Filter * -properties name | select @> |
Invoke-Command -ScriptBlock

Иногда на удаленной системе требуется запустить скрипт, хранящийся локально:

Invoke-Command -ComputerName MyServer1 -FilePath C:pentestInvoke-Mimikatz.ps1
Invoke-Command -ComputerName MyServer1 -FilePath C:pentestInvoke-Mimikatz.ps1 -Credentials demoserveradmin

Если вы генерируете команды или функции динамически, которые затем передаются на удаленную систему можно использовать связку команд invoke-expression и invoke-command:

$MyCommand = «hostname»
$MyFunction = «function evil ;evil»
invoke-command -ComputerName MyServer1 -Credentials demoserveradmin -ScriptBlock
-ArgumentList $MyFunction

Организация интерактивной консоли на удаленной системе

Организовать интерактивную консоль в PowerShell на удаленной системе можно при помощи команды «Enter-PsSession» (немного похожа на SSH). Команда «Enter-PsSession» также запускается либо от имени текущего пользователя, либо при помощи альтернативной учетной записи:

Enter-PsSession –ComputerName server1.domain.com
Enter-PsSession –ComputerName server1.domain.com –Credentials domainserveradmin

Закрытие сессии выполняется при помощи команды «Exit-PsSession»:

Создание фоновых сессий

Еще одна полезная возможность позволяет создавать фоновые сессии (команда «New-PsSession»). Фоновые сессии могут оказаться полезны при запуске множества команд во множестве систем. Как и предыдущие команды, команда «New-PsSession» запускается от имени текущего пользователя, либо при помощи альтернативной учетной записи:

New-PSSession -ComputerName server1.domain.com
New-PSSession –ComputerName server1.domain.com –Credentials domainserveradmin

Если установлен модуль для работы с ActiveDirectory, становится возможным единовременное создание фоновых сессий для множества систем (этот трюк можно выполнить различными способами). Ниже показан пример создания фоновых сессий для всех систем, входящих в домен. В примере создание сессий происходит в системе, не входящей в домен, при помощи альтернативной учетной записи домена.

New-PSDrive -PSProvider ActiveDirectory -Name RemoteADS -Root »
» -Server a.b.c.d -credential domainuser
cd RemoteADS:
Get-ADComputer -Filter * -Properties name | select @>
| New-PSSession

Вывод перечня фоновых сессий

Как только создано несколько фоновых сессий, можно просмотреть их перечень при помощи команды «Get-PsSession».

Взаимодействие с фоновыми сессиями

Первое время у меня было ощущение схожее с тем, как я работал с сессиями в MetaSploit. Однако фоновые сессии в PowerShell чуть более стабильны. Ниже показан пример взаимодействия при помощи идентификатора сессии:

Enter-PsSession –id 3

Для выхода из сессии используйте команду «Exit-PsSession». Сессия перейдет обратно в фоновый режим.

Запуск команд через фоновые сессии

Если вы хотите выполнить команду во всех активных сессиях, используйте связку команд «Invoke-Command» и «Get-PsSession».

Invoke-Command -Session (Get-PSSession) -ScriptBlock

Удаление фоновых сессий

Для удаления всех активных сессий используйте команду «Disconnect-PsSession»

Удаленные команды в PowerShell открывают огромные возможности, как для администраторов, так и для пентестеров. Вне зависимости от ситуации, как вы будете работать с удаленными системами, все сводится к следующему:

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

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

Один хакер может причинить столько же вреда, сколько 10 000 солдат! Подпишись на наш Телеграм канал, чтобы узнать первым, как выжить в цифровом кошмаре!

Powershell: использование командлета Invoke-Command

На сегодняшний день PowerShell Remoting является основным инструментом удаленного управления операционными системами Windows. Поэтому, знать о его возможностях и использовать в своих повседневных задачах должен каждый системный администратор Windows. Для запуска команд на удаленных компьютерах с помощью PowerShell Remoting, можно использовать командлет Powershell Invoke-Command (псевдоним icm).

Функционал командлета Invoke-Command основан на протоколе Web Services for Management (WS-Management) и службе Windows Remote Management (WinRM), используемой для связи. Связь между компьютерами выполняется по протоколу HTTP (по умолчанию) или HTTPS. Весь трафик между двумя компьютерами зашифрован на уровне протокола. Поддерживаются несколько методов аутентификации, включая NTLM и Kerberos. Возможность создания удаленных сеансов появилась в версии Powershell 2.0.

Для удаленного подключения к компьютеру через PowerShell Remoting на нем необходимо выполнить ряд настроек:

  1. Нужно разрешить удаленные подключения: Enable-PSRemoting -Force
  2. Запустить службу WinRM: Start-Service WinRM
  3. Создать правило Брандмауэра Windows, разрешающее входящие подключения по этому протоколу.

Компьютер, с которого планируется удаленно управлять другими компьютерами/серверами через PowerShell Remoting также нужно донастроить:

  1. Необходимо разрешить подключения к удаленным системам. Для предоставления доступа ко всем удаленным компьютерам, воспользуйтесь командой: Set-Item wsman:localhostclienttrustedhosts * -Force
  2. Убедитесь, что файервол не блокирует исходящие подключения.

Теперь, чтобы выполнить команду на удаленном компьютере через Powershell Remoting (например, вы хотите перезапустить службу печати Spooler), вам нужно выполнить такую команду:

Invoke-Command -computername server1 -credential domainuser1 -scriptblock

Эта команда выполняет команду Restart-Service spooler на удаленном компьютере с именем server1. Параметр Credential используется для выполнения команды в контексте безопасности доменного пользователя domainuser1.

При указании имени пользователя, Windows PowerShell отобразит диалоговое окно, в котором нужно указать пароль учетной записи user1. Затем указанная в фигурных скобках команда выполняется на удаленном компьютере и возвращает результаты в консоль. После выполнения команды удаленный сеанс PoSh завершается.

Чтобы запустить задачу в фоновом режиме, вы можете указать параметр -AsJob .

Invoke-Command -scriptblock

При запуске команды в фоновом режиме PowerShell не возвращает ее результаты. Чтобы получить их, нужно использовать командлет Receive-Job.

Get-job –id 3 |Receive-Job

Для запуска не одной команды, а целого скрипта PowerShell, командлет Invoke-Command имеет специальный аргумент -FilePath, который нужно использовать вместо -ScriptBlock для указания пути к файлу скрипта. Например, я создал небольшой скрипт PoSh, который отображает список остановленных служб. Выполним данный скрипт на удаленном компьютере:

Invoke-Command -computername server1 -FilePath .list.ps1

Invoke-Command computername FilePath

Тут важно отметить, что вам не нужно самостоятельно копировать файл скрипта ps1 на удаленный компьютер. Результаты выполнения скрипта выводятся в консоль.

Достаточно часто возникает необходимость одновременно выполнять одну и ту же команду/скрипт на нескольких компьютерах. С помощью Invoke-Command это реализуется довольно просто. Можно перечислить имена компьютеров, разделив из запятыми в аргументе -ComputerName.

Invoke-Command -ScriptBlock -ComputerName server1,server2,server3

Либо поместить из в массив:

$srv_list = @(″server4″,″server5″,″server6″)
Invoke-Command -ScriptBlock -ComputerName $servers

Или загрузить из тестового файла:

Invoke-Command -ScriptBlock –ComputerName (Get-Content .servers_list.txt)

Команда будет выполнена на каждом компьютере, а результаты ее выполнения будут отображаться в консоли.

Примечание. У командлета Invoke-Command есть параметр ThrottleLimit который позволяет установить максимальное количество компьютером, на которых одновременно может выполнятся одна и та же команда. По умолчанию число компьютером ограничено цифрой 32. При необходимости это число можно увеличить, но имейте в виду, что увеличение этого параметра увеличивает нагрузку на процессор и память вашего компьютера, поэтому эту операцию нужно выполнять с осторожностью.

Если установлен модуль ActiveDirectory для PowerShell, становится возможным одновременно запускать команды на множестве компьютеров, выбираемых из AD с использованием конвейеров:

Get-ADComputer -Filter * -properties name | select >| Invoke-Command -ScriptBlock

Каждый раз при запуске Invoke-Command, создается новый сеанс, который потребляет некоторое время процессора и ресурсы. Чтобы избежать лишнего расходования ресурсов, можно использовать один сеанс для выполнения всех команд. Например, создадим новый сеанс sess1 с компьютером computer1 и присвоим его переменной $session, а затем выполним свою задачу в этом сеансе:

$session = New-PSSession -ComputerName computer1 -Name sess1
Invoke-Command -ScriptBlock < Restart-Service spooler >-Session $session

Данный Сеанс будет активен, пока вы не закроете консоль PowerShell. Вы также можете закрыть сеанс (Disconnect-PSSession) или удалить его (Remove-PSSession).

Оцените статью
Fobosworld.ru
Добавить комментарий

Adblock
detector