How does PsExec work?
You may wonder how PsExec works under the hood and how it provides the functionality it does to execute remote commands on target Windows computers. The workflow of PsExec looks like the following:
- PsExec begins by extracting from its executable image an embedded Windows service called Psexesvc
- The service is copied to the Admin$ share of the remote system
- Windows Service Control Manager API is then used to have a remote interface with the target computer
- The Psexesvc service is started on the remote system
- A named pipe called psexecsvc is created to which the PsExec utility connects to and sends commands to the remote target
- The remote executable you specify is launched along with the options you specify
Controlling the Psexesvc service
As mentioned, the Psexesvc service is installed on the remote computer. You can control the behaviour of the service on the remote target. The default behaviour of the Psexesvc looks like this:
- The service waits for the executable to terminate then sends the exit code back to PsExec for printing out to the local console
- Using the -d parameter (don’t wait), the service will exit after starting the executable
Understanding the workflow and how PsExec interacts with remote systems will help from a troubleshooting perspective and keep security in mind.
Как установить и настроить PsExec
PsExec не требует установки какого-либо клиентского программного обеспечения и дополнительных настроек на удаленном хосте перед подключением. Итак, если PsExec не требует каких-либо настроек, как другие традиционные инструменты администрирования, как он работает?
Скачивание PsExec
После загрузки распакуйте PsTool.zip. Для этого щелкните правой кнопкой мыши файл ZIP и выберите в меню « Извлечь все» .
Установка PsExec
После загрузки и извлечения PsExec на свой компьютер откройте папку, в которой находится извлеченный файл. Замените то, что находится на панели навигации вверху извлеченной папки, на CMD и нажмите Enter . Этот процесс откроет окно командной строки в папке PsExec.
Запуск PsExec и подключение к удаленному компьютеру
После загрузки PsExec на удаленный компьютер следующим шагом будет его настройка для подключения к целевому хосту. Чтобы PsExec мог работать и подключаться к удаленному хосту, вам необходимо выполнить три основных условия. Эти:
1. Включите общий доступ к файлам и принтерам.
Общий доступ к файлам и принтерам должен быть включен как на локальном, так и на удаленном хосте. Чтобы включить общий доступ к файлам и принтерам, откройте « Настройки Windows» > « Сеть и Интернет» и перейдите к « Центр управления сетями и общим доступом» .
В левой части открывшегося окна нажмите « Изменить дополнительные настройки общего доступа» . Выберите « Включить общий доступ к файлам и принтерам» и сохраните изменения.
2. Включите административный ресурс ($ Admin) на удаленном хосте.
На удаленном компьютере должен быть включен административный ресурс ($ admin) и правильно настроен, чтобы обеспечить доступ к своей папке windows .
Административный общий ресурс ($ admin) позволяет системному администратору управлять несколькими компьютерами в сети компании или рабочей группе, получая доступ к дискам и папкам внутри них.
Чтобы включить административный общий ресурс ($ admin) на удаленном компьютере, нажмите клавиши Win + r , введите lusrmgr.msc и нажмите OK.
В новом окне откройте папку Пользователи . Щелкните правой кнопкой мыши « Администратор» и выберите « Свойства» .
В окне «Свойства» снимите флажок « Учетная запись отключена» и нажмите « ОК» . Снова щелкните правой кнопкой мыши » Администраторы» и выберите » Установить пароль», чтобы установить пароль учетной записи.
3. Получите данные администратора.
Иметь правильные учетные данные удаленного компьютера, то есть IP-адрес, имя пользователя административной учетной записи и пароль.
Команда shutdown
В UNIX для завершения работы системы (выключения, перезагрузки) используется команда shutdown. Мало кто знает, но одноименная команда есть и в Windows. Теперь фанаты UNIX могут завершать работу системы командой shutdown -s и перезагружать систему командой shutdown -r. Также доступен параметр -t, позволяющий задать таймер завершения работы (в секундах), например, в следующем примере система будет перезагружена через одну минуту: shutdown -r -t 60. Параметр -f обеспечивает принудительное завершение работы с закрытием всех запущенных приложений.
Ссылки
- О команде powercfg:www.hanselman.com/blog/PowerCfgTheHiddenEnergyAndBatteryToolForWindowsYoureNotUsing.aspx
- Справочное руководство по командной строке от Microsoft: technet.microsoft.com/en-us/library/bb490890.aspx
- Об управлении службами и команде sc: www.osp.ru/win2000/2011/06/13009943/
- Подробно о команде sc config: www.osp.ru/win2000/2007/04/4257187/
8. Команда sc
Команда sc взаимодействует с контроллером служб и установленными службами. В UNIX/Linux можно управлять службами (сервисами, демонами) из командной строки (в принципе, не знаю такой вещи, которую нельзя было бы выполнить из командной строки в UNIX). С помощью утилиты sc можно управлять службами из командной строки в Windows. Можно запускать и останавливать службы, изменять тип запуска службы и так далее.
Так, для запуска и останова службы используются соответственно параметры start и stop:
Назревает вопрос: как узнать имя службы? Очень просто — для этого нужно использовать параметр query, в результате будет отображен детальный перечень всех служб:
Так как список очень большой, для его просмотра можно перенаправить вывод команды или в команду more (для пагинации), или в буфер обмена (команда clip), или в файл:
Дополнительную информацию об этой команде можно найти на врезке.
Рис. 6. Команда sc query | more
9. Команда recover
Используется для восстановления информации с испорченного или дефектного диска. Представим, что у нас есть каталог d:\reports\2014 и в нем был файл jan.txt, но на диске появились bad-секторы, и прочитать файл jan.txt не получается. Для восстановления (частичного) информации из этого файла можно использовать команду
Команда recover читает файл сектор за сектором и восстанавливает информацию, которую еще можно прочитать. Понятно, что программа не сможет взять информацию из поврежденных секторов, поэтому восстановление информации будет частичным. Данные из поврежденных секторов будут утеряны. Также нужно помнить, что использование масок файлов вроде * и ? в этой команде не допускается, нужно указать явное имя файла.
10. Команда tree
Кому-то команда tree покажется бесполезной, однако она пригодится разработчикам программного обеспечения и техническим писателям. Команда tree отображает структуру каталогов по указанному пути. Например, у нас есть проект c:\my_prj\project1. Нужно построить структуру подкаталогов этого каталога. Для этого можно использовать следующие команды:
Первая команда копирует структуру каталогов в буфер обмена, а вторая помещает в файл с именем project1.txt.
Рис. 7. Команда tree
PowerShell
В 2012 году «Хакер» публиковал статью «Апгрейды для cmd.exe и альтернативы», в которой обсуждались возможные замены для cmd.exe. Напомню, что в статье рассматривались console, clink, cygwin, mintty, PowerCmd. Все они позволяют сделать работу в командной строке эффективнее. В Microsoft тоже понимали, что стандартный cmd.exe уже безнадежно устарел, и вместо того, чтобы подвергнуть его апгрейду, в Microsoft работали над PowerShell. PowerShell — расширяемое средство автоматизации от Microsoft, состоящее из оболочки с интерфейсом командной строки и сопутствующего языка сценариев. Будущее командной строки Windows за PowerShell, поэтому, если ты еще не знаком с ним, самое время начать знакомство. О PowerShell мы писали в февральском номере.
Команда sfc
Команда sfc (system file checker) позволяет проверить системную файловую систему. Не стоит путать эту команду с командой chkdsk (check disk). С помощью последней можно исправить файловую систему на более низком уровне и даже пометить bad-секторы. А вот команда sfc пригодится, если вдруг какой-то системный файл Windows поврежден. Она может обнаружить это и заменить битый файл без всякого вмешательства со стороны пользователя. Очень и очень полезная команда. Она сравнивает тысячи базовых Windows-файлов с оригинальными версиями, которые поставлялись с Windows, и при необходимости заменяет поврежденные или отсутствующие файлы с помощью Windows Update. В зависимости от того, как установлена Windows, может понадобиться, а может и не понадобиться инсталляционный носитель. Обычно он не нужен.
Можно выделить следующие полезные параметры sfc:
- /scannow — осуществляет немедленную проверку системы и при необходимости заменяет файлы. После выполнения sfc нужно перезагрузить Windows, если были найдены проблемы.
- /scanonce — проверка будет произведена при следующем перезапуске системы.
- /scanboot — проверка будет идти при каждом перезапуске системы. Отменить позволяет параметр Revert: после того, как поэкспериментировал с параметром /scanboot, нужно выполнить команду sfc Revert, иначе проверка будет осуществляться при каждом перезапуске.
Рис. 2. Результат выполнения sfc /scannow
Через реестр
В зависимости от ветки реестра, процесс будет выполняться или под пользователем, выполнившим вход в систему, или под аккаунтом SYSTEM.
Есть и другие способы, такие как правка ярлыков в папке «Автозагрузка» или добавление в ярлык к популярной программе && script.cmd, но эти методы уже из серии «можно, но не нужно».
Теперь перейдем к новым инструментам.
Способы новые или куда же без PowerShell
PowerShell, оправдывая свое название, может подключаться к удаленным компьютерам при помощи WMI, RPC и WS-Management (WSMan). Использование последнего метода требует предварительной настройки.
Командлеты, не требующие предварительной настройки, как правило, имеют параметр ComputerName, но не имеют параметра Session. Посмотреть список таких командлетов можно командой:
После того как все компьютеры будут готовы принимать запросы, мы сможем подключаться при помощи соответствующих командлетов PowerShell. Для проверки возможности подключения используется командлет Test-WSMan.
Проверка возможности подключения.
Для того чтобы выполнить определенную команду или скрипт, используется командлет Invoke-Command со следующим синтаксисом:
Где COMPUTER ― имя компьютера, COMMAND ―– имя команды, а USERNAME ― имя пользователя, если оно нужно.
Смотрим содержимое диска С удаленного компьютера.
Если же нам нужно получить полноценную консоль ― не автоматизации ради, а ради управления конкретным компьютером, ― то можно использовать командлет Enter-PSSession.
Работаем в консоли удаленного компьютера.
Конечно, кроме встроенных средств и небольших утилит, существует множество программ для управления структурой. Помимо взрослых решений, для управления конфигурациями вроде Chef, Ansible и MS SCCM можно использовать и средства мониторинга вроде Zabbix, и даже консоль управления антивирусом Касперского.
В период гетерогенных структур хорошо бы иметь возможность унифицированного управления Windows и Linux. Это можно сделать и с помощью PowerShell, что само по себе достойно отдельной статьи ― стоит такую сделать или уже лишнее?
Кстати, поделитесь вашими способами скрытого и не очень запуска программ на удаленных компьютерах. Ну, за исключением эксплойтов.
Команда sc
Команда sc взаимодействует с контроллером служб и установленными службами. В UNIX/Linux можно управлять службами (сервисами, демонами) из командной строки (в принципе, не знаю такой вещи, которую нельзя было бы выполнить из командной строки в UNIX). С помощью утилиты sc можно управлять службами из командной строки в Windows. Можно запускать и останавливать службы, изменять тип запуска службы и так далее.
Так, для запуска и останова службы используются соответственно параметры start и stop:
Назревает вопрос: как узнать имя службы? Очень просто — для этого нужно использовать параметр query, в результате будет отображен детальный перечень всех служб:
Так как список очень большой, для его просмотра можно перенаправить вывод команды или в команду more (для пагинации), или в буфер обмена (команда clip), или в файл:
Дополнительную информацию об этой команде можно найти на врезке.
Рис. 6. Команда sc query | more
Основные команды PsExec для новых пользователей
Мы полагаем, что до сих пор вы понимали, что такое PsExec и как правильно подключить локальную систему к удаленной. Итак, для новых пользователей использование инструмента PsExec может немного сбить с толку, потому что вам нужно следовать синтаксису, чтобы он работал. Вот основные команды, которые должен знать каждый пользователь PsExec.
Удаленный запуск командной строки
Выполнение приведенной выше команды в PsExec запустит другой интерфейс командной строки в текущем окне. Однако этот интерфейс позволит вам вводить команды в удаленной системе, как если бы вы печатали прямо на компьютере.
После успешного выполнения команды CMD вы можете легко запустить другие команды, такие как dir , чтобы вывести список содержимого папки, mkdir для создания новой папки или ipconfig для получения сетевой конфигурации удаленной системы.
Чтобы установить программу на удаленный хост
Приведенный выше сценарий используется для установки CCleaner на удаленном компьютере Desktop7743. Синтаксис -c – это команда, используемая для копирования программы CCleaner с локального хоста на удаленный компьютер, в то время как CMD предназначена для запуска командной строки, а / S – это команда, используемая для включения автоматической установки CCleaner.
Запуск приложения с графическим интерфейсом пользователя на удаленном компьютере
По умолчанию PsExec не запускает программы с графическим интерфейсом на удаленном компьютере. Однако с помощью переключателя -i вы можете запустить приложение с графическим интерфейсом пользователя на экране удаленного компьютера.
Например, если вам нужно открыть приложение калькулятора на удаленном компьютере, все, что вам нужно сделать, это запустить файл Calculator.exe с ключом -i , и PsExec вызовет его.
Psexec
В качестве примера посмотрим, установлено ли обновление, закрывающее нашумевшую уязвимость SMB на списке компьютеров:
В файле computers.txt находится список компьютеров. Для запуска по всему домену можно использовать \*. В файле \serversharelog.txt будут появляться имена рабочих станций или серверов без обновления. Если в домене существуют компьютеры с *nix на борту или нет доступа к административному сетевому ресурсу Admin$ ― команда на этой машине не выполнится, но обработка продолжится. Чтобы скрипт не зависал при каждой попытке подключения, можно задать тайм-аут с помощью ключа -n.
Если компьютер выключен ― мы об этом не узнаем. Поэтому лучше предварительно проверять доступность машин или собирать в файле информацию об успешном или неудачном выполнении.
К минусам Psexec можно отнести то, что она из-за своего удобства и популярности часто используется вирусописателями. Поэтому антивирусные системы могут обнаруживать утилиту как опасность вида remote admin.
По умолчанию процесс на удаленной машине выполняется от имени пользователя, запустившего Psexec. При необходимости логин и пароль можно задать явно или же использовать аккаунт SYSTEM.
Команда chkdsk
Команда chkdsk (Check Disk) позволяет починить ошибки файловой системы, обнаружить bad-секторы, восстановить читаемую информацию из bad-секторов. Windows проверяет диски автоматически, однако chkdsk можно запустить и вручную, если есть подозрения, что с диском что-то не так.
В качестве параметров команде нужно передать имя тома или имя файла (если требуется проверить один файл или группу файлов, в этом случае нужно передать маску файла). Параметр /F автоматически исправляет ошибки, параметр /R позволяет обнаружить bad-секторы и восстановить информацию с них. Если chkdsk не может получить исключительный доступ к диску, тогда проверка диска будет произведена при следующей загрузке системы. Это обычное явление при попытке проверить диск C:. Пример: chkdsk D: /R.
Рис. 3. Отложенный запуск chkdsk
Frequently Asked Questions
What is PsExec?
PsExec gives Windows administrators the ability to allow executing remote processes on Windows systems much like SSH for Linux. It allows executing processes and interacting with console applications without a full desktop session required. Also, no client software is required to be installed for remote connectivity on the host or the target. You can remotely access command-line tools you would not otherwise be able to access, such as IPconfig.
How do I run a PsExec command?
The PsExec command exe is run like any other command from the Windows command prompt or PowerShell prompt. Adding at PATH statement for the Ps Tools Suite is recommended to allow seamless PsExec command functionality without the focus being set to the PsExec directory.
Where can I find PsExec? PsExec is a download made available directly from Microsoft as part of the SysInternals Suite of tools. You can download the PsExec utilities here: PsExec — Windows Sysinternals | Microsoft Docs
Is PsExec Powershell?
PsExec is not part of Windows PowerShell or PowerShell Core. PsExec is a self-contained binary that requires no installation and provides the functionality needed to interact with remote Windows systems, via remote commands and consoles interaction.
Exploring PsExec functionality
One of the first things you will want to do is explore the functionality of the PsExec utility. You can easily see the capabilities provided by the tool when you issue the psexec command without switches. As shown, PsExec has a healthy number of command-line switches to interact with the remote target and control the behaviour.
Usage: psexec | @file]]]]] cmd
-a Separate processors on which the application can run with
commas where 1 is the lowest numbered CPU. For example,
to run the application on CPU 2 and CPU 4, enter:
“-a 2,4”
-c Copy the specified program to the remote system for
execution. If you omit this option the application
must be in the system path on the remote system.
-d Don’t wait for process to terminate (non-interactive).
-e Does not load the specified account’s profile.
-f Copy the specified program even if the file already
exists on the remote system.
-i Run the program so that it interacts with the desktop of the
specified session on the remote system. If no session is
specified the process runs in the console session.
-h If the target system is Vista or higher, has the process
run with the account’s elevated token, if available.
-l Run process as limited user (strips the Administrators group
and allows only privileges assigned to the Users group).
On Windows Vista the process runs with Low Integrity.
-n Specifies timeout in seconds connecting to remote computers.
-p Specifies optional password for user name. If you omit this
you will be prompted to enter a hidden password.
-r Specifies the name of the remote service to create or interact.
with.
-s Run the remote process in the System account.
-u Specifies optional user name for login to remote
computer.
-v Copy the specified file only if it has a higher version number
or is newer on than the one on the remote system.
-w Set the working directory of the process (relative to
remote computer).
-x Display the UI on the Winlogon secure desktop (local system
only).
-arm Specifies the remote computer is of ARM architecture.
-priority Specifies -low, -belownormal, -abovenormal, -high or
-realtime to run the process at a different priority. Use
-background to run at low memory and I/O priority on Vista.
computer Direct PsExec to run the application on the remote
computer or computers specified. If you omit the computer
name PsExec runs the application on the local system,
and if you specify a wildcard (\*), PsExec runs the
command on all computers in the current domain.
@file PsExec will execute the command on each of the computers listed
in the file.
cmd Name of application to execute.
arguments Arguments to pass (note that file paths must be
absolute paths on the target system).
-accepteula This flag suppresses the display of the license dialog.
-nobanner Do not display the startup banner and copyright message.
You can enclose applications that have spaces in their name with
quotation marks e.g. psexec \marklap “c:long name app.exe”.
Input is only passed to the remote system when you press the enter
key, and typing Ctrl-C terminates the remote process.
If you omit a user name the process will run in the context of your
account on the remote system, but will not have access to network
resources (because it is impersonating). Specify a valid user name
in the DomainUser syntax if the remote process requires access
to network resources or to run in a different account. Note that
the password and command is encrypted in transit to the remote system.
Error codes returned by PsExec are specific to the applications you
execute, not PsExec.
Requirements for Using PsExec
The requirements for using and running PsExec are relatively simple since there isn’t an installation of the utility itself. However, there are a few things to keep in mind when using the PsExec utility. These include:
- PsExec is a Windows-only solution that works between Windows computers
- You will need a Windows host computer to use to connect to the target Windows hosts you want to manage
- The admin$ share must be available on the target Windows system
-
You will need to ensure you have connectivity between the host you are running PsExec, and the target computer you want to manage. It includes:
- Ensuring a firewall is not filtering traffic between your host and target
- Enabling the File and Printer Sharing Windows Defender Firewall exception on the target Windows computer
Allowing File and Printer Sharing in the Windows Defender Firewall
Как использовать PsExec?
Чтобы PsExec работал правильно, его синтаксис должен быть точным. Следовательно, вам нужно понимать, как это работает, и вводить команды, как задумано.
Итак, чтобы получить доступ к удаленному хосту, вам необходимо предоставить учетные данные целевого хоста (IP-адрес, имя пользователя и пароль) с вашими предпочтительными командами.
Например, чтобы запустить ipconfig в удаленной системе с IP-адресом 192.168.89.323 и паролем «12345», вы можете открыть консоль PsExec CMD и ввести:
Если введенная вами команда успешно выполняется в удаленной системе, она передаст текстовый вывод в ваше командное окно.
Why not just use PowerShell?
At this time, can administrators not use new tools and capabilities such as PowerShell remoting in the environment instead of leveraging PsExec? In some environments, organizations may pivot to natively using PowerShell remoting and other newer remote capabilities. However, there may still be legacy operating systems found as part of the infrastructure due to certain business or software requirements in some current business environments.
PsExec supports Windows versions back to Windows XP and can be effectively used in all operating systems from XP to the current Windows 10 release. There may be challenges with using PowerShell remoting with legacy operating systems such as Windows XP. Also, this has to be enabled and can potentially be problematic. PsExec is a more traditional and straightforward process to connect, start a service, and start issuing commands.
In this case, using PowerShell may not be possible. Additionally, PsExec can also work with PowerShell scripts and cmdlets. Using PsExec PowerShell commands can provide the best of both worlds, in terms of interoperability and functionality.
Назначенные задания
Искать установку назначенных заданий следует в конфигурации компьютера или пользователя ― «Настройка ― Параметры панели управления ― Назначенные задания».
Создание нового назначенного задания.
Для выполнения команды или скрипта ASAP понадобится создать «Немедленную задачу (Windows 7 и выше)». Если вдруг в инфраструктуре остались машины под управлением Windows XP, то подойдет «Очередное задание (Windows XP)».
Стоит сделать несколько политик с соответствующими WMI-фильтрами или создать два разных назначенных задания в одной политике с нацеливанием ― например, при помощи того же WMI-фильтра. Это поможет избежать конфликтов в разнородной среде со старыми и новыми Windows.
Пример WMI-фильтра для применения политики только на компьютерах с Windows XP:
В остальном процедура создания назначенного задания тривиальна. Единственное, не забывайте отметить пункт «Применить один раз и не применять повторно», если задача не требует повторного запуска.
Запускаем немедленную задачу только один раз.
При использовании таких назначенных заданий программа запустится, как только компьютер получит обновление групповой политики. Это удобно: не нужно проверять доступность компьютеров в случае Psexec и wmic и заставлять пользователей перезагружать машины, как в случае скриптов групповых политик. При необходимости можно скопировать файл скрипта локально в разделе «Настройка ― Конфигурация Windows ― Файлы».
Назначенные задания позволяют явно задать имя пользователя для запуска программы, в том числе и для SYSTEM.
Команда ipconfig
Наиболее известная и поэтому наименее интересная в нашем обзоре. Эта команда знакома всем «командным» администраторам и большинству пользователей: когда возникают проблемы с интернетом, сотрудники техподдержки просят пользователя ввести именно ее.
Команда позволяет просматривать TCP/IP-информацию и работать с ней. Можно использовать ее для проверки IP-адреса компьютера, освобождения или обновления аренды назначенного IP-адреса и даже для уничтожения локального DNS-кеша.
Если просто ввести ipconfig в командной строке, команда отобразит информацию об IP-адресах всех сетевых адаптеров. Для каждого адаптера выводится его описание, например «Ethernet-адаптер» или «Адаптер беспроводной локальной сети», чтобы было понятно, конфигурация какого именно показана. Обычный набор информации содержит IP-адрес, маску подсети, основной шлюз и еще пару полей не очень полезных сведений. Если требуется получить больше данных, нужно использовать параметр /all. При этом команда выведет гораздо больше информации, а самое полезное в расширенном выводе — это поле «Физический адрес», то есть MAC-адрес адаптера.
Кроме параметра /all команды ipconfig, заслуживают пристального внимания параметры /release, /renew и /flushdns. Первый позволяет освободить IP-адрес, назначенный по протоколу DHCP. Правда, после этого сеть откажется работать, так как сетевой интерфейс окажется несконфигурированным, поэтому пригодится второй параметр — /renew, который позволяет обновить всю информацию, назначаемую по DHCP. Этот параметр очень полезен, поскольку заставляет твой комп переподключить к маршрутизатору или к серверам провайдера. Бывает так, что при загрузке комп не видит беспроводную сеть (такую проблему я периодически наблюдаю на своем домашнем компе под управлением Windows 7). Вместо перезагрузки компа проще ввести ipconfig /renew, и сеть появится. Третий параметр позволяет уничтожить весь локальный DNS-кеш. Иногда уничтожение DNS-кеша позволяет решить некоторые проблемы установки соединения, например, когда DNS-информация на сервере уже обновлена, но старая еще осталась в локальном кеше.
Рис. 1. Вывод команды ipconfig /all
Другие статьи в выпуске: