• XSS.stack #1 – первый литературный журнал от юзеров форума

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

yashechka

Генератор контента.Фанат Ильфака и Рикардо Нарвахи
Эксперт
Регистрация
24.11.2012
Сообщения
2 344
Реакции
3 563
Это сообщение в блоге является второй частью серии "Offensive WMI" (первая здесь https://0xinfection.github.io/posts/wmi-basics-part-1/ ), и в этой статье основное внимание будет уделено трем основным компонентам WMI, с которыми мы будем в основном иметь дело. На протяжении всей статьи мы будем использовать командлеты WMI и CIM как взаимозаменяемые, так что мы хорошо разбиремся в обоих типах командлетов.

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

Попросту напомним, что такое пространства имен:

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

Все пространства имен в WMI являются экземплярами системного класса __Namespace. Чтобы получить список всех пространств имен в корневом пространстве имен, мы можем запросить тот же класс, используя:

Get-WmiObject -Namespace root -Class __Namespace

1635090926119.png


Вывод содержит много информации, поэтому, чтобы отфильтровать шум, мы можем использовать выбор Powershell:

Get-WmiObject -Namespace root -Class __Namespace | select name

1635090953824.png


Теперь у нас есть список пространств имен в нашей системе. Все эти пространства имен будут называться root\<namespace>, например . root\ DEFAULT, root\CIMV2 и т. д., поскольку они являются пространствами имен в корневом пространстве имен.

ПРИМЕЧАНИЕ. Один странно интригующий факт заключается в том, что пространство имен по умолчанию в WMI - это не root\DEFAULT, а скорее root\CIMV2 (так было с Windows 2000).

То же самое можно сделать с помощью командлета CIM Get-CimInstance.

Get-CimInstance -Namespace root -ClassName __Namespace

1635090974985.png


Хорошо, теперь все отсортировано, а как насчет вложенных пространств имен? Мы уже видели, что под корневым пространством имен есть несколько пространств имен. Мы можем просто написать скрипт, который рекурсивно получает нам пространства имен (из PSMag):

Код:
Function Get-WmiNamespace {
    Param (
        $Namespace='root'
    )
    Get-WmiObject -Namespace $Namespace -Class __NAMESPACE | ForEach-Object {
            ($ns = '{0}\{1}' -f $_.__NAMESPACE,$_.Name)
            Get-WmiNamespace $ns
    }
}

1635091017626.png


ПРИМЕЧАНИЕ. Классы и пространства имен могут отличаться от машины к машине в зависимости от доступного оборудования, установленных приложений и многих других факторов.

Классы

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

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

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

- Основные классы: они применяются ко всем областям управления и предоставляют несколько основных функций. Обычно они начинаются с двойного подчеркивания (например, __SystemSecurity).

- Общие классы: это расширения основных классов, применимые к конкретным областям управления. Вы определите его, когда увидите класс с префиксом CIM_ (например, CIM_TemperatureSensor).

- Расширенные классы: это дополнительные дополнения к общим классам, основанные на технических стеках. (например, Win32_Process).

Классы делятся на следующие типы:

- Абстрактные классы: это шаблоны для определения новых классов.

- Статические классы: в основном используются для хранения данных.

- Динамические классы: они получаются от поставщика и представляют собой управляемый WMI ресурс. Нас больше всего интересуют классы этого типа.

-Ассоциативные классы: описывает отношения между классами и управляемыми ресурсами.

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

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

Get-WmiObject -Class * -List

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

Get-WmiObject -Class *user* -List

1635091055964.png


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

Get-CimClass -ClassName *user*

1635091072163.png


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

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

Get-CimClass -ClassName *user* -QualifierName dynamic

1635091093087.png


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

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

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

Get-WmiObject -Class Win32_UserAccount

1635091113737.png


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

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

Get-CimInstance -ClassName Win32_UserAccount

1635091131451.png


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

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

Get-WmiObject -Class Win32_Process

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

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

1635091265057.png


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

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

Get-CimInstance -ClassName Win32_Process

1635091173231.png
+

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


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

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

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


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

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

1635091296532.png


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

Методы

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

Способы листинга

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

Get-CimClass -MethodName *

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

Get-CimClass -MethodName Create

1635091321040.png


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

С помощью Get-CimClass

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

или так

Get-CimClass -ClassName Win32_Process | select -ExpandProperty CimClassMethods

1635091362764.png


ПРИМЕЧАНИЕ. Обратите внимание, что значение, переданное в инструкцию 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

1635091383868.png


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

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

1635091401547.png


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

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

И последнее, но не менее важное: мы должны взглянуть на обновление экземпляров класса. Однако важно помнить, что экземпляр должен быть доступен для записи. Немного написав скрипт, мы можем составить рецепт для получения всех доступных для записи свойств класса. Вот сценарий (получен из PSMag https://powershellmagazine.com/2012/09/06/pstip-get-all-writeable-properties-of-a-wmi-class/):

1635091411074.png


В нашем примере мы будем использовать класс Win32_OperatingSystem, у которого есть записываемое свойство с именем Description (по сути, описание ОС).

1635091418301.png


Дайте обновим имя свойства до PewOS, используя `Set-WmiInstance:

1635091430059.png


То же самое может быть достигнуто с помощью Set-CimInstance, но это остается на усмотрение читателя. :)

Заключение

Уф, Вы наверное утомились! К настоящему времени у нас есть прочная основа для командлетов WMI и CIM и того, как их можно использовать для достижения значительного контроля над системой. Пока что спасибо за то, что вы здесь, и увидимся все в блоге. Выпью за Ваше здоровье!
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх