Это четвертая часть серии "Offensive WMI", в которой больше внимания уделяется сбору информации и ее перечислению. WMI предоставляет множество классов, из которых мы можем перечислить множество вещей. Так что давайте погрузимся в неё, не теряя больше времени.
Сбор основной информации
В наших предыдущих статьях мы уже видели множество классов, которые предоставляют нам ценную информацию о системе, например StdRegProv для реестра, Win32_Process для процессов, запущенных в системе, Win32_Bios для информации о BIOS и т. д. Давайте попробуем изучить еще немного.
Информация о хосте/ОС
Знакомство с хостом/ОС - очень простой шаг, когда дело доходит до разведки. WMI имеет два класса, а именно Win32_OperatingSystem и Win32_ComputerSystem, которые предоставляют нам соответствующую информацию. В нашем примере мы будем отфильтровывать ненужную информацию, чтобы печатать только необходимую информацию.
Get-WmiObject -Class win32_computersystem -Property bootupstate,username,totalphysicalmemory,systemtype,systemfamily,domain,dnshostname,oemstringarray
Таким образом, большая часть информации, которая у нас есть сейчас, помогает нам в одном важном деле - выяснить, находимся ли мы в эмулируемой среде. Состояние загрузки для нашего текущего запуска указывает на то, что система не была загружена в отказоустойчивом режиме. Мы также можем видеть, что наш текущий пользователь - pew, а ящик не является частью какого-либо домена AD. Мы также получаем доступную для использования архитектуру процессора и оперативную память. Это полезно, например, для обнаружения виртуальных машин - если количество логических процессоров меньше 4, а доступная оперативная память меньше 2 гигабайт, то вероятность того, что устройство является виртуальной машиной, высока. Конечно, те же данные выдают свойства SystemFamily и OEMStringArray, но в контролируемых средах могут быть и другие индикаторы.
Другой класс Win32_OperatingSystem также предоставляет нам много полезной информации:
Get-WmiObject -Class win32_operatingsystem | fl *
Список каталогов
Листинг файлов в системе - очень фундаментальная операция. В WMI есть класс Win32_Directory, который помогает в перечислении файлов. В качестве альтернативы существует другой класс с именем CIM_DataFile, который также можно использовать для достижения той же цели.
Get-WmiObject -Class win32_directory
Часто бывает полезен поиск шаблонов файлов с использованием подстановочных знаков. Мы можем использовать аргумент -Filter командлета, чтобы добиться чего-то подобного. Допустим, нас интересуют пути к каталогам, в которых есть папка, называемая снимками. Запрос с помощью WMI будет выглядеть так:
Get-WmiObject -Class win32_directory -Filter 'name LIKE "%snapshots%"'
AV
Один из первых шагов, когда дело доходит до разведки, - это получить, какой продукт обеспечивает безопасность системы. WMI предоставляет класс AntiVirusProduct в пространстве имен root\SecurityCenter2, который содержит информацию об антивирусной программе, установленной в системе. В моем случае это Защитник Windows по умолчанию.
Get-WmiObject -Namespace root\securitycenter2 -Class antivirusproduct
Сервисы
Службы в системе Windows аналогичны демонам Unix или просто процессам, не связанным с пользовательским интерфейсом, работающим в фоновом режиме. Это полезная информация, когда дело доходит до повышения привилегий, особенно в случаях, когда есть служба, созданная SYSTEM со слабыми правами доступа к файлам.
Чтобы перечислить службы, нам нужно использовать класс Win32_Service. В нашем примере мы будем печатать только те службы, которые инициируются LocalSystem (или NT Authority\System). Обратите внимание на использование специальной утилиты Powershell, которая значительно расширяет вывод.
Get-WmiObject -Class win32_service -Filter 'startname="localsystem"' | select *
WMI также предоставляет несколько методов для взаимодействия со службами. Они позволяют создавать, удалять, запускать, останавливать, возобновлять, обновлять и многие другие возможности для управления службами. Чтобы перечислить методы, доступные в классе Win32_Service, мы можем использовать следующую команду:
Get-WmiObject -Class win32_service -List | select -ExpandProperty methods
Зарегистрированные пользователи
Получить авторизованных пользователей в системе довольно просто. Существует два класса - Win32_LoggedOnUser и Win32_LogOnSession, которые содержат сведения о сеансе и пользователях, вошедших в систему. Запрос класса от привилегированного пользователя дает нам гораздо больше информации о вошедших в систему пользователях:
Get-WmiObject -Class win32_loggedonuser
Из вышесказанного мы видим, что каждый вошедший в систему пользователь имеет LUID (локально уникальный идентификатор). Некоторые LUID предопределены. Например, LUID для сеанса входа в систему для системной учетной записи всегда 0x3e7 (999 десятичное), LUID для сеанса сетевой службы - 0x3e4 (996), а для локальной службы - 0x3e5 (997). Большинство других LUID генерируются случайным образом.
Каждый вошедший в систему пользователь определяет свои зависимости через свойство Dependent. Мы можем получить список идентификаторов входа в систему, тип аутентификации, время начала и объем каждого сеанса, используя класс Win32_LogOnSession:
Get-WmiObject -Class win32_logonsession | select authenticationpackage,logonid,starttime,scope
Установленные патчи
Часто бывает полезно перечислить обновления/исправления, установленные на машине. Если в системе отсутствуют важные исправления, это может открыть легкую возможность скомпрометировать систему одним быстрым выстрелом. В WMI есть класс Win32_QuickFixEngineering, который содержит информацию об установленных обновлениях и исправлениях безопасности. Запрос класса - это несложно:
Get-WmiObject -Class win32_quickfixengineering
Журналы событий
Класс Win32_NtLogEvent дает нам полезные данные о журналах событий, захваченных системой. Мы можем запросить его следующим образом:
Get-WmiObject -Class win32_ntlogevent
Каждая запись журнала содержит такие сведения, как время, источник, создавший событие, серьезность и сообщение. Серьезность указывается свойством Type в выходных данных. Говоря о типах событий, есть пять различных уровней, которые показаны в таблице ниже:
Конечно, мы можем использовать переключатель -Filter для поиска определенных типов событий.
Ресурсы
Класс Win32_Share представляет общий ресурс в системе. Это может быть дисковод, принтер, межпроцессное взаимодействие или другие совместно используемые устройства. В корпоративных сетях обычно много общих ресурсов, которые могут пригодиться во время теста на проникновение. Давайте посмотрим, как мы можем перечислить доступные ресурсы:
Get-WmiObject -Class win32_share | select type,name,allowmaximum,description,scope
В приведенном выше примере мы отфильтровали только необходимую полезную информацию с помощью select. У нас есть тип общего ресурса, имя, разрешение на одновременный доступ, описание и объем каждого доступного общего ресурса из выходных данных команды. Еще раз, типы - это константы, которые определяют тип разделяемых ресурсов:
AllowMaximum - это логическое свойство, указывающее, был ли ограничен одновременный доступ к ресурсу. Если установлено значение True, то нет ограничений на общий доступ, что в противном случае может указывать на то, что в ресурсе есть что-то конфиденциальное, или, что лучше, может быть отслеживание клиентов, обращающихся к общему ресурсу.
WMI также предоставляет такие методы, как Create, SetShareInfo и Delete для создания, обновления и удаления общих ресурсов.
Информация о сети
Сетевая информация предоставляется классом Win32_IP4RouteTable. Это дает нам детали, аналогичные команде ipconfig, но гораздо более детально.
Get-WmiObject -Class win32_ip4routetable
Говоря о сетевых вещах, я хотел бы упомянуть еще один полезный класс под названием Win32_NetworkAdapter. Запросы к нему могут дать нам полезную информацию о сетевом оборудовании, имеющемся в системе. Это, в свою очередь, полезно для обнаружения виртуальных машин, например, мы можем запустить следующие запросы, чтобы определить, виртуализирована ли система с помощью VMWare:
Get-WmiObject -Class Win32_NetworkAdapter -Filter 'name like "%vmware%"'
Get-WmiObject -Class Win32_NetworkAdapter -Filter 'manufacturer like "%vmware%"'
Учетные записи пользователей
Информация об учетной записи пользователя предоставляется классом Win32_UserAccount. Для локальной системы по умолчанию существует всего несколько учетных записей, наиболее распространенными из которых являются администратор, гость, локальные пользователи и защитник Windows (WDAGUtilityAccount). Мы можем быстро получить список пользователей с помощью:
Get-WmiObject -Class win32_useraccount
Однако для подключенного к домену устройства или контроллера домена будет несколько других, включая krbtgt, sqladmin, webadmin и т. д. Для настройки Windows Server 2012 по умолчанию есть всего 3 учетных записи, как показано ниже.
Группы пользователей
Подобно учетным записям пользователей, информация о группах пользователей предоставляется классом Win32_Group. Запросить класс в локальном ящике очень просто:
Get-WmiObject -Class win32_group
Если та же команда выполняется в корпоративной среде, например в сети, присоединенной к домену, количество групп увеличится, что даст нам более широкое представление о группах пользователей, присутствующих в сети. Сюда также будут входить локальные, текущий домен, доверенный домен и доверенный лес:
Теневое копирование - это технология, включенная в Microsoft Windows, которая может создавать резервные копии или моментальные снимки файлов или томов, даже когда они используются.
Для взаимодействия с теневыми копиями у нас есть 2 доступных метода, как показано на рисунке ниже:
Создать быструю теневую копию просто, нам просто нужно указать объем и контекст создания копии:
(Get-WmiObject -Class win32_shadowcopy -List).create("C:\", "ClientAccessible")
Чтобы добавить к этому, мы можем создать символическую ссылку, чтобы легко получить доступ к теневой копии из нашего локального проводника:
$link = (Get-WmiObject -Class win32_shadowcopy).deviceobject + "/"
cmd /c mklink /d C:\shadowcopy "$link"
Когда у нас будет готовая к использованию теневая копия, мы можем просто запустить такие инструменты, как Invoke-SessionGopher.ps1 https://github.com/Arvanaghi/SessionGopher/blob/master/SessionGopher.ps1 с параметром -Thorough для поиска секретов в файловой системе. Это даст сохраненную информацию о сеансе для PuTTY, WinSCP, FileZilla, SuperPuTTY, RDP и т. д. В моем случае я нашел несколько сохраненных сеансов RDP и сеансов PuTTY с использованием сценария.
Заключение
Итак, это все о сборе информации через WMI для одной статьи в блоге. Мы увидели, как с легкостью можно собрать столько полезных данных всего несколькими нажатиями клавиш. Конечно, представленная выше информация не является исчерпывающей, и есть бесконечные возможности, которые следует учитывать, когда дело доходит до разведки.
На этом пока, ребята, я встречусь с вами в нашем следующей статье, который будет посвящен перечислению Active Directory через WMI.
Сбор основной информации
В наших предыдущих статьях мы уже видели множество классов, которые предоставляют нам ценную информацию о системе, например StdRegProv для реестра, Win32_Process для процессов, запущенных в системе, Win32_Bios для информации о BIOS и т. д. Давайте попробуем изучить еще немного.
Информация о хосте/ОС
Знакомство с хостом/ОС - очень простой шаг, когда дело доходит до разведки. WMI имеет два класса, а именно Win32_OperatingSystem и Win32_ComputerSystem, которые предоставляют нам соответствующую информацию. В нашем примере мы будем отфильтровывать ненужную информацию, чтобы печатать только необходимую информацию.
Get-WmiObject -Class win32_computersystem -Property bootupstate,username,totalphysicalmemory,systemtype,systemfamily,domain,dnshostname,oemstringarray
Таким образом, большая часть информации, которая у нас есть сейчас, помогает нам в одном важном деле - выяснить, находимся ли мы в эмулируемой среде. Состояние загрузки для нашего текущего запуска указывает на то, что система не была загружена в отказоустойчивом режиме. Мы также можем видеть, что наш текущий пользователь - pew, а ящик не является частью какого-либо домена AD. Мы также получаем доступную для использования архитектуру процессора и оперативную память. Это полезно, например, для обнаружения виртуальных машин - если количество логических процессоров меньше 4, а доступная оперативная память меньше 2 гигабайт, то вероятность того, что устройство является виртуальной машиной, высока. Конечно, те же данные выдают свойства SystemFamily и OEMStringArray, но в контролируемых средах могут быть и другие индикаторы.
Другой класс Win32_OperatingSystem также предоставляет нам много полезной информации:
Get-WmiObject -Class win32_operatingsystem | fl *
Список каталогов
Листинг файлов в системе - очень фундаментальная операция. В WMI есть класс Win32_Directory, который помогает в перечислении файлов. В качестве альтернативы существует другой класс с именем CIM_DataFile, который также можно использовать для достижения той же цели.
Get-WmiObject -Class win32_directory
Часто бывает полезен поиск шаблонов файлов с использованием подстановочных знаков. Мы можем использовать аргумент -Filter командлета, чтобы добиться чего-то подобного. Допустим, нас интересуют пути к каталогам, в которых есть папка, называемая снимками. Запрос с помощью WMI будет выглядеть так:
Get-WmiObject -Class win32_directory -Filter 'name LIKE "%snapshots%"'
AV
Один из первых шагов, когда дело доходит до разведки, - это получить, какой продукт обеспечивает безопасность системы. WMI предоставляет класс AntiVirusProduct в пространстве имен root\SecurityCenter2, который содержит информацию об антивирусной программе, установленной в системе. В моем случае это Защитник Windows по умолчанию.
Get-WmiObject -Namespace root\securitycenter2 -Class antivirusproduct
Сервисы
Службы в системе Windows аналогичны демонам Unix или просто процессам, не связанным с пользовательским интерфейсом, работающим в фоновом режиме. Это полезная информация, когда дело доходит до повышения привилегий, особенно в случаях, когда есть служба, созданная SYSTEM со слабыми правами доступа к файлам.
Чтобы перечислить службы, нам нужно использовать класс Win32_Service. В нашем примере мы будем печатать только те службы, которые инициируются LocalSystem (или NT Authority\System). Обратите внимание на использование специальной утилиты Powershell, которая значительно расширяет вывод.
Get-WmiObject -Class win32_service -Filter 'startname="localsystem"' | select *
WMI также предоставляет несколько методов для взаимодействия со службами. Они позволяют создавать, удалять, запускать, останавливать, возобновлять, обновлять и многие другие возможности для управления службами. Чтобы перечислить методы, доступные в классе Win32_Service, мы можем использовать следующую команду:
Get-WmiObject -Class win32_service -List | select -ExpandProperty methods
Зарегистрированные пользователи
Получить авторизованных пользователей в системе довольно просто. Существует два класса - Win32_LoggedOnUser и Win32_LogOnSession, которые содержат сведения о сеансе и пользователях, вошедших в систему. Запрос класса от привилегированного пользователя дает нам гораздо больше информации о вошедших в систему пользователях:
Get-WmiObject -Class win32_loggedonuser
Из вышесказанного мы видим, что каждый вошедший в систему пользователь имеет LUID (локально уникальный идентификатор). Некоторые LUID предопределены. Например, LUID для сеанса входа в систему для системной учетной записи всегда 0x3e7 (999 десятичное), LUID для сеанса сетевой службы - 0x3e4 (996), а для локальной службы - 0x3e5 (997). Большинство других LUID генерируются случайным образом.
Каждый вошедший в систему пользователь определяет свои зависимости через свойство Dependent. Мы можем получить список идентификаторов входа в систему, тип аутентификации, время начала и объем каждого сеанса, используя класс Win32_LogOnSession:
Get-WmiObject -Class win32_logonsession | select authenticationpackage,logonid,starttime,scope
Установленные патчи
Часто бывает полезно перечислить обновления/исправления, установленные на машине. Если в системе отсутствуют важные исправления, это может открыть легкую возможность скомпрометировать систему одним быстрым выстрелом. В WMI есть класс Win32_QuickFixEngineering, который содержит информацию об установленных обновлениях и исправлениях безопасности. Запрос класса - это несложно:
Get-WmiObject -Class win32_quickfixengineering
Журналы событий
Класс Win32_NtLogEvent дает нам полезные данные о журналах событий, захваченных системой. Мы можем запросить его следующим образом:
Get-WmiObject -Class win32_ntlogevent
Каждая запись журнала содержит такие сведения, как время, источник, создавший событие, серьезность и сообщение. Серьезность указывается свойством Type в выходных данных. Говоря о типах событий, есть пять различных уровней, которые показаны в таблице ниже:
| Value | Meaning |
|---|---|
| 1 | Error |
| 2 | Warning |
| 4 | Information |
| 8 | Security Audit Success |
| 16 | Security Audit Failure |
Конечно, мы можем использовать переключатель -Filter для поиска определенных типов событий.
Ресурсы
Класс Win32_Share представляет общий ресурс в системе. Это может быть дисковод, принтер, межпроцессное взаимодействие или другие совместно используемые устройства. В корпоративных сетях обычно много общих ресурсов, которые могут пригодиться во время теста на проникновение. Давайте посмотрим, как мы можем перечислить доступные ресурсы:
Get-WmiObject -Class win32_share | select type,name,allowmaximum,description,scope
В приведенном выше примере мы отфильтровали только необходимую полезную информацию с помощью select. У нас есть тип общего ресурса, имя, разрешение на одновременный доступ, описание и объем каждого доступного общего ресурса из выходных данных команды. Еще раз, типы - это константы, которые определяют тип разделяемых ресурсов:
| Value | Meaning |
|---|---|
| 0 | Disk Drive |
| 1 | Print Queue |
| 2 | Device |
| 3 | IPC |
| 2147483648 | Disk Drive Admin |
| 2147483649 | Print Queue Admin |
| 2147483650 | Device Admin |
| 2147483651 | IPC Admin |
AllowMaximum - это логическое свойство, указывающее, был ли ограничен одновременный доступ к ресурсу. Если установлено значение True, то нет ограничений на общий доступ, что в противном случае может указывать на то, что в ресурсе есть что-то конфиденциальное, или, что лучше, может быть отслеживание клиентов, обращающихся к общему ресурсу.
WMI также предоставляет такие методы, как Create, SetShareInfo и Delete для создания, обновления и удаления общих ресурсов.
Информация о сети
Сетевая информация предоставляется классом Win32_IP4RouteTable. Это дает нам детали, аналогичные команде ipconfig, но гораздо более детально.
Get-WmiObject -Class win32_ip4routetable
Говоря о сетевых вещах, я хотел бы упомянуть еще один полезный класс под названием Win32_NetworkAdapter. Запросы к нему могут дать нам полезную информацию о сетевом оборудовании, имеющемся в системе. Это, в свою очередь, полезно для обнаружения виртуальных машин, например, мы можем запустить следующие запросы, чтобы определить, виртуализирована ли система с помощью VMWare:
Get-WmiObject -Class Win32_NetworkAdapter -Filter 'name like "%vmware%"'
Get-WmiObject -Class Win32_NetworkAdapter -Filter 'manufacturer like "%vmware%"'
Учетные записи пользователей
Информация об учетной записи пользователя предоставляется классом Win32_UserAccount. Для локальной системы по умолчанию существует всего несколько учетных записей, наиболее распространенными из которых являются администратор, гость, локальные пользователи и защитник Windows (WDAGUtilityAccount). Мы можем быстро получить список пользователей с помощью:
Get-WmiObject -Class win32_useraccount
Однако для подключенного к домену устройства или контроллера домена будет несколько других, включая krbtgt, sqladmin, webadmin и т. д. Для настройки Windows Server 2012 по умолчанию есть всего 3 учетных записи, как показано ниже.
Группы пользователей
Подобно учетным записям пользователей, информация о группах пользователей предоставляется классом Win32_Group. Запросить класс в локальном ящике очень просто:
Get-WmiObject -Class win32_group
Если та же команда выполняется в корпоративной среде, например в сети, присоединенной к домену, количество групп увеличится, что даст нам более широкое представление о группах пользователей, присутствующих в сети. Сюда также будут входить локальные, текущий домен, доверенный домен и доверенный лес:
System secrets
Системные секреты - это снова полезная информация, которую стоит получать, когда дело доходит до разведки. Если у нас достаточно прав в системе, мы можем создавать теневые копии диска и пытаться извлечь оттуда секреты. Но перед этим для тех из вас, кто не знаком с теневыми копиями:Теневое копирование - это технология, включенная в Microsoft Windows, которая может создавать резервные копии или моментальные снимки файлов или томов, даже когда они используются.
Для взаимодействия с теневыми копиями у нас есть 2 доступных метода, как показано на рисунке ниже:
Создать быструю теневую копию просто, нам просто нужно указать объем и контекст создания копии:
(Get-WmiObject -Class win32_shadowcopy -List).create("C:\", "ClientAccessible")
Чтобы добавить к этому, мы можем создать символическую ссылку, чтобы легко получить доступ к теневой копии из нашего локального проводника:
$link = (Get-WmiObject -Class win32_shadowcopy).deviceobject + "/"
cmd /c mklink /d C:\shadowcopy "$link"
Когда у нас будет готовая к использованию теневая копия, мы можем просто запустить такие инструменты, как Invoke-SessionGopher.ps1 https://github.com/Arvanaghi/SessionGopher/blob/master/SessionGopher.ps1 с параметром -Thorough для поиска секретов в файловой системе. Это даст сохраненную информацию о сеансе для PuTTY, WinSCP, FileZilla, SuperPuTTY, RDP и т. д. В моем случае я нашел несколько сохраненных сеансов RDP и сеансов PuTTY с использованием сценария.
Заключение
Итак, это все о сборе информации через WMI для одной статьи в блоге. Мы увидели, как с легкостью можно собрать столько полезных данных всего несколькими нажатиями клавиш. Конечно, представленная выше информация не является исчерпывающей, и есть бесконечные возможности, которые следует учитывать, когда дело доходит до разведки.
На этом пока, ребята, я встречусь с вами в нашем следующей статье, который будет посвящен перечислению Active Directory через WMI.