Это сообщение в блоге является второй частью серии "Offensive WMI" (первая здесь https://0xinfection.github.io/posts/wmi-basics-part-1/ ), и в этой статье основное внимание будет уделено трем основным компонентам WMI, с которыми мы будем в основном иметь дело. На протяжении всей статьи мы будем использовать командлеты WMI и CIM как взаимозаменяемые, так что мы хорошо разбиремся в обоих типах командлетов.
Пространства имён
Попросту напомним, что такое пространства имен:
Пространство имен организует информацию аналогично папкам в файловой системе. Однако вместо физических расположений (например, на диске) они более логичны по своей природе.
Все пространства имен в WMI являются экземплярами системного класса __Namespace. Чтобы получить список всех пространств имен в корневом пространстве имен, мы можем запросить тот же класс, используя:
Get-WmiObject -Namespace root -Class __Namespace
Вывод содержит много информации, поэтому, чтобы отфильтровать шум, мы можем использовать выбор Powershell:
Get-WmiObject -Namespace root -Class __Namespace | select name
Теперь у нас есть список пространств имен в нашей системе. Все эти пространства имен будут называться root\<namespace>, например . root\ DEFAULT, root\CIMV2 и т. д., поскольку они являются пространствами имен в корневом пространстве имен.
ПРИМЕЧАНИЕ. Один странно интригующий факт заключается в том, что пространство имен по умолчанию в WMI - это не root\DEFAULT, а скорее root\CIMV2 (так было с Windows 2000).
То же самое можно сделать с помощью командлета CIM Get-CimInstance.
Get-CimInstance -Namespace root -ClassName __Namespace
Хорошо, теперь все отсортировано, а как насчет вложенных пространств имен? Мы уже видели, что под корневым пространством имен есть несколько пространств имен. Мы можем просто написать скрипт, который рекурсивно получает нам пространства имен (из PSMag):
ПРИМЕЧАНИЕ. Классы и пространства имен могут отличаться от машины к машине в зависимости от доступного оборудования, установленных приложений и многих других факторов.
Классы
Теперь, когда у нас есть список доступных пространств имен, давайте взглянем на классы. Так что же такое классы?
Класс WMI представляет определенный элемент в вашей системе. Это может быть что угодно, от системных процессов до оборудования (например, сетевой карты), услуг и т. д.
Теперь классы разделены на 3 основные категории (это требование стандарта CIM):
- Основные классы: они применяются ко всем областям управления и предоставляют несколько основных функций. Обычно они начинаются с двойного подчеркивания (например, __SystemSecurity).
- Общие классы: это расширения основных классов, применимые к конкретным областям управления. Вы определите его, когда увидите класс с префиксом CIM_ (например, CIM_TemperatureSensor).
- Расширенные классы: это дополнительные дополнения к общим классам, основанные на технических стеках. (например, Win32_Process).
Классы делятся на следующие типы:
- Абстрактные классы: это шаблоны для определения новых классов.
- Статические классы: в основном используются для хранения данных.
- Динамические классы: они получаются от поставщика и представляют собой управляемый WMI ресурс. Нас больше всего интересуют классы этого типа.
-Ассоциативные классы: описывает отношения между классами и управляемыми ресурсами.
Классы листинга
Хватит теории. Попробуем найти какие-нибудь классы. И снова мы можем использовать командлет Get-WmiObject для вывода списка доступных классов:
Get-WmiObject -Class * -List
Здесь будут перечислены все вышеперечисленные классы, но в качестве примера предположим, что нас интересуют пользователи системы. Мы можем сузить круг до нашего конкретного варианта использования, используя следующую команду, в которой перечислены все доступные классы для получения/обработки информации о пользователе:
Get-WmiObject -Class *user* -List
То же самое можно сделать и с помощью командлета Get-CimClass:
Get-CimClass -ClassName *user*
ПРИМЕЧАНИЕ. Список всех классов Win32 можно найти в документации по классам Microsoft. Провайдер Win32 предоставляет классы для 4 различных категорий: классы оборудования компьютерных систем, классы операционных систем, классы счетчиков производительности и классы управления службами WMI.
Помните, мы говорили о динамических классах, которые предоставляют нам экземпляры? Чтобы получить только динамические классы, мы можем использовать переключатель -QualifierName командлета Get-CimClass:
Get-CimClass -ClassName *user* -QualifierName dynamic
Все идет нормально. Что дальше? Запросы к классам, чтобы получить от них самое интересное.
Получение классов
На этот раз нас интересует класс Win32_UserAccount. Получить данные просто, мы можем просто:
Get-WmiObject -Class Win32_UserAccount
СОВЕТ. Чтобы получить более подробный вывод, вы можете передать указанную выше команду в Powershell Format-List или fl, например: Get-WmiObject -Class Win32_UserAccount | fl *, который даст вам все, что может предложить класс.
Командлет CIM Get-CimInstance также можно использовать для получения той же информации:
Get-CimInstance -ClassName Win32_UserAccount
Теперь у нас есть список всех учетных записей пользователей в системе!
Обратим внимание на процессы, запущенные в системе. Класс Win32_Process дает нам список процессов, запущенных в системе:
Get-WmiObject -Class Win32_Process
Нередко в системе выполняется множество процессов, из-за которых ваш терминал может бесконечно прокручиваться! Чтобы избежать этого, мы можем использовать Filter для получения определенного процесса, который мы ищем (здесь мы выбрали lsass.exe):
Get-WmiObject -Class Win32_Process -Filter 'name="lsass.exe"'
Альтернативный вариант командлета CIM Get-CimInstance в этом случае дает более короткий и полный вывод (и он также поддерживает переключатель -Filter):
Идиоматическое выражение, делающее то же самое с WQL, выглядит следующим образом:
Get-CimInstance -ClassName Win32_Process
+
Get-WmiObject -Query 'select * from win32_process where name="lsass.exe"'
Хорошо, теперь мы знаем о перечислении, извлечении и фильтрации экземпляров классов в WMI. Давайте посмотрим, как удаление экземпляров работает в WMI.
Удаление экземпляров классов
Remove-WmiObject (для командлетов WMI) и Remove-CimInstance (для командлетов CIM) - это два командлета, которые могут удалять экземпляры. Вы можете передать вывод соответствующей команды командлетам. Для быстрой демонстрации давайте запустим наше любимое приложение-калькулятор и составим список процесса.
Что произойдет, если мы направим команду в Remove-CimInstance? Процесс закрывается!
Get-CimInstance -ClassName Win32_Process -Filter 'name="calculator.exe"' | Remove-CimInstance
Это чрезвычайно полезно, когда Вы возитесь с реестром, или, что лучше, в ситуации, когда мы создали наши собственные классы для хранения наших полезных нагрузок и прочего - мы можем просто использовать командлет, чтобы перечислить все элементы в классе и, таким образом, очистить их все. за один присест.
Методы
Методы - это способы управления объектами WMI. Если вы прокрутите до места, где мы перечислили все доступные классы, вы увидите столбец под названием "Методы", в котором перечислены доступные методы.
Способы листинга
Чтобы повторить нашу работу и перечислить все доступные методы, мы можем сделать что-то вроде этого:
Get-CimClass -MethodName *
Чтобы отфильтровать экземпляры, которые позволяют нам выполнять определенный метод, мы можем передать имя метода, например, Create (что всегда интересно, потому что может позволить нам что-то создать):
Get-CimClass -MethodName Create
Чтобы еще больше сузить круг вопросов, чтобы перечислить доступные методы для определенного класса, нам нужно использовать выбор Powershell с переключателем -ExpandProperty:
С помощью Get-CimClass
Get-WmiObject -Class Win32_Process -List | select -ExpandProperty Methods
или так
Get-CimClass -ClassName Win32_Process | select -ExpandProperty CimClassMethods
ПРИМЕЧАНИЕ. Обратите внимание, что значение, переданное в инструкцию select, - это имя столбца, которое мы получили при перечислении классов. Если вы запутались, прокрутите до абзаца, в котором мы перечислили класс, и обратите внимание на разницу вывода между выводом командлета WMI и CIM.
Итак, у нас есть такие методы, как Create, Terminate, GetOwner, GetOwnerSid и т. д. для класса Win32_Process. Круто. Теперь давайте посмотрим, как мы можем использовать методы.
СОВЕТ: Чтобы использовать метод, нам нужно знать, какие параметры нам нужно предоставить при вызове метода. Чтобы перечислить все доступные параметры, мы можем использовать комбинацию Powershell или, лучше, просто прочитать документацию https://docs.microsoft.com/en-us/po...voke-wmimethod?view=powershell-5.1#parameters.
Использование методов
Invoke-WmiMethod (для WMI) и Invoke-CimMethod (для командлетов CIM) позволяет нам использовать методы для определенного класса. Попробуем создать калькулятор:
Invoke-WmiMethod -Class Win32_Process -Name Create -ArgumentList calc.exe
Чтобы использовать командлет CIM, синтаксис немного меняется.
Invoke-CimMethod -ClassName Win32_Process -MethodName create -Arguments @{commandline="calc.exe"}
Что ж, теперь мы знаем о порождении новых процессов!
Установка свойств объектов
И последнее, но не менее важное: мы должны взглянуть на обновление экземпляров класса. Однако важно помнить, что экземпляр должен быть доступен для записи. Немного написав скрипт, мы можем составить рецепт для получения всех доступных для записи свойств класса. Вот сценарий (получен из PSMag https://powershellmagazine.com/2012/09/06/pstip-get-all-writeable-properties-of-a-wmi-class/):
В нашем примере мы будем использовать класс Win32_OperatingSystem, у которого есть записываемое свойство с именем Description (по сути, описание ОС).
Дайте обновим имя свойства до PewOS, используя `Set-WmiInstance:
То же самое может быть достигнуто с помощью Set-CimInstance, но это остается на усмотрение читателя.
Заключение
Уф, Вы наверное утомились! К настоящему времени у нас есть прочная основа для командлетов WMI и CIM и того, как их можно использовать для достижения значительного контроля над системой. Пока что спасибо за то, что вы здесь, и увидимся все в блоге. Выпью за Ваше здоровье!
Пространства имён
Попросту напомним, что такое пространства имен:
Пространство имен организует информацию аналогично папкам в файловой системе. Однако вместо физических расположений (например, на диске) они более логичны по своей природе.
Все пространства имен в WMI являются экземплярами системного класса __Namespace. Чтобы получить список всех пространств имен в корневом пространстве имен, мы можем запросить тот же класс, используя:
Get-WmiObject -Namespace root -Class __Namespace
Вывод содержит много информации, поэтому, чтобы отфильтровать шум, мы можем использовать выбор Powershell:
Get-WmiObject -Namespace root -Class __Namespace | select name
Теперь у нас есть список пространств имен в нашей системе. Все эти пространства имен будут называться root\<namespace>, например . root\ DEFAULT, root\CIMV2 и т. д., поскольку они являются пространствами имен в корневом пространстве имен.
ПРИМЕЧАНИЕ. Один странно интригующий факт заключается в том, что пространство имен по умолчанию в WMI - это не root\DEFAULT, а скорее root\CIMV2 (так было с Windows 2000).
То же самое можно сделать с помощью командлета CIM Get-CimInstance.
Get-CimInstance -Namespace root -ClassName __Namespace
Хорошо, теперь все отсортировано, а как насчет вложенных пространств имен? Мы уже видели, что под корневым пространством имен есть несколько пространств имен. Мы можем просто написать скрипт, который рекурсивно получает нам пространства имен (из PSMag):
Код:
Function Get-WmiNamespace {
Param (
$Namespace='root'
)
Get-WmiObject -Namespace $Namespace -Class __NAMESPACE | ForEach-Object {
($ns = '{0}\{1}' -f $_.__NAMESPACE,$_.Name)
Get-WmiNamespace $ns
}
}
ПРИМЕЧАНИЕ. Классы и пространства имен могут отличаться от машины к машине в зависимости от доступного оборудования, установленных приложений и многих других факторов.
Классы
Теперь, когда у нас есть список доступных пространств имен, давайте взглянем на классы. Так что же такое классы?
Класс WMI представляет определенный элемент в вашей системе. Это может быть что угодно, от системных процессов до оборудования (например, сетевой карты), услуг и т. д.
Теперь классы разделены на 3 основные категории (это требование стандарта CIM):
- Основные классы: они применяются ко всем областям управления и предоставляют несколько основных функций. Обычно они начинаются с двойного подчеркивания (например, __SystemSecurity).
- Общие классы: это расширения основных классов, применимые к конкретным областям управления. Вы определите его, когда увидите класс с префиксом CIM_ (например, CIM_TemperatureSensor).
- Расширенные классы: это дополнительные дополнения к общим классам, основанные на технических стеках. (например, Win32_Process).
Классы делятся на следующие типы:
- Абстрактные классы: это шаблоны для определения новых классов.
- Статические классы: в основном используются для хранения данных.
- Динамические классы: они получаются от поставщика и представляют собой управляемый WMI ресурс. Нас больше всего интересуют классы этого типа.
-Ассоциативные классы: описывает отношения между классами и управляемыми ресурсами.
Классы листинга
Хватит теории. Попробуем найти какие-нибудь классы. И снова мы можем использовать командлет Get-WmiObject для вывода списка доступных классов:
Get-WmiObject -Class * -List
Здесь будут перечислены все вышеперечисленные классы, но в качестве примера предположим, что нас интересуют пользователи системы. Мы можем сузить круг до нашего конкретного варианта использования, используя следующую команду, в которой перечислены все доступные классы для получения/обработки информации о пользователе:
Get-WmiObject -Class *user* -List
То же самое можно сделать и с помощью командлета Get-CimClass:
Get-CimClass -ClassName *user*
ПРИМЕЧАНИЕ. Список всех классов Win32 можно найти в документации по классам Microsoft. Провайдер Win32 предоставляет классы для 4 различных категорий: классы оборудования компьютерных систем, классы операционных систем, классы счетчиков производительности и классы управления службами WMI.
Помните, мы говорили о динамических классах, которые предоставляют нам экземпляры? Чтобы получить только динамические классы, мы можем использовать переключатель -QualifierName командлета Get-CimClass:
Get-CimClass -ClassName *user* -QualifierName dynamic
Все идет нормально. Что дальше? Запросы к классам, чтобы получить от них самое интересное.
Получение классов
На этот раз нас интересует класс Win32_UserAccount. Получить данные просто, мы можем просто:
Get-WmiObject -Class Win32_UserAccount
СОВЕТ. Чтобы получить более подробный вывод, вы можете передать указанную выше команду в Powershell Format-List или fl, например: Get-WmiObject -Class Win32_UserAccount | fl *, который даст вам все, что может предложить класс.
Командлет CIM Get-CimInstance также можно использовать для получения той же информации:
Get-CimInstance -ClassName Win32_UserAccount
Теперь у нас есть список всех учетных записей пользователей в системе!
Обратим внимание на процессы, запущенные в системе. Класс Win32_Process дает нам список процессов, запущенных в системе:
Get-WmiObject -Class Win32_Process
Нередко в системе выполняется множество процессов, из-за которых ваш терминал может бесконечно прокручиваться! Чтобы избежать этого, мы можем использовать Filter для получения определенного процесса, который мы ищем (здесь мы выбрали lsass.exe):
Get-WmiObject -Class Win32_Process -Filter 'name="lsass.exe"'
Альтернативный вариант командлета CIM Get-CimInstance в этом случае дает более короткий и полный вывод (и он также поддерживает переключатель -Filter):
Идиоматическое выражение, делающее то же самое с WQL, выглядит следующим образом:
Get-CimInstance -ClassName Win32_Process
Get-WmiObject -Query 'select * from win32_process where name="lsass.exe"'
Хорошо, теперь мы знаем о перечислении, извлечении и фильтрации экземпляров классов в WMI. Давайте посмотрим, как удаление экземпляров работает в WMI.
Удаление экземпляров классов
Remove-WmiObject (для командлетов WMI) и Remove-CimInstance (для командлетов CIM) - это два командлета, которые могут удалять экземпляры. Вы можете передать вывод соответствующей команды командлетам. Для быстрой демонстрации давайте запустим наше любимое приложение-калькулятор и составим список процесса.
Что произойдет, если мы направим команду в Remove-CimInstance? Процесс закрывается!
Get-CimInstance -ClassName Win32_Process -Filter 'name="calculator.exe"' | Remove-CimInstance
Это чрезвычайно полезно, когда Вы возитесь с реестром, или, что лучше, в ситуации, когда мы создали наши собственные классы для хранения наших полезных нагрузок и прочего - мы можем просто использовать командлет, чтобы перечислить все элементы в классе и, таким образом, очистить их все. за один присест.
Методы
Методы - это способы управления объектами WMI. Если вы прокрутите до места, где мы перечислили все доступные классы, вы увидите столбец под названием "Методы", в котором перечислены доступные методы.
Способы листинга
Чтобы повторить нашу работу и перечислить все доступные методы, мы можем сделать что-то вроде этого:
Get-CimClass -MethodName *
Чтобы отфильтровать экземпляры, которые позволяют нам выполнять определенный метод, мы можем передать имя метода, например, Create (что всегда интересно, потому что может позволить нам что-то создать):
Get-CimClass -MethodName Create
Чтобы еще больше сузить круг вопросов, чтобы перечислить доступные методы для определенного класса, нам нужно использовать выбор Powershell с переключателем -ExpandProperty:
С помощью Get-CimClass
Get-WmiObject -Class Win32_Process -List | select -ExpandProperty Methods
или так
Get-CimClass -ClassName Win32_Process | select -ExpandProperty CimClassMethods
ПРИМЕЧАНИЕ. Обратите внимание, что значение, переданное в инструкцию select, - это имя столбца, которое мы получили при перечислении классов. Если вы запутались, прокрутите до абзаца, в котором мы перечислили класс, и обратите внимание на разницу вывода между выводом командлета WMI и CIM.
Итак, у нас есть такие методы, как Create, Terminate, GetOwner, GetOwnerSid и т. д. для класса Win32_Process. Круто. Теперь давайте посмотрим, как мы можем использовать методы.
СОВЕТ: Чтобы использовать метод, нам нужно знать, какие параметры нам нужно предоставить при вызове метода. Чтобы перечислить все доступные параметры, мы можем использовать комбинацию Powershell или, лучше, просто прочитать документацию https://docs.microsoft.com/en-us/po...voke-wmimethod?view=powershell-5.1#parameters.
Использование методов
Invoke-WmiMethod (для WMI) и Invoke-CimMethod (для командлетов CIM) позволяет нам использовать методы для определенного класса. Попробуем создать калькулятор:
Invoke-WmiMethod -Class Win32_Process -Name Create -ArgumentList calc.exe
Чтобы использовать командлет CIM, синтаксис немного меняется.
Invoke-CimMethod -ClassName Win32_Process -MethodName create -Arguments @{commandline="calc.exe"}
Что ж, теперь мы знаем о порождении новых процессов!
Установка свойств объектов
И последнее, но не менее важное: мы должны взглянуть на обновление экземпляров класса. Однако важно помнить, что экземпляр должен быть доступен для записи. Немного написав скрипт, мы можем составить рецепт для получения всех доступных для записи свойств класса. Вот сценарий (получен из PSMag https://powershellmagazine.com/2012/09/06/pstip-get-all-writeable-properties-of-a-wmi-class/):
В нашем примере мы будем использовать класс Win32_OperatingSystem, у которого есть записываемое свойство с именем Description (по сути, описание ОС).
Дайте обновим имя свойства до PewOS, используя `Set-WmiInstance:
То же самое может быть достигнуто с помощью Set-CimInstance, но это остается на усмотрение читателя.
Заключение
Уф, Вы наверное утомились! К настоящему времени у нас есть прочная основа для командлетов WMI и CIM и того, как их можно использовать для достижения значительного контроля над системой. Пока что спасибо за то, что вы здесь, и увидимся все в блоге. Выпью за Ваше здоровье!