ВВЕДЕНИЕ
Допустим, «Администратор» попадает на целевой сетевой хост и хочет осмотреться и «администрировать» систему, не загружая никаких новых инструментов… Как я могу это сделать, не сжигая ни один из моих инструментов Script Kiddie?
WMI или Инструментарий управления Windows или Управляемая инфраструктура Windows — это интерфейс для управляемых компонентов, который предоставляет данные и операции потребителям или пользователям. В частности, WMI — это реализация Microsoft стандартов Web-Based Enterprise Management (WBEM) и Common Information Model (CIM). Этот жаргон в основном означает, что у вас есть способ манипулировать системными данными и наблюдать за ними. Это могут быть данные о самой системе, приложениях, сетях, устройствах, процессах и т. д., и все это может быть чрезвычайно полезно для среднего Script Kiddie, пытающегося получить информацию о цели. К счастью, WMI является частью операционной системы начиная с Windows 2000 (хотя с тех пор он претерпел некоторые обновления).
WMI может быть мощным инструментом для администраторов (и Script Kiddies), поскольку он имеет дополнительное преимущество, заключающееся в возможности сбора и/или обработки информации на удаленном компьютере. Правильно, вы можете использовать WMI для проведения расширенной разведки или даже для управления этими системами с помощью удаленных подключений WMI. Эти подключения осуществляются через DCOM или удаленное управление Windows (WinRM), в котором используется протокол WS-Management на основе SOAP. Маловероятно, что вы сможете сделать это извне сети, но, оказавшись внутри, вы сможете собирать все виды информации или даже способствовать боковому перемещению.
Но подождите, это еще не все! WMI можно использовать программно через сценарии или приложения. Эти программы можно использовать для автоматизации административных задач (или гнусных операций Script Kiddie) в локальных или удаленных системах. И Microsoft была чрезвычайно полезна, сделав WMI доступным для программистов с любым опытом, включая C/C++, Visual Basic, языки .NET и различные языки Windows Script Host (WSH), такие как VBScript и JScript. На самом деле почти все распространенные языки программирования, включая Python, имеют библиотеки, поддерживающие COM. Наконец, Microsoft также создала довольно простой в использовании интерфейс командной строки для WMI под названием WMI Command-Line Utility (Wmic.exe). Более того, WMI был легко доступен через PowerShell, начиная с Windows 7.
АРХИТЕКТУРА WMI
Ух ты. WMI звучит как идеальный инструмент «администратора». Как это работает? Откуда он берет все эти данные?
Как уже упоминалось, WMI — это реализация Microsoft WBEM, использующая стандарты CIM, опубликованные DMTF. WMI использует единую модель и интерфейс, что означает, что клиентским программам и системным администраторам не нужно изучать различные API-интерфейсы операционных систем или многочисленные форматы данных. Дополнительным преимуществом этой схемы является то, что функциональные возможности некоторых из этих базовых API-интерфейсов операционной системы доступны для языков сценариев или удаленных операторов, которые в противном случае не имели бы возможности вызывать эти API-интерфейсы.
Архитектура WMI разработана с использованием шаблона потребитель-поставщик. В этом шаблоне потребитель — это клиентский сценарий или администратор, которому нужны данные, а поставщик — это сервер или управляемый объект, предоставляющий данные о системе или ресурсе. WMI — это инфраструктура, которая соединяет их, и на приведенной ниже диаграмме показано, как все работает вместе. Разработчики могут использовать WMI для просмотра и внесения изменений в объекты CIM, а поставщик, в свою очередь, будет извлекать или изменять данные базового ресурса.
На этой диаграмме нижний уровень представляет поставщиков WMI. Поставщик — это COM-объект, который управляет системным ресурсом для WMI. Эти управляемые объекты могут быть физическими или логическими компонентами, такими как процессор или процесс. Эти поставщики подобны драйверам устройств в том смысле, что они действуют как интерфейс между пользователем и нижележащими объектами. Поставщики обычно состоят из файла DLL, загружаемого службой WMI (WMIPSrv.exe), но они также могут содержаться в исполняемых файлах автономной службы. Поставщик представляет базовый компонент с помощью класса, определенного в файле формата управляемых объектов (MOF). Операционная система поставляется с многочисленными встроенными поставщиками, включая поставщика реестра, который используется для доступа к реестру Windows через класс StdRegProv. В дополнение к предоставлению доступа к некоторым свойствам базового компонента провайдер может также предоставлять методы для управления системными компонентами, такие как StdRegProv.CreateKey().
Средний уровень диаграммы — это сама инфраструктура WMI. Эта инфраструктура является компонентом операционной системы и реализована в виде службы WMI (WinMgmt). Инфраструктура состоит из двух частей: ядра и репозитория. Репозиторий организован в виде пространств имен и содержит определения всех классов поставщиков WMI. Служба WMI действует как посредник между поставщиками и потребителями. Когда потребитель запрашивает данные у поставщика, служба загружает поставщика (если он еще не загружен) и динамически извлекает данные о компоненте. Потребитель также может получать уведомления от поставщика, подписавшись на определенные события.
Наконец, верхний уровень архитектуры WMI — это уровень потребителя. Это приложение или сценарий, который пользователь использует для взаимодействия с инфраструктурой WMI. Потребитель может перечислять данные, запрашивать, запускать методы или подписываться на события. Потребители обычно используют COM API или Scripting API для WMI. Это пространство, где играет большинство пользователей и разработчиков. Вся информация компьютера доступна, если вы просто знаете, как получить к ней доступ!
ИСПОЛЬЗОВАНИЕ WMI
ХОРОШО. Я вижу значение в WMI. Он предлагает «администраторам» кладезь данных. Как я на самом деле его использую? Я думаю, вы упомянули что-то о сценариях.
Как уже упоминалось, WMI на самом деле является способом просмотра и/или изменения системных данных, и к нему можно получить доступ программно, используя COM или через API сценариев. Это означает, что вы можете использовать WMI из скомпилированного клиентского приложения или простого скрипта. WMI — это всего лишь инфраструктура, которая упрощает взаимодействие с базовыми поставщиками данных. Таким образом, пользователь выступает в роли потребителя данных, а системные службы — в роли поставщика. Большинство пользователей будут работать на этом уровне; тем не менее, можно реализовать собственный поставщик данных, но это выходит за рамки этого введения в WMI для Script Kiddies, поэтому следите за обновлениями в будущем блоге об использовании этого следующего уровня.
Поскольку WMI — это всего лишь набор API-интерфейсов, его легко интегрировать в скомпилированные программы C/C++ с помощью COM-объектов IWbem или в сборки .NET с помощью System. Классы менеджмента. WMI можно автоматизировать с помощью сценариев языков WSH, таких как VBScript и JScript. Кроме того, существует множество готовых приложений, доступных для системного администрирования через WMI, включая инструменты Microsoft, такие как командная строка WMI, средство тестирования WBEM, CIM Studio, средство WinRM и PowerShell. Использование этих инструментов может занять некоторое время, чтобы привыкнуть и понять язык запросов WMI (WQL).
КОМАНДНАЯ СТРОКА WMI
Командная строка WMI (Wmic.exe) предоставляется Microsoft и встроена в Windows. Он предоставляет довольно простой и удобный интерфейс для WMI. Он совместим с существующими оболочками и служебными командами. Он также имеет интерактивный режим и неинтерактивный режим и включает большое количество псевдонимов, команд и глобальных переключателей. Хотя он чрезвычайно прост и доступен, он не позволяет вызывать методы, принимающие объекты WMI. Тем не менее, он достаточно мощный для большинства администраторов и Script Kiddies.
ИНСТРУМЕНТ ДЛЯ ТЕСТЕРА WBEM
Инструмент тестирования WBEM (wbemtest.exe) включен в установку WMI в качестве диагностического инструмента, но он также позволяет администраторам и разработчикам выполнять множество запросов и операций из графического интерфейса. Графический интерфейс позволяет пользователям перечислять, открывать, создавать и удалять классы и экземпляры. Вы также можете выполнять запросы данных и событий и выполнять методы. Все эти операции можно выполнять локально или удаленно. Недостатком является то, что пользовательский интерфейс сложен, и этот графический интерфейс может быть не оптимальным для Script Kiddies.
CIM СТУДИЯ
CIM Studio является частью комплекта разработки программного обеспечения WMI. Это устаревший инструмент, поэтому он может быть недоступен. Если он доступен, его можно использовать для изучения классов WMI, включая свойства, методы и ассоциации. Опять же, он не является широко доступным, поэтому, вероятно, не очень полезен для Script Kiddies, но это еще один инструмент, о котором следует знать.
ИНСТРУМЕНТ WINRM
WinRM — это реализация Microsoft протокола WS-Management, протокола на основе SOAP. Он предоставляет системам общий способ доступа и обмена информацией и данными управления. Эти данные предоставляет WMI. WinRM доступен через объекты сценариев, удаленную оболочку Windows (WinRS) или в инструменте командной строки WinRM. WinRM является частью Windows, но для получения данных с удаленного компьютера необходимо настроить и включить службу WinRM. По умолчанию службы WinRM прослушивают TCP-порт 5985, но их можно настроить для использования SSL через TCP-порт 5986. Эти порты должны быть разрешены через брандмауэр, который обычно предназначен для внутреннего администрирования сети. Инструмент командной строки способен выполнять большинство задач, но может быть более незнакомым, чем PowerShell, который также может получить удаленный доступ к WMI с помощью WinRM.
POWERSHELL
PowerShell — это кроссплатформенная командная строка с собственным языком сценариев. Это более современная и многофункциональная оболочка по сравнению с командной строкой Windows по умолчанию. Оболочка и язык сценариев поддерживают объекты, облегчающие перечисление WMI, запросы и вызовы методов. Язык сценариев обычно используется для автоматизированного системного администрирования, поскольку он может легко использовать среду выполнения .NET Common Language Runtime (CLR) и объекты. Его легко расширять с помощью модулей, классов и командлетов. На самом деле Windows поставляется со многими командлетами специально для взаимодействия с WMI, включая те, что показаны на снимке экрана ниже:
Windows PowerShell, вероятно, является самым простым способом подключения к WMI на удаленном компьютере и в локальной системе. На удаленные WMI-соединения влияет брандмауэр, но, как уже упоминалось, удаленное администрирование обычно разрешено внутри. PowerShell может работать через DCOM с помощью WinRM (который заменяет DCOM и является рекомендуемым протоколом удаленного управления). При подключении к удаленному компьютеру с помощью PowerShell пользователь указывает удаленный компьютер, учетные данные для доступа к удаленному компьютеру и уровень проверки подлинности/олицетворения для подключения. Это может облегчить удаленное «администрирование», также известное как перечисление сети и горизонтальное перемещение в языке Script Kiddie.
WQL
Теперь, когда вы знаете некоторые инструменты, доступные для использования WMI, нам нужно обсудить, как использовать WMI. Почти все эти инструменты полагаются на WQL для взаимодействия с WMI и базовыми классами и объектами. WQL — это подмножество языка структурированных запросов (SQL) с небольшими изменениями для поддержки WMI. Для более подробного ознакомления с языком посетите веб-сайт Microsoft (https://docs.microsoft.com/en-us/windows/win32/wmisdk/wql-sql-for-wmi), но для начала мы нужно понять всего несколько вещей. Как следует из языка, WQL — это запросы, которые можно разбить на запросы данных, запросы событий и запросы схемы. Запросы данных используются для получения информации о классах и экземплярах и являются наиболее распространенным типом запросов. Запросы событий можно использовать для регистрации для получения уведомлений о событиях от определенных поставщиков, а запросы схемы используются для получения информации о самих определениях классов WMI, а не о фактических экземплярах.
Как уже упоминалось, большинство запросов WMI относятся к классам и экземплярам. Делая запрос, вы используете глагол SELECT. Запросы могут использовать предложение WHERE для расширения и настройки. Предложения WHERE могут использовать общие операторы сравнения, включая =, ‹, ›, ‹=, ›= и !=. Существует несколько дополнительных специфичных для WQL операторов для использования с экземплярами классов и строк, включая IS, IS NOT, ISA и LIKE. WQL также может использовать логические операторы и константы, такие как AND, OR, NOT, TRUE и FALSE.
Хотя большинство инструментов позволяют выполнять запросы WMI с помощью WQL, некоторые инструменты имеют дополнительные функции или команды для конкретных приложений. Например, большинство инструментов предлагают способы выполнения функций класса, включая создание, перечисление или уничтожение экземпляров, а также запуск методов в определенных экземплярах. Эти возможности не обязательно используют WQL и могут полагаться на другие языки или глаголы. Дополнительные сведения см. в документации по каждому инструменту. WMIC использует:
- Список — перечислить информацию
- Получить — получить значения
- Call — выполнить метод
- Установить — установить значение свойства
- Создать — создать новый экземпляр
- Удалить — удалить существующий экземпляр
- Assoc — отображать ассоциации
ИНТЕРЕСНЫЙ WMI
Таким образом, WMI содержит много данных И прост в использовании благодаря обилию инструментов, включая те, которые Microsoft так щедро включила в операционную систему. Но какие полезные запросы или команды WMI может захотеть использовать ваш заурядный администратор Script Kiddie?
Как мы видели, WMI и соответствующие инструменты предоставляют простой способ запрашивать, перечислять и изменять системные ресурсы и данные. WMI предоставляет нам API, который легко доступен через скрипты и утилиты. У нас даже есть язык запросов, чтобы помочь нам. Итак, со всем этим доступом и всеми этими инструментами, что мы действительно можем сделать? Варианты бесконечны. Вы, безусловно, можете найти списки команд для системных администраторов и пентестеров, доступных в Интернете. Вот несколько интересных команд WMI, которые следует запомнить предприимчивому Script Kiddie, который просто пытается исследовать и контролировать свой новый мир. В следующих примерах мы будем переключаться между командами WMIC и PowerShell. У каждого из них есть свой собственный синтаксис для конкретной программы, но аналогичная команда может быть создана для любого инструмента.
СПИСОК ВХОДЯЩИХ ПОЛЬЗОВАТЕЛЕЙ
При работе в целевой системе вас могут заинтересовать другие пользователи, вошедшие в систему в данный момент. В следующем примере PowerShell мы используем командлет Get-WmiObject для запроса всех экземпляров Win32_LoggedOnUser и передачи результатов во вторичную оценку, которая отфильтровывает любые входы в систему, сеть или систему.
Get-WmiObject -Query "select * from Win32_LoggedOnUser" | ?{$_.LogonType -notmatch '(Service|Network|System)’}
СПИСОК ПОЛЬЗОВАТЕЛЕЙ ДОМЕНА
WMI можно использовать для запроса информации о домене с помощью LDAP. В следующем примере WMIC команда использует пространство имен LDAP для запроса пользователей домена и получает имя учетной записи SAM.
wmic /NAMESPACE:\\root\directory\ldap PATH ds_user GET ds_samaccountname
В этом примере PowerShell команда получает все объекты Win32_UserAccount, но фильтрует ДОМЕН, равный интересующему вас доменному имени. Обратите внимание, как команда PowerShell выполняет запрос для всех экземпляров класса немного другим методом, чем раньше, без включая конкретный оператор запроса WQL.
Get-WMIObject –Class Win32_UserAccount -Filter "DOMAIN = '<DOMAIN>'"
СПИСОК АДМИНИСТРАТОРОВ ДОМЕНА
Помимо простого перечисления всех пользователей, вас могут заинтересовать только пользователи, входящие в определенную группу. В следующем примере WMIC команда возвращает любой экземпляр win32_groupuser, где имя группы — «администраторы домена», а домен соответствует интересующему вас домену. Обратите внимание на использование предложения WHERE.
wmic path win32_groupuser where (groupcomponent="win32_group.name='domain admins',domain='DOMAIN'")
СПИСОК ЗАПУСКАЕМЫХ ПРОЦЕССОВ
В целевой системе одной из основных частей информации для ситуационной осведомленности является список запущенных процессов, или вас может интересовать какой-то конкретный процесс. В следующем примере WMIC команда возвращает краткий список всех экземпляров процесса с именем svchost.exe. Обратите внимание на краткое описание спецификатора листинга, которое возвращает только подмножество данных для каждого экземпляра.
wmic process where name='svchost.exe' list brief
В следующем примере PowerShell также перечислены все экземпляры svchost.exe.
Get-WmiObject -Class Win32_Process -Filter 'name="svchost.exe"'
А вот эквивалент PowerShell для вывода списка всех экземпляров svchost.exe с помощью запроса WQL:
Get-WmiObject -Query "Select ProcessID,ExecutablePath from Win32_Process where name='svchost.exe'" -Namespace root\cimv2
СОЗДАЙТЕ ПРОЦЕСС
Помимо простого перечисления процессов или других экземпляров WMI, вы также можете вызывать методы классов WMI. Ниже приведена команда WMIC для создания нового процесса с использованием метода «Создать»:
wmic process call create 'calc.exe'
И теперь у нас есть эквивалент PowerShell для создания нового процесса с использованием командлета Invoke-WmiMethod для вызова метода Create Win32_Process.
Invoke-WmiMethod -Class Win32_Process -Name Create -ArgumentList @(calc.exe)
УДАЛЕННЫЕ ОПЕРАЦИИ
Ранее мы упоминали, что помимо выполнения этих запросов и методов WMI в локальной системе, мы также можем подключаться к удаленным системам и получать доступ к их поставщикам WMI. В следующем примере WMIC демонстрируется подключение к «имя_сервера» с использованием указанного имени пользователя и пароля, а затем использование провайдера процесса WMI в удаленной системе для создания нового процесса.
wmic /NODE:"servername" /USER:"yourdomain\administrator" /PASSWORD:password process call create 'calc.exe'
Командлет Invoke-WmiMethod в PowerShell также может работать с удаленной системой, указав ComputerName и передав авторизованные учетные данные. Учетные данные также можно передать в команду, предварительно создав объект учетных данных с помощью командлета Get-Credential в PowerShell.
Invoke-WmiMethod -Class Win32_Process -Name Create - ArgumentList 'calc.exe'
-ComputerName 'servername' -Credential 'targetdomain\targetuser'
СПИСОК ПРОДУКТОВ AV
Помимо процессов и пользователей, вас также могут заинтересовать установленные приложения или, в частности, антивирусные продукты. Что ж, у WMI для удобства есть поставщик такой информации. В этом примере WMIC команда запрашивает все экземпляры антивирусных продуктов и получает свойства displayName, productState и pathToSignedProductExe из каждого экземпляра. Обратите внимание, что этот поставщик находится в пространстве имен \\root\securitycenter2.
wmic /namespace:\\root\securitycenter2 path antivirusproduct GET displayName, productState, pathToSignedProductExe
А вот эквивалент PowerShell для запроса этих экземпляров AntiVirusProduct:
Get-WmiObject -Namespace root\SecurityCenter2 -Class AntiVirusProduct
ОБНАРУЖЕНИЕ ВИРТУАЛИЗАЦИИ
Помимо обнаружения антивирусных продуктов, большинство Script Kiddies может интересоваться тем, работают ли они в виртуализированной среде. Один из способов обнаружить это — проверить серийный номер BIOS. В этом примере PowerShell мы опрашиваем все экземпляры Win32_BIOS, чтобы узнать, содержат ли они строку «VMware». Обратите внимание на использование сопоставления строк с подстановочными знаками в фильтре.
Get-WmiObject Win32_BIOS -Filter 'SerialNumber LIKE "%VMware%"'
НАЙТИ ИНТЕРЕСНЫЕ ФАЙЛЫ
Наконец, давайте попробуем найти интересные файлы с помощью WMI. Возможно, вас заинтересует любой файл, содержащий «пароль» в имени файла. Этот пример WMIC запрашивает все файлы данных на «C:», имя которых содержит «пароль», и получает имя, размер и возможность чтения. Опять же, обратите внимание на использование сопоставления строк с подстановочными знаками в фильтре имени.
wmic DATAFILE where "drive='C:' AND Name like '%password%'" GET Name,readable,size /VALUE
ЗАКЛЮЧЕНИЕ
Это потрясающе. Я обязательно буду использовать WMI в следующий раз, когда мне нужно будет «администрировать» новый сетевой хост-жертву (который полностью принадлежит мне). Иногда Microsoft просто так помогает, предоставляя инструменты для нас, администраторов Script Kiddie.
WMI, безусловно, упрощает задачу администрирования рабочих станций и сети. В дополнение ко всей информации и простому интерфейсу существует множество инструментов, позволяющих воспользоваться преимуществами WMI, и некоторые из них предоставлены Microsoft и доступны по умолчанию в системах Windows. Script Kiddies и администраторы могут использовать эти инструменты для запроса классов и экземпляров WMI, а также для вызова методов этих классов и экземпляров. Количество доступных данных огромно, а возможность доступа к этим данным и манипулирования ими является мощной; но, как известно, с большой силой приходит и большая ответственность. Итак, убедитесь, что вы знаете, что делаете, прочитайте документацию, попробуйте некоторые из этих полезных команд и, как обычно, проверьте возвращаемые значения.
ИСПОЛЬЗОВАННАЯ ЛИТЕРАТУРА
https://en.wikipedia.org/wiki/Windows_Management_Instrumentation
https://docs.microsoft.com/en-us/windows/win32/wmisdk/
https://www.ethicalhacker.net/features/root/wmi-101-for-pentesters/
https://kwcsec.gitbook.io/the-red-team-handbook/techniques/enumeration/recon-commands/wmic-commands
Первоначально опубликовано на https://www.trustedsec.com 20 января 2022 г.