Наступательный WMI - Изучение пространств имен, классов и методов (часть 2)

WMI — пространства имен, классы и методы (часть 2)

Эта статья является второй частью серии «Offensive WMI» (первая здесь), и в этой статье мы сосредоточимся на трех основных компонентах WMI, с которыми мы будем в основном иметь дело. На протяжении всей статьи мы будем использовать как командлеты WMI, так и CIM как взаимозаменяемые, так что мы хорошо разбираемся в обоих типах командлетов. Другими словами разберем WMI — пространства имен, классы и методы

Пространства имён

Попросту напомним, что такое пространства имен:
 
Пространство имен организует информацию аналогично папкам в файловой системе. Однако вместо физических расположений (например, на диске) они более логичны по своей природе.
 
Все пространства имен в WMI являются экземплярами системного класса __Namespace. Чтобы получить список всех пространств имен в root пространстве имен, мы можем запросить тот же класс, используя:
 
Get-WmiObject -Namespace root -Class __Namespace
 
namespace  Наступательный WMI - Изучение пространств имен, классов и методов
 
Вывод содержит много информации, поэтому, чтобы отфильтровать шум, мы можем использовать выбор Powershell:
 
Get-WmiObject -Namespace root -Class __Namespace | select name
 
namespace  Наступательный WMI - Изучение пространств имен, классов и методов
 
Теперь у нас есть список пространств имен в нашей системе. Все эти пространства имен будут называться root \ <namespace>, например. root \ DEFAULT, root \ CIMV2 и т. д., поскольку они являются пространствами имен в корневом пространстве имен.
 
ПРИМЕЧАНИЕ. Один странно интригующий факт заключается в том, что пространство имен по умолчанию в WMI — это не root \ DEFAULT, а скорее root \ CIMV2 (так было с Windows 2000).
 
То же самое можно сделать с помощью командлета CIM Get-CimInstance, где нет необходимости:
 
Get-CimInstance -Namespace root -ClassName __Namespace
 
namespace  Наступательный WMI - Изучение пространств имен, классов и методов
 
Хорошо, теперь все отсортировано, а как насчет вложенных пространств имен? Мы уже видели, что под корневым пространством имен есть несколько пространств имен. Мы можем просто написать сценарий, который рекурсивно получает пространства имен (из PSMag):
Function Get-WmiNamespace {
    Param (
        $Namespace='root'
    )
    Get-WmiObject -Namespace $Namespace -Class __NAMESPACE | ForEach-Object {
            ($ns = '{0}\{1}' -f $_.__NAMESPACE,$_.Name)
            Get-WmiNamespace $ns
    }
}
 
namespace  Наступательный WMI - Изучение пространств имен, классов и методов
 
 
ПРИМЕЧАНИЕ. Классы и пространства имен могут отличаться от машины к машине в зависимости от доступного оборудования, установленных приложений и многих других факторов.
 

Классы

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

Класс WMI представляет определенный элемент в вашей системе. Это может быть что угодно, от системных процессов до оборудования (например, сетевой карты), услуг и т.д.

Теперь классы разделены на 3 основные категории (это требование стандарта CIM):

  • Основные классы: они применимы ко всем областям управления и предоставляют несколько основных функций. Обычно они начинаются с двойного подчеркивания (например, __SystemSecurity).
  • Общие классы: это расширения основных классов, применимые к конкретным областям управления. Вы определите их, когда увидите класс с префиксом CIM_ (например, CIM_TemperatureSensor).
  • Расширенные классы: это дополнительные дополнения к общим классам, основанные на технических стеках. (например, Win32_Process).
Классы делятся на следующие типы:
 
  • Абстрактные классы: это шаблоны для определения новых классов.
  • Статические классы: в основном используются для хранения данных.
  • Динамические классы: они получаются от поставщика и представляют управляемый WMI
  • Классы ассоциации: описывает отношения между классами и управляемыми ресурсами.

Классы листинга

Хватит теории. Попробуем найти какие-нибудь классы. И снова мы можем использовать командлет Get-WmiObject для вывода списка доступных классов:

Get-WmiObject -Class * -List

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

Get-WmiObject -Class *user* -List

wmiclasses  Наступательный WMI - Изучение пространств имен, классов и методов

То же самое можно сделать и с помощью командлета Get-CimClass:

Get-CimClass -ClassName *user*

cimclasses  Наступательный WMI - Изучение пространств имен, классов и методов

ПРИМЕЧАНИЕ. Список всех классов Win32 можно найти в документации по классам Microsoft. Провайдер Win32 предоставляет классы для 4 различных категорий: классы оборудования компьютерных систем, классы операционных систем, классы счетчиков производительности и классы управления службами WMI.

Помните, мы говорили о динамических классах, которые предоставляют нам экземпляры? Чтобы получить только динамические классы, мы можем использовать переключатель —QualifierName командлета Get-CimClass:

Get-CimClass -ClassName *user* -QualifierName dynamic

dynamicclasses  Наступательный WMI - Изучение пространств имен, классов и методов

Все идет нормально. Что дальше? Запросы к классам, чтобы получить от них самое интересное.

Получение классов

На этот раз нас интересует класс Win32_UserAccount. Получить данные просто:

Get-WmiObject -Class Win32_UserAccount

users  Наступательный WMI - Изучение пространств имен, классов и методов

СОВЕТ: Чтобы получить более подробное резюме , вы можете передать указанную выше команду в Powershell Format-List или fl, например: Get-WmiObject -Class Win32_UserAccount | fl *, который даст вам все, что может предложить класс.

Командлет CIM Get-CimInstance также можно использовать для получения той же информации:

Get-CimInstance -ClassName Win32_UserAccount

users  Наступательный WMI - Изучение пространств имен, классов и методов

Теперь у нас есть список всех учетных записей пользователей в системе.

Обратим внимание на процессы, запущенные в системе. Класс Win32_Process дает нам список процессов, запущенных в системе:

Get-WmiObject -Class Win32_Process

Нередко в системе выполняется множество процессов, из-за которых ваш терминал может бесконечно прокручиваться. Чтобы избежать этого, мы можем использовать переключатель —Filter, чтобы получить конкретный процесс, который мы ищем (здесь мы выбрали lsass.exe):

Get-WmiObject -Class Win32_Process -Filter 'name="lsass.exe"'

processes

Альтернативный вариант командлета CIM Get-CimInstance в этом случае дает более короткое и полное заключение (и он также поддерживает переключатель —Filter):

Get-CimInstance -ClassName Win32_Process

processes

Идиоматическое выражение, делающее то же самое с WQL, выглядит следующим образом:

Get-WmiObject -Query 'select * from win32_process where name="lsass.exe"'

Хорошо, теперь мы знаем о перечислении, извлечении и фильтрации экземпляров классов в WMI. Давайте теперь посмотрим, как работает удаление экземпляров WMI.

Удаление экземпляров классов

Remove-WmiObject (для командлетов WMI) и Remove-CimInstance (для командлетов CIM) — это два командлета, которые могут удалять экземпляры. Вы можете передать вывод соответствующей команды командлетам. Для быстрой демонстрации давайте запустим наше любимое приложение-счетчик и составим список процесса.

calc

Что произойдет, если мы направим команду в Remove-CimInstance? Мы просто убиваем процесс.

Get-CimInstance -ClassName Win32_Process -Filter 'name="calculator.exe"' | Remove-CimInstance

calc

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

Методы

Методы — это способы управления объектами WMI. Если вы прокрутите до места, где мы перечислили все доступные классы, вы увидите столбец под названием «Методы», в котором перечислены доступные методы.

Методы листинга

Чтобы повторить нашу работу и перечислить все доступные методы, мы можем сделать что-то вроде:

Get-CimClass -MethodName *

Чтобы отфильтровать экземпляры, которые позволяют нам выполнять определенный метод, мы можем передать имя метода, например, Create (что всегда интересно, потому что может позволить нам что-то создать):

Get-CimClass -MethodName Create

create

Чтобы еще больше сузить круг вопросов, чтобы перечислить доступные методы для определенного класса, нам нужно использовать Powershell’s selectс переключателем —ExpandProperty:

С участием Get-WmiObject:

Get-WmiObject -Class Win32_Process -List | select -ExpandProperty Methods

С участием Get-CimClass:

Get-CimClass -ClassName Win32_Process | select -ExpandProperty CimClassMethods

classmethods

ПРИМЕЧАНИЕ. Обратите внимание, что значение, переданное в инструкцию select, — это имя столбца, которое мы получили при перечислении классов. Если вы запутались, прокрутите до абзаца, в котором мы перечислили класс, и обратите внимание на разницу вывода между выводом командлетов WMI и CIM.

Итак, у нас есть такие методы, как Create, Terminate, GetOwner, GetOwnerSid и т. д. Для класса Win32_Process. Очень хорошо. Теперь давайте посмотрим, как мы можем использовать методы.

СОВЕТ: Чтобы использовать метод, нам нужно знать, какие параметры нам нужно предоставить при вызове метода. Чтобы перечислить все доступные параметры, мы можем использовать комбинацию Powershell или лучше просто прочитать документацию.

Использование методов

Invoke-WmiMethod (для WMI) и Invoke-CimMethod(для командлетов CIM) позволяет нам использовать методы для определенного класса. Попробуем создать счетчик:

Invoke-WmiMethod -Class Win32_Process -Name Create -ArgumentList calc.exe

calcspawn

Чтобы использовать командлет CIM, синтаксис немного меняется:

Invoke-CimMethod -ClassName Win32_Process -MethodName create -Arguments @{commandline="calc.exe"}

calcspwn

Что ж, теперь мы знаем о создании новых процессов.
 

Установка свойств объектов

И последнее, но не менее важное: мы должны взглянуть на обновление экземпляров класса. Однако важно помнить, что экземпляр должен быть доступен для записи. Написав скрипт, мы можем составить способ для получения всех доступных для записи свойств класса. Вот сценарий (получен из PSMag):

$class = [wmiclass]'<class_name>'
$class.Properties | ForEach-Object {
      foreach ($qualifier in $_.Qualifiers) {
           if ($qualifier.Name -eq "Write") {
                $_.Name
           }
      }
}
В нашем примере мы будем использовать класс Win32_OperatingSystem, у которого есть записываемое свойство с именем Description(по сути, описание ОС).
 
osdesc
 
Давайте обновим имя свойства до PewOS, используя `Set-WmiInstance:
 
osdesc
 
То же самое можно было бы достичь с помощью Set-CimInstance, но это оставлено на усмотрение читателя.
 

Заключение

Это было долгое чтение! Но теперь к настоящему времени у нас есть прочная основа для командлетов WMI и CIM и того, как их можно использовать для достижения значительного контроля над системой. Спасибо всем кто присутствовал и читал статьи. Всем здоровья.

 

 

 
 
 
 
Click to rate this post!
[Total: 1 Average: 5]

Leave a reply:

Your email address will not be published.