Cómo Scripts PowerShell Evaden la Detección
Cómo Scripts PowerShell Evaden la Detección

Cómo los Scripts maliciosos de PowerShell evaden la Detección

En los últimos años, PowerShell se ha convertido cada vez más en la herramienta favorita de quienes tienen intenciones maliciosas. Después de todo, PowerShell se instala de forma nativa como parte de Windows, tiene la capacidad de interactuar con la mayoría de los componentes del sistema operativo y también tiene capacidades de acceso remoto.

Otra razón por la que los malos actores suelen utilizar PowerShell como vector de ataque es porque puede ser difícil detectar un ataque basado en PowerShell. PowerShell forma parte del sistema operativo Windows, y la actividad maliciosa puede mezclarse fácilmente con la actividad administrativa legítima.

Los Scripts maliciosos de PowerShell se vuelven inteligentes en Sandboxes

En este caso, cuando un profesional de TI descarga un script de PowerShell, suele probarlo en un entorno aislado antes de ejecutarlo en producción. De esta manera, pueden comprobar si el script intenta algún comportamiento dañino. Sin embargo, quienes crean scripts maliciosos están diseñando cada vez más scripts que son capaces de diferenciar entre un entorno de sandbox (aislado) y un entorno de producción. Esto permite al autor del script engañar a los profesionales de TI para que ejecuten el script en su entorno de producción porque el script parece ser inofensivo cuando se ejecuta en un sandbox.

Esto, por supuesto, plantea la cuestión de cómo los autores de scripts maliciosos pueden saber si un script se está ejecutando en un entorno sandbox o no. En realidad, hay varias técnicas diferentes que se utilizan a veces, así que quiero mostrarte algunas.

Comprobar si Script PS se ejecuta en entorno de VirtualBox

VirtualBox es una de las herramientas más utilizadas para probar los scripts de PowerShell. Sin embargo, es relativamente fácil para un script PowerShell averiguar si se está ejecutando dentro de un entorno VirtualBox porque VirtualBox instala componentes en el sistema operativo Windows para ayudarle a funcionar dentro del entorno VirtualBox. Estos componentes funcionan de forma similar a las herramientas de VMware o a los servicios de integración de Hyper-V. Por lo tanto, si un autor de scripts quiere comprobar si su script se está ejecutando en un entorno VirtualBox, entonces todo lo que tiene que hacer es comprobar la presencia de los diversos componentes de VirtualBox.

Uno de estos componentes es el VirtualBox Guest Additions Service, o VBoxService.exe. Aunque un autor de scripts podría construir un script que compruebe la existencia del archivo VBoxService.exe, es igual de fácil utilizar el cmdlet Get-Process para ver si el proceso vboxservice está instalado. Así es como un script de este tipo podría funcionar:

$A = (Get-Process | Select-String -Pattern vboxservice).count
If ($A -GT 0) { $Virtual = $True} Else {$Virtual = $False}
$Virtual

Este bloque de código cuenta las instancias del proceso VBoxService que se están ejecutando en la máquina y luego asigna ese conteo a una variable llamada $A. Si el recuento es mayor que cero, significa que el proceso existe, y la sesión de PowerShell se está ejecutando presumiblemente dentro de VirtualBox. El script crea una variable llamada $Virtual que se establece como $True si el código detecta la presencia del proceso VBoxService y $False si no se detecta el proceso. Puedes ver un ejemplo de esto en la captura de pantalla de abajo.

Comprobar servicio VBoxService en PowerShell
Comprobar servicio VBoxService en PowerShell

Comprobar si Script PS se ejecuta en entorno de Hyper-V

VirtualBox no es el único entorno que se utiliza para probar los scripts de PowerShell. Hyper-V también es un entorno de pruebas muy utilizado. Así como es posible construir un script de PowerShell para detectar si se está ejecutando dentro de una máquina VirtualBox, también es posible probar si una sesión de PowerShell se está ejecutando dentro de una máquina virtual Hyper-V.

La forma más fácil para averiguar si PowerShell se está ejecutando dentro de una máquina virtual Hyper-V es utilizar el cmdlet Get-WmiObject para recuperar la información del sistema de Win32_ComputerSystem. Como se puede ver en la captura de pantalla de abajo, PowerShell realmente te dirá si se está ejecutando en una máquina virtual cuando se ejecuta este comando:

Get-WmiObject -q "Select * from Win32_ComputerSystem"
Comprobar Win32_ComputerSystem para Hyper-V
Comprobar Win32_ComputerSystem para Hyper-V

En caso de que te lo estés preguntando, la captura de pantalla de abajo muestra lo que ocurre si ejecutas este comando en una máquina física.

Comprobar entorno Hyper-V para PowerShell
Comprobar entorno Hyper-V para PowerShell

En algunos casos, el modelo se puede mostrar como System Product Name (Nombre del producto del sistema) cuando trabajas desde un ordenador construido por ti mismo. Si se trata de un sistema suministrado por un proveedor, el modelo se mostraría como Dell, HP, Lenovo o algo similar.

Así es como puedes usar este código para saber si PowerShell se está ejecutando dentro de una máquina virtual Hyper-V:

$A = Get-WmiObject -Q “Select Model From Win32_ComputerSystem”
If ($A.Model -eq “Virtual Machine”) {$Virtual = $True} Else {$Virtual = $False}

La siguiente imagen muestra lo que ocurre cuando se ejecuta este código en una máquina física (obviamente, devuelve false)

Comprobar uso de máquina virtual con PowerShell
Comprobar uso de máquina virtual con PowerShell

¿Tiene el Script permisos de Administrador?

Otra cosa que los autores de scripts maliciosos hacen a veces es incluir una prueba para determinar si un script se está ejecutando en una sesión elevada (de privilegios) de PowerShell. De esta manera, pueden diseñar el script para evitar intentar algo malicioso hasta que se detecten los permisos adecuados. Hay innumerables formas de probar si existen permisos administrativos. Este método fue adaptado de serverfault.com.

Aquí está el código:

$user = [Security.Principal.WindowsIdentity]::GetCurrent();
If ((New-Object Security.Principal.WindowsPrincipal $user).IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator) -eq $True) {$IsAdmin = $True} Else {$IsAdmin = $False}

Este código crea una variable llamada $IsAdmin. Esta variable se establece como $True si el usuario es un miembro del grupo de administradores incorporado y $False si el usuario no lo es. Este código no sólo mira los permisos del usuario, sino también si la sesión de PowerShell ha sido elevada. Aquí hay un ejemplo:

Comprobar si un usuario es administrador con PowerShell
Comprobar si un usuario es administrador con PowerShell

Scripts PowerShell maliciosos que se esconden a la vista

Los autores de malware están creando cada vez más scripts PowerShell maliciosos que están diseñados para ocultar sus verdaderas intenciones. Por lo general, estos scripts se comportarán de forma benigna si se descubre que se ejecutan dentro de una máquina virtual o si carecen de privilegios administrativos, pero realizarán actividades maliciosas cuando se den las condiciones adecuadas. Las técnicas que se muestran en este artículo, aunque no son exhaustivas, ilustran algunas de las formas en que los autores de scripts maliciosos comprueban el entorno en el que se ejecuta su script.

Mi Carro Close (×)

Tu carrito está vacío
Ver tienda