Ir al contenido

WMI

Por

Madurezreviewed
Última revisión
Publicado
Última actualización

Windows Management Instrumentation (WMI) ofrece un modelo de objetos para describir y administrar el sistema: clases, instancias, propiedades, métodos y eventos. Ese modelo no obliga a usar un único protocolo de red. Una consulta CIM puede llegar mediante WS-Management, mientras una operación clásica de WMI usa DCOM y puertos RPC dinámicos.

La separación entre modelo y transporte evita una conclusión frecuente: 135/tcp abierto solo confirma el RPC Endpoint Mapper. Todavía faltan el endpoint dinámico, los permisos DCOM, la ACL del namespace y el permiso sobre la operación concreta. Del mismo modo, poder leer Win32_OperatingSystem no concede Win32_Process.Create. La enumeración mantiene cada capacidad ligada a namespace, clase, método, transporte y token.

Los ejemplos usan TARGET_IP, FQDN, DOMAIN, USERNAME y COMMAND como placeholders.

Nmap confirma RPC Endpoint Mapper, no WMI completo. PowerShell Get-CimInstance usa CIM y puede conectarse mediante WS-Man o DCOM según la sesión creada. Impacket wmiexec utiliza DCOM/RPC para ejecutar un método y recuperar output mediante SMB. Esa ejecución es una comprobación posterior, no el mecanismo de enumeración principal.

Pregunta Herramienta Comprobación
¿es alcanzable RPC Endpoint Mapper? Nmap endpoint dinámico y firewall
¿qué transporte usa la consulta? New-CimSession y opciones WS-Man frente a DCOM
¿qué namespaces y clases puede leer? Get-CimInstance namespace, clase y código de error
¿qué métodos puede ejecutar? permisos WMI y prueba acotada Execute Methods y token efectivo
¿qué hace wmiexec además de WMI? captura y logs DCOM, proceso remoto, SMB y archivo temporal

Empieza por consultas de solo lectura. Win32_Process.Create modifica el host, genera un proceso y no demuestra acceso general a cualquier namespace.

Los objetos WMI se organizan en namespaces. root\cimv2 contiene muchas clases del sistema, como Win32_OperatingSystem, Win32_Process o Win32_Service. Otros productos registran namespaces propios.

Acceder a un namespace no concede automáticamente acceso a todos sus métodos. WMI aplica permisos de ejecución, habilitación remota, lectura de seguridad y escritura por namespace, además del token de acceso de la cuenta.

En administración remota clásica, el cliente contacta con RPC Endpoint Mapper en 135/tcp y recibe un puerto dinámico para el servicio. Firewalls modernos suelen permitir un rango dinámico alto, no un único “puerto WMI”.

Nmap -sV confirma que Endpoint Mapper responde:

Identificar RPC Endpoint Mapper
nmap -sV -p 135 TARGET_IP

El resultado no demuestra que el endpoint dinámico sea alcanzable ni que WMI autorice a la cuenta. Un inventario completo debe conservar los endpoints RPC devueltos y comprobar la ruta hacia ellos.

PowerShell usa los cmdlets CIM para consultar clases e instancias. New-CimSession utiliza WS-Man por defecto. -Credential abre un prompt seguro y conserva la identidad en la sesión:

Consultar sistema operativo y servicios mediante WS-Man
$credential = Get-Credential -Credential 'DOMAIN\USERNAME'
$session = New-CimSession -ComputerName FQDN -Credential $credential
Get-CimInstance -CimSession $session -ClassName Win32_OperatingSystem
Get-CimInstance -CimSession $session -ClassName Win32_Service
Remove-CimSession $session

Para usar DCOM con el mismo modelo, New-CimSessionOption -Protocol Dcom crea las opciones que recibe la sesión:

Consultar WMI mediante DCOM
$option = New-CimSessionOption -Protocol Dcom
$session = New-CimSession -ComputerName FQDN `
-Credential $credential -SessionOption $option
Get-CimInstance -CimSession $session -ClassName Win32_OperatingSystem
Remove-CimSession $session

Si WS-Man funciona y DCOM no, la diferencia puede estar en RPC dinámico, firewall o autenticación, no en la clase WMI. Una consulta de lectura y la invocación de un método son capacidades diferentes.

Para enumerar clases, declara el namespace. Empieza por uno conocido y aplica filtros antes de ampliar:

Enumerar clases del namespace CIMV2
$session = New-CimSession -ComputerName FQDN -Credential $credential
Get-CimClass -CimSession $session -Namespace root\cimv2
Remove-CimSession $session

Enumerar todo un namespace puede devolver miles de clases y activar muchos proveedores WMI. Consulta primero las clases que respondan a una pregunta concreta.

wmiexec.py usa DCOM/WMI para crear procesos y normalmente SMB para recuperar el output. La expresión del destino conserva dominio, usuario y host:

Ejecutar un comando mediante WMI
impacket-wmiexec 'DOMAIN/USERNAME@TARGET_IP' 'COMMAND'

Una ejecución correcta requiere autenticación RPC, permisos DCOM/WMI, capacidad de crear el proceso y acceso SMB al mecanismo de retorno. Si el comando se ejecuta pero no aparece output, investiga esos canales por separado.

El proceso se ejecuta con el token que obtiene el proveedor WMI. Su integridad, grupos y privilegios pueden diferir de una sesión interactiva de la misma cuenta.

Relaciona estado del servicio Winmgmt, repositorio, namespaces, ACL, configuración DCOM, listeners WinRM y reglas de firewall. Los logs WMI-Activity ayudan a distinguir una consulta rechazada de un proveedor que falló al ejecutarla.

La clase de sistema __SystemSecurity permite leer el security descriptor de un namespace cuando la cuenta tiene Read Security. El método no modifica la ACL:

Obtener el security descriptor de CIMV2
Invoke-CimMethod -Namespace root\cimv2 `
-ClassName __SystemSecurity `
-MethodName GetSecurityDescriptor

Interpreta los ACE junto a los permisos WMI: Enable Account, Remote Enable, Execute Methods, Provider Write y Read Security. La membresía en Administradores no evita todos los filtros de UAC remoto, y una ACL de namespace no abre RPC o WinRM en el firewall.

Observación Comprobación siguiente
135 abierto Resolver y alcanzar el endpoint RPC dinámico.
CIM funciona y DCOM no Comparar transporte, firewall y mecanismo de autenticación.
Lectura permitida, método denegado Revisar permisos del namespace y token efectivo.
wmiexec sin output Separar creación del proceso y recuperación mediante SMB.

WMI sobre DCOM contacta primero RPC Endpoint Mapper en TCP/135 y recibe un puerto dinámico. WMI sobre WS-Man utiliza el listener WinRM. Nmap puede enumerar RPC, HTTP, TLS y NTLM, pero no hay un script wmi-* en Nmap 7.99 que modelice namespaces y permisos:

Localizar endpoints RPC
nmap -sV -n -Pn -p 135 --script msrpc-enum TARGET_IP

Valida con Get-CimInstance seleccionando New-CimSessionOption -Protocol Dcom o WS-Man. La misma query y credencial pueden funcionar por un transporte y fallar por otro debido a firewall, UAC remoto, DCOM ACL, WinRM o namespace security.

Empieza por consultas que caractericen host, OS, servicios, procesos y red. Registra namespace, clase, filtro, propiedades, transporte y cuenta. Una clase presente no garantiza permiso para enumerar todas sus instancias ni ejecutar métodos.

La ejecución mediante Win32_Process.Create, service methods o consumers pertenece a movimiento lateral o persistencia según el mecanismo. Un return value de WMI confirma aceptación del método, no que el proceso haya alcanzado su objetivo. Correlaciona PID, cuenta, session 0, salida y proceso observado. Impacket wmiexec crea un flujo operativo adicional para recuperar output y no representa una consulta WMI pura.

RPC server unavailable, access denied, invalid namespace y un timeout separan transporte, autorización y modelo. DCOM puede necesitar un rango dinámico que una comprobación de 135 no cubre. Windows registra WMI-Activity, DCOM/RPC, autenticación y creación de procesos. EDR puede correlacionar el proceso proveedor, el consumidor y el proceso hijo.

No crees permanent event subscriptions durante enumeración. Si una validación crea proceso, fichero o objeto WMI, registra identificadores, elimina el artefacto y confirma mediante una consulta independiente. Cierra CimSessions y procesos auxiliares.

La página de herramientas y automatización separa consultas CIM, DCOM, Impacket y ejecución remota. Usa la checklist para registrar namespace, identidad y efecto. La cheatsheet reúne consultas ya explicadas.