Cazando comandos remotos de versiones viejas de PowerShell con RemotePSpy

Ya sabéis que PowerShell es muy usado por los "rojirrins" debido a su poder y flexibilidad. Y también que no sólo los comandos y los scripts se pueden ejecutar en una sesión local de PowerShell, sino que también es posible (y muy normal) ejecutar PowerShell en un host remoto. Esto puede ayudar a un atacante a moverse lateralmente y evitar dejar un script en disco.

Desde el punto de vista de los "azulones", la dificultad para detectar y responder a una sesión de PowerShell remota varía mucho según la versión de PowerShell que se esté utilizando. Las versiones más modernas incluyen funciones de logging total que pueden incluir una transcripción completa de sesiones completas de PowerShell con todas las entradas y salidas. Pero las versiones anteriores tienen un registro mucho más rudimentario que puede hacer muy difícil saber exactamente qué sucedió en una sesión determinada.

Para enfrentarnos a esta situación como "hunters" podemos usar RemotePSpy, una herramienta que puede obtener el detalle completo de lo que sucede en las sesiones remotas de PowerShell, tanto en las versiones más nuevas de PowerShell como en las más antiguas.

RemotePSpy ofrece una vista que se aproxima a lo que se mostraría en la pantalla del atacante cuando está ejecutando PowerShell en remoto. En el siguiente GIF se muestra a la izquierda la pantalla del atacante y a la derecha la vista de RemotePSpy.


Una cosa interesante acerca de las sesiones interactivas es que realmente puede ver cuando el atacante usa la pestaña completa, que usa el comando TabExpansion por debajo.

Al mismo tiempo que se muestra la pantalla de forma interactiva, todas las entradas y salidas también se registran en RemotePSpy.log de forma más detallada:


Las sesiones no interactivas funcionan de la misma manera. Un script ejecutado desde un archivo o en un ScriptBlock pasado en la línea de comandos se enviará al host remoto, donde se registra su contenido, seguido de su salida.

A continuación se muestra un ejemplo de la ejecución de Add-NetUser desde PowerView en PowerSploit para agregar una cuenta de administrador local a un host remoto a través de PowerShell (la secuencia de comandos se ha reducido por brevedad, la función original está en https://github.com/PowerShellMafia /PowerSploit/blob/master/Recon/PowerView.ps1).
 2019-01-07 11:00:25,503 - RemotePSpy.simple_cmd - INFO - Runspace: 506ddad2-79cc-4dd9-8c98-60c836c1c3b9, Pipeline: 56e3f7dd-e082-4354-8236-e25eec70b875, Destination: 2, Command: function Add-NetUser {  
 <# 
   .SYNOPSIS 
     Adds a domain user or a local user to the current (or remote) machine,     
 < .... SNIP .... > 
     else { 
       Add-NetGroupUser -UserName $UserName -GroupName $GroupName -ComputerName $ComputerName
       "[*] User $UserName successfully added to group $GroupName on host $ComputerName" 
     } 
   } 
 } 
 Add-NetUser -UserName AcidBurn -Password H@cktheplanet -ComputerName latmov-win7-02 
 2019-01-07 11:00:29,325 - RemotePSpy.simple_cmd - INFO - Empty message data in PIPELINE_OUTPUT message. Runspace: 506ddad2-79cc-4dd9-8c98-60c836c1c3b9, Pipeline: 56e3f7dd-e082-4354-8236-e25eec70b875, Destination: 1
 2019-01-07 11:00:29,325 - RemotePSpy.simple_cmd - INFO - Runspace: 506ddad2-79cc-4dd9-8c98-60c836c1c3b9, Pipeline: 56e3f7dd-e082-4354-8236-e25eec70b875, Destination: 1, output: [*] User AcidBurn successfully created on host latmov-win7-02 

Este script agrega al usuario mediante PowerShell puro, por lo que no ve ningún comando específico para agregar al usuario en el destino, solo un proceso wsmprovhost.exe que aloja el PowerShell remoto. Sin el logging detallado de las nuevas versiones de PowerShell, sería casi imposible saber qué sucedió en esta sesión remota, pero RemotePSpy puede revelar lo que sucedió.

Instalación y funcionamiento

RemotePSpy puede ser instalado via pip:

pip install remotepspy

Simplemente ejecuta RemotePSpy.exe para iniciar la supervisión y el registro, y presiona Enter otra vez cuando haya terminado. El registro se escribirá en el directorio de trabajo actual, denominado RemotePSpy.log.

La herramienta también volcará una réplica aproximada de lo que el usuario de PowerShell remoto vería en su pantalla a la salida estándar, junto con la información más detallada en el archivo de registro.

Tambien tenemos el código fuente en Github:

https://github.com/countercept/RemotePSpy

Si echáis un vistazo al código, hay un registro completo en diferentes capas en el protocolo. Cada nombre del registrador Python está definido por una constante LOGGER_NAME en cada clase dentro del código, y algunos registros especialmente útiles que puede generar se muestran en la tabla a continuación. Estos permiten obtener un seguimiento completo del protocolo en varias capas.


RemotePSpy utiliza el seguimiento de eventos para Windows (ETW) para obtener los datos necesarios para decodificar una sesión remota de PowerShell. De forma predeterminada, utiliza el proveedor Microsoft-Windows-WinRM, pero también es posible usar Microsoft-Windows-PowerShell, aunque este último hace cierto seguimiento del estado en el que el código debe ser un poco más complejo.

El proveedor de WinRM proporciona un seguimiento completo de los mensajes de WinRM. Ya sabéis que WinRM es un protocolo de administración remota para Windows y puede realizar muchas tareas. Uno de ellos es ser la capa de transporte para el protocolo remoto de PowerShell (PSRP). Por lo tanto, es posible decodificar este tráfico WinRM, extraer la capa PSRP y decodificarlo para averiguar qué está sucediendo dentro de una sesión remota de PowerShell.

El proveedor de PowerShell nos permite obtener el protocolo PSRP directamente, pero debido a la forma en que se presentan los datos hace que sea un poco más difícil realizar un seguimiento preciso del contexto del "shell" en el que se ejecuta un comando PowerShell determinado. En la versión actual, esto puede producir algunas advertencias innecesarias en la traza, por lo que el proveedor WinRM se utiliza de forma predeterminada.

Fuente: https://countercept.com/blog/remotepspy-remote-powershell-visibility-for-older-versions

Comentarios