About_automatic_variables

Другие функции сценариев

В PowerShell есть много полезных функций, которые можно использовать в скриптах.

  • — Можно использовать инструкцию, чтобы предотвратить выполнение скрипта без указанных модулей или оснасток и заданную версию PowerShell. Дополнительные сведения см. в разделе about_Requires.

  • — Содержит полный путь и имя выполняемого скрипта. Этот параметр допустим во всех скриптах. Эта автоматическая переменная появилась в PowerShell 3,0.

  • — Содержит каталог, из которого выполняется скрипт. В PowerShell 2,0 эта переменная допустима только в модулях скриптов ( ).
    Начиная с PowerShell 3,0, он действителен во всех скриптах.

  • — Автоматическая переменная содержит сведения о текущем скрипте, включая сведения о том, как он был запущен или вызван. Эту переменную и ее свойства можно использовать для получения сведений о скрипте во время его выполнения. Например, . Переменная Микомманд. path содержит путь и имя файла скрипта. . Строка содержит команду, которая запустила скрипт, включая все параметры и значения.

    Начиная с PowerShell 3,0, имеет два новых свойства, которые предоставляют сведения о скрипте, который вызывал или вызывает текущий скрипт. Значения этих свойств заполняются только в том случае, если вызывающий элемент или вызвавший объект является сценарием.

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

    • PSScriptRoot содержит каталог скрипта, вызвавшего или вызвавшего текущий скрипт.

    В отличие от и автоматических переменных, содержащих сведения о текущем скрипте, свойства пскоммандпас и PSScriptRoot этой переменной содержат сведения о скрипте, вызвавшем текущий скрипт.

  • Разделы данных. Вы можете использовать ключевое слово для разделения данных из логики в скриптах. Разделы данных также могут упростить локализацию. Дополнительные сведения см. в разделе about_Data_Sections и about_Script_Internationalization.

  • Подпись скрипта. Вы можете добавить цифровую подпись к сценарию. В зависимости от политики выполнения можно использовать цифровые подписи для ограничения выполнения скриптов, которые могут включать ненадежные команды. Дополнительные сведения см. в разделе about_Execution_Policies и about_Signing.

Как запустить скрипт PowerShell с помощью ярлыка?

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

  1. Создать bat/cmd файл, в котором прописать команду для запуска скрипта (с параметрами вы ознакомились выше)
  2. Создать ярлык на PowerShell, который можно найти в папке c:WindowsSystem32WindowsPowerShellv и в свойствах ярлыка в поле “Объект” дописать необходимые параметры.

Таким образом, например, чтобы запустить скрипт powershell при входе пользователя, можно просто создать ярлык, как описано во 2-м пункте и поместить его в автозагрузку. Так же, создание ярлыка одним из способов выше позволит легко запустить скрипт от имени администратора или от имени любого другого пользователя как обычную программу.

Скриптовый язык PowerShell – довольно мощный инструмент для решения различных задач, но его можно использовать не только для хороших вещей, но и во вред, поэтому, пользуйтесь им с умом

Разрешение выполнения подписанных сценариев

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

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

Чтобы найти действующую политику выполнения на компьютере, введите:

Чтобы запустить неподписанные скрипты, написанные на локальном компьютере и подписанные скрипты от других пользователей, запустите PowerShell с параметром Запуск от имени администратора, а затем используйте следующую команду, чтобы изменить политику выполнения на компьютере на RemoteSigned:

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

Передача объектов в функции

Любая функция может принимать входные данные из конвейера. Можно контролировать, как функция обрабатывает входные данные из конвейера с помощью ключевых слов, и. В следующем образце синтаксиса показаны три ключевых слова:

Список инструкций выполняется только один раз в начале функции.

Важно!

Если функция определяет блок, то весь код должен находиться внутри этих блоков. Код не будет располагаться за пределами блоков, если определены какие либо блоки.

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

После того как функция получит все объекты в конвейере, список инструкций будет выполняться один раз. Если не используются ключевые слова, или, все инструкции рассматриваются как список инструкций.

Следующая функция использует ключевое слово. Функция отображает примеры из конвейера:

Чтобы продемонстрировать эту функцию, введите список чисел, разделенных запятыми, как показано в следующем примере:

При использовании функции в конвейере объекты, переданный функции, назначаются автоматической переменной. Функция выполняет инструкции с ключевым словом перед тем, как все объекты поступают из конвейера. Функция выполняет инструкции с ключевым словом после того, как все объекты были получены из конвейера.

В следующем примере показана Автоматическая переменная с ключевыми словами и.

Если эта функция выполняется с помощью конвейера, отображаются следующие результаты.

При выполнении инструкции функция не имеет входных данных из конвейера. Инструкция выполняется после того, как функция применяет значения.

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

В этом примере каждый объект, передаваемый функции, отправляется в список инструкций. Инструкции выполняются для каждого объекта, по одному объекту за раз. Автоматическая переменная пуста, если функция достигает ключевого слова.

Дополнительные сведения см. .

Начало работы

Перед запуском убедитесь, что оболочка PowerShell установлена в системе. Сведения о современных рабочих нагрузках для Windows, macOS и Linux см. по следующим ссылкам:

  • Установка PowerShell в Linux
  • Установка PowerShell в macOS
  • Установка PowerShell в Windows

Сведения о традиционных рабочих нагрузках Windows PowerShell см. в разделе Установка Windows PowerShell.

Важно!

Интегрированная среда сценариев Windows PowerShell по-прежнему доступна для Windows, но функции для нее больше не разрабатываются. Интегрированная среда сценариев (ISE) работает только с PowerShell 5.1 и более ранних версий. Как компонент Windows эта среда по-прежнему официально поддерживается для внесения критически важных исправлений, связанных с безопасностью и обслуживанием.
Пока что мы не планируем удалять ее из Windows.

Развертывание в Windows 10 IoT КорпоративнаяDeploying on Windows 10 IoT Enterprise

Windows 10 IoT Корпоративная поставляется со средой Windows PowerShell, которую можно использовать для развертывания PowerShell 7.Windows 10 IoT Enterprise comes with Windows PowerShell, which we can use to deploy PowerShell 7.

  1. Создайте для целевого устройстваCreate to target device

  2. Скопируйте ZIP-файл на устройствоCopy the ZIP package to the device

  3. Присоединитесь к устройству и извлеките архивConnect to the device and expand the archive

  4. Настройте удаленное взаимодействие с PowerShell 7Set up remoting to PowerShell 7

  5. Подключение к конечной точке PowerShell 7 на устройствеConnect to PowerShell 7 endpoint on device

PS2EXE

Модуль ps2exe имеет консольный и графический режим работы. На мой взгляд PS2EXE — это самый простой и удобный способ создания EXE по следующим причинам:

  1. Доступен из репозитория Powershell;
  2. Единственное предназначение модуля — конвертация форматов;
  3. Есть консольный вариант и в стиле PS;

У этого способа так же есть и минус. Как сообщал автор проекта с помощью этого модуля, когда-то, был упакован в .exe вирус. После этого, некоторые антивирусы, стали срабатывать на файлы .exe упакованные этим модулем. Мой антивирус таких сигнатур не нашел. Проект популярный и имеет 200 звезд и с открытым кодом. Тем не менее доверять автору или нет — решать вам.

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

Вам может пригодится основная информация по модулю, которую можно получить так:

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

У команды модуля есть ряд дополнительных параметров увидеть которые можно в справке:

Отмечу наиболее важные параметры:

  • x86-x64 — компиляция под определенную архитектуру. Если этого не указано, то используется значение по умолчанию (обе архитектуры);
  • title — заголовок консоли;
  • noConsole — не отображает консоль при запуске скрипта;
  • requireAdmin — запрашивать права администратора (UAC);
  • credentialGUI — вывод диалогового окна для ввода учетных данных.

Если вы используете параметр noConsole, обратите на разное поведение с выводом в stdout. Без указания параметра noConsole — все будет выведено в консоль, а с параметром — в диалоговые окна.

В примере ниже я создал exe файл, который выполняет одну команду «New-Item». Эта команда возвращает информацию о созданном объекте. Если вы не помещаете результат команды в переменную, то он попадает в stdout. Результат команды будет выведен построчно в диалоговых окнах:

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

GUI

PS2EXE доступен и в графическом варианте. Папка, в которой лежит файл для запуска GUI, указана в описании модуля (на скриншоте выше). Обычно это один из следующих путей:

В папке модуля будет папка с версией. Внутри этих папок файл ‘Win-PS2EXE.exe’.

Параметры графического интерфейса достаточно очевидны и не нуждаются в дополнительном объяснении.

Вам так же будет интересно:

Создание самозаверяющего сертификата.

Чтобы создать самозаверяющий сертификат, используйте командлет New-SelfSignedCertificate в модуле PKI. этот модуль появился в PowerShell 3,0 и входит в Windows 8 и Windows Server 2012. Дополнительные сведения см. в разделе справки по командлету.

Использование Makecert.exe

чтобы создать самозаверяющий сертификат в более ранних версиях Windows, используйте средство создания сертификатов . это средство входит в состав пакета SDK для Microsoft .NET (версии 1,1 и более поздних) и в Microsoft Windows SDK.

Дополнительные сведения о синтаксисе и описаниях параметров средства см. в разделе средство создания сертификатов (MakeCert.exe).

Чтобы использовать средство для создания сертификата, выполните следующие команды в окне командной строки пакета SDK.

Примечание

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

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

Чтобы убедиться, что сертификат создан правильно, выполните следующую команду, чтобы получить сертификат в хранилище сертификатов на компьютере. Файл сертификата не будет найден в каталоге файловой системы.

В командной строке PowerShell введите следующее:

Эта команда использует поставщик сертификата PowerShell для просмотра сведений о сертификате.

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

Оператор &

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

& ′C:Program FilesHello.exe′

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

& ′C:Program FilesHello.exe′  ′Hello, world′

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

& ′C:Program FilesHello.exe′  ′Hello,′, ′ world′

Для удобства команду и аргументы можно поместить в переменные:

$exe = ′C:Program FilesHello.exe′$arg1 = ′Hello′$arg2 = ′world′& $exe $arg1 $arg2

Ну и если аргументов много, то их можно объединить, воспользовавшись такой конструкцией:

$exe = ′C:Program FilesHello.exe′$allargs = @(′Hello,′,′world′)& $exe $allargs

PowerShell в роли инструмента для пентеста: скрипты и примеры от Varonis +11

  • 14.10.19 12:09


Varonis

#471420

Хабрахабр


Перевод

2800

Информационная безопасность, Системное администрирование, PowerShell, Блог компании Varonis Systems

Хакеры любят использовать PowerShell для запуска «fileless malware» — бестелесных вредоносных программ, которые не являются традиционными бинарными файлами с компилированным вредоносным кодом, и по этой причине подчас не могут быть обнаружены антивирусными решениями.
PowerShell, конечно же, всегда имел вполне нормальное предназначение, никак поначалу вообще не связанное с тестированием на проникновение. Те из вас, кто захочет узнать предысторию появления на свет PowerShell, должны почитать знаменитый Манифест Монады. Написанный одним из первоначальных разработчиков, этот манифест объясняет, зачем Microsoft потребовался новый язык описания сценариев (проще говоря, скриптов), который в конечном итоге и превратился в PowerShell.
Чтобы избавить вас от необходимости просматривать длиннющий 17-страничный документ, я вам открою главный мотивирующий фактор, побудивший авторов PowerShell: он должен был предоставить системным администраторам доступ к объектам .Net из командной строки, позволив таким образом автоматизировать рабочий процесс на уровне системы, а не на уровне глубокого программирования в C# или C++.
Если вы хотите получить реальные доказательства эффективности PowerShell (далее – PS), спросите своих системных администраторов, как они массово добавляют пользователей в Active Directory или выполняют быструю настройку безопасности. Скорее всего, вы узнаете про решения на PowerShell. Короче говоря: PS — это шикарный способ снижения рутины и повышения производительности для администраторов.

Включение усиленной защиты закрытого ключа для сертификата

При наличии частного сертификата на компьютере вредоносные программы могут подписывать сценарии от вашего имени, что позволяет PowerShell выполнять их.

Чтобы предотвратить автоматический вход от вашего имени, используйте диспетчер сертификатов для экспорта сертификата подписи в файл. диспетчер сертификатов входит в состав пакета SDK для Microsoft .NET, Microsoft Windows SDK и в internet Explorer.

Чтобы экспортировать сертификат, выполните следующие действия.

  1. Запустите диспетчер сертификатов.
  2. Выберите сертификат, выданный корневым каталогом локального сертификата PowerShell.
  3. Нажмите кнопку Экспорт, чтобы запустить мастер экспорта сертификатов.
  4. Выберите «Да, экспортировать закрытый ключ» и нажмите кнопку «Далее».
  5. Выберите «включить усиленную защиту».
  6. Введите пароль и введите его еще раз для подтверждения.
  7. Введите имя файла с расширением имени PFX-файла.
  8. Нажмите кнопку «Готово».

Чтобы повторно импортировать сертификат, выполните следующие действия.

  1. Запустите диспетчер сертификатов.
  2. Нажмите кнопку Импорт, чтобы запустить мастер импорта сертификатов.
  3. Откройте файл. pfx, созданный в процессе экспорта.
  4. На странице Пароль выберите «включить усиленную защиту закрытого ключа», а затем введите пароль, назначенный в процессе экспорта.
  5. Выберите хранилище личных сертификатов.
  6. Нажмите кнопку «Готово».

Приступая к работе

Майкрософт

Name           Used (GB)     Free (GB) Provider      Root
----           ---------     --------- --------      ----
Alias                                  Alias
C                  16.56         63.44 FileSystem    C:\
cert                                   Certificate   \
D                    .11         53.92 FileSystem    D:\
Env                                    Environment
Function                               Function
HKCU                                   Registry      HKEY_CURRENT_USER
HKLM                                   Registry      HKEY_LOCAL_MACHINE
Variable                               Variable
WSMan                                  WSMan
Set-Location HKLM: # Или, если вы из людей подосёвее, набирайте cd HKLM:
SKC  VC Name                           Property
---  -- ----                           --------
  2   0 BCD00000000                    {}
  4   0 HARDWARE                       {}
  1   0 SAM                            {}
Get-ChildItem : Requested registry access is not allowed.
At line:1 char:3
+ ls <<<<  -force
    + CategoryInfo          : PermissionDenied: (HKEY_LOCAL_MACHINE\SECURITY:St
   ring) , SecurityException
    + FullyQualifiedErrorId : System.Security.SecurityException,Microsoft.Power
   Shell.Commands.GetChildItemCommand

 35   0 SOFTWARE                       {}
  8   0 SYSTEM                         {}

политика выполнения в Windows server Core и windows Nano server

когда PowerShell 5,1 запускается на Windows server Core или Windows Nano server при определенных условиях, политики выполнения могут завершиться со следующей ошибкой:

PowerShell использует интерфейсы api в оболочке Windows Desktop Shell ( ) для проверки зоны файла скрипта. оболочка Windows недоступна в Windows server Core и Windows Nano server.

эту ошибку также можно получить на любой Windows системе, если оболочка Windows Desktop Shell недоступна или не отвечает. например, во время входа сценарий входа PowerShell может начать выполнение до того, как Windows рабочий стол будет готов, что приведет к сбою.

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

Как запустить PowerShell в папке

Если вам нужно запустить PowerShell в сразу определенной папке, то в Windows 10 для этого нужно открыть эту папку при помощи проводника и нажать на кнопку «Файл» в левом верхнем углу окна. В результате появится меню с помощью которого можно будет запустить данную программу с правами пользователя или от имени администратора.

В операционной системе Windows 7 вы можете запустить PowerShell в папке при помощи адресной строки. Для этого откройте нужную папку и введите в адресную строку команду «powershell».

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

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

Как запустить скрипт PowerShell в Windows

Для запуска скрипта с расширением .ps1 нужно открыть консоль PowerShell и затем указать полный путь до файла. Вы также можете перейти в папку со скриптом либо с помощью команды cd, либо, если вы хотите полностью окунуться в стиль PowerShell, то можете использовать Set-Location.

Например, мне нужно перейти в папку C:\Users\Администратор\Downloads\WinPwn-master\:

Set-Location C:\Users\Администратор\Downloads\WinPwn-master\

Если вы просто попытаетесь запустить скрипт, то почти наверняка столкнётесь с ошибкой, что запуск скриптов запрещён. Для исправления ошибки выполните команду:

Set-ExecutionPolicy unrestricted

Подробности смотрите в статье «Ошибка «Невозможно загрузить файл ….ps1, так как выполнение сценариев отключено в этой системе» (РЕШЕНО)»

Запуск скрипта с помощью Import-Module

При запуске некоторых скриптов может ничего не происходить. Дело в том, что скрипт может содержать в себе функцию, которую нужно импортировать, а затем запустить. Поищите в документации по интересующей вас программе примеры со строкой Import-Module.

Например для запуска WinPwn нужно вначале импортировать файл с функциями:

Import-Module .\WinPwn.ps1

А после этого можно вызывать содержащиеся в файле функции:

WinPwn

Как запустить PowerShell?

В производственной среде предприятия, которую я поддерживаю, я работаю с тремя разными учетными записями пользователей Active Directory. В лабораторной среде в этой книге используются зеркальные экземпляры этих учетных записей. Я вошел на компьютер с Windows 10 в качестве пользователя домена, который не является администратором домена или локальным администратором.

Я запустил консоль PowerShell, щелкнув ярлык Windows PowerShell, как показано на рис. 1-1.

Обратите внимание, что в строке заголовка консоли PowerShell указано «Windows PowerShell», как показано на рис. 1-4

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

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

Закройте PowerShell. Перезапустите консоль PowerShell, только на этот раз щелкните правой кнопкой мыши ярлык Windows PowerShell и выберите пункт Запуск от имени администратора, как показано на рис. 1-5.

Если вы выполнили вход в Windows в качестве обычного пользователя, вам будет предложено ввести учетные данные. Я буду вводить учетные данные учетной записи пользователя, которая является пользователем домена и локальным администратором, как показано на рис. 1-6.

После повторного запуска PowerShell с правами администратора в строке заголовка должно быть указано «Администратор: Windows PowerShell», как показано на рис. 1-7.

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

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

Еще раз выполните поиск PowerShell, только на этот раз щелкните ее правой кнопкой мыши и выберите пункт «Закрепить на панели задач», как показано на рис. 1-8.

Щелкните правой кнопкой мыши ярлык PowerShell, который теперь закреплен на панели задач, и выберите пункт «Свойства», как показано на рис. 1-9.

Щелкните «Дополнительно», как показано в первой части рис. 1-10, установите флажок «Запуск от имени администратора», как показано во второй части рис. 1-10, а затем дважды нажмите кнопку OK, чтобы принять изменения и выйти из обоих диалоговых окон.

Вам больше никогда не придется беспокоиться о поиске PowerShell или о том, запущена ли оболочка от имени администратора или нет.

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

Манифесты модулей

Каждый модуль имеет манифест модуля. Манифест модуля содержит метаданные о вашем модуле.
Расширение файла для файла манифеста модуля — . Не все файлы с расширением являются манифестами модулей. Кроме того, их можно использовать для хранения части среды конфигурации DSC. используется для создания манифеста модуля. Path — единственное значение, которое необходимо указать. При этом модуль не будет работать, если не указан параметр RootModule. Лучше указать параметры Author и Description на тот случай, если вы решите передать модуль в репозиторий NuGet с помощью PowerShellGet, так как эти значения необходимо указать в приведенном сценарии.

Версия модуля без манифеста — 0.0. Это явное доказательство того, что модуль не имеет манифеста.

Манифест модуля можно создать с помощью всех рекомендуемых данных.

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

Запуск PowerShell от имени другого пользователя

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

Чтобы запустить PowerShell от имени другого пользователя вам необходимо зажать кнопку SHIFT, после чего щелкнуть правым кликом мыши по значку PowerShell, из контекстного меню выбрать пункт «Запуск от имени другого пользователя»

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

так же вы можете запускать новое окно PowerShell из текущего окна пользователя, но с уже новыми правами, для этого введите команду:

start powershell -credential «»

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