
Espacio de ejecución de PowerShell seguro para OpSec desde C# (también conocido como SharpPick) con AMSI, Modo de Lenguaje Restringido y Registro de Bloques de Script deshabilitados al inicio
Espacio de ejecución de Powershell desde C# (técnica SharpPick) con AMSI, ETW y registro de bloques de script deshabilitados para tu placer.
Hoy en día, cuando Powershell ha sido severamente instrumentado mediante el uso de técnicas como:
Los atacantes avanzados deben encontrar formas de eludir estos esfuerzos para poder llevar a cabo ejercicios sofisticados de simulación adversarial. Para ayudar en estos esfuerzos, se creó el siguiente proyecto.
Este programa se basa en saltos de técnicas específicas incluidas en:
Que a su vez se basaron en las siguientes investigaciones:
La idea de SharpPick, es decir, lanzar scripts de powershell desde un ensamblado C# mediante Runspaces, tampoco es nueva y fue implementada por primera vez por Lee Christensen (@tifkin_) en su:
Además, el código fuente toma prestada la implementación de CustomPSHost de Lee.
Este proyecto hereda de las investigaciones anteriores y de la gran comunidad de seguridad para proporcionar un entorno Powershell casi efectivo con defensas deshabilitadas al inicio.
Ahora se compila fácilmente con .NET 4.0, mientras que si se compila con .NET Framework 4.7.1+ se incluye una funcionalidad adicional que permite descargar las DLL que constituyen los artefactos de omisión de CLM e intenta eliminarlas después (que apenas funciona, para ser honesto).
El mejor rendimiento se obtiene con Stracciatella compilado con .NET 4.0.
Hay varias opciones disponibles:
PS D:\> Stracciatella -h
:: Stracciatella - Espacio de ejecución de Powershell con AMSI, ETW y registro de bloques de script deshabilitados.
Mariusz Banach / mgeeky, '19-22 <[email protected]>
v0.7
Uso: stracciatella.exe [opciones] [comando]
-s <ruta>, --script <ruta> - Ruta al archivo que contiene el script de Powershell a ejecutar. Si no se dan opciones, entrará
en un bucle de pseudo-shell. También puede ser una URL HTTP(S) para descargar y ejecutar el script de powershell.
-v, --verbose - Muestra información detallada
-n, --nocleanup - No eliminar los residuos de desactivación de CLM (archivos DLL en TEMP y claves de registro COM).
Por defecto, siempre se eliminarán.
-C, --leaveclm - No intentar deshabilitar CLM. Más sigiloso. Evitará dejar artefactos de desactivación de CLM sin eliminar.
-f, --force - Proceder con la ejecución incluso si las defensas de Powershell no se deshabilitaron.
Por defecto, abortamos en caso de fallo.
-c, --command - Ejecuta los comandos especificados. Puedes usar -c o añadir comandos después de los
parámetros de stracciatella: cmd> straciatella ipconfig /all
Si se dan parámetros de comando y script, ejecuta el comando después de ejecutar el script.
-x <clave>, --xor <clave> - Considerar la entrada como codificada XOR, donde <clave> es una clave de un byte en decimal
(prefijo con 0x para hexadecimal)
-p <nombre>, --pipe <nombre> - Leer comandos de powershell desde una tubería con nombre especificada. El comando debe ir precedido de 4 bytes de
su longitud codificada en little-endian (notación Longitud-Valor).
-t <milisegundos>, --timeout <milisegundos>
- Especifica el tiempo de espera para la operación de lectura de la tubería (en milisegundos). Predeterminado: 60 seg. 0 - infinito.
-e, --cmdalsoencoded - Considerar que el comando de entrada (especificado en '--command') también está codificado.
Decodifica el comando de entrada después de decodificar y ejecutar el archivo de script de entrada.
Por defecto, solo decodificamos el archivo de entrada y consideramos el comando dado en texto plano.
El programa acepta el comando y la ruta del archivo de script como entrada. Ambos son opcionales; si no se da ninguno, se iniciará una pseudo-shell. Tanto el comando como el script pueden codificarse adicionalmente usando XOR de un solo byte (producirá salida codificada en Base64) para una mejor experiencia OpSec.
Aquí hay un par de ejemplos que presentan casos de uso:
PS D:\> Stracciatella.exe -v
:: Stracciatella - Espacio de ejecución de Powershell con AMSI, ETW y registro de bloques de script deshabilitados.
Mariusz Banach / mgeeky, '19-22 <[email protected]>
v0.7
[.] Versión de Powershell: 5.1
[.] Modo de lenguaje: FullLanguage
[+] No es necesario deshabilitar el Modo de Lenguaje Restringido. Ya está en FullLanguage.
[+] Registro de bloques de script deshabilitado.
[+] AMSI deshabilitado.
[+] ETW deshabilitado.
Stracciatella D:\> $PSVersionTable
Name Value
---- -----
PSVersion 5.1.18362.1
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.18362.1
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
En primer lugar, para preparar las declaraciones codificadas podemos usar el script encoder.py incluido, que se puede usar de la siguiente manera:
PS D:\> python encoder.py -h
uso: encoder.py [opciones] <comando|archivo>
argumentos posicionales:
command Especifica un comando o la ruta del archivo de script para codificar
argumentos opcionales:
-h, --help muestra este mensaje de ayuda y sale
-x KEY, --xor KEY Especifica la clave de codificación XOR para comando/archivo (un byte)
-o PATH, --output PATH
(opcional) Archivo de salida. Si no se da, se mostrará la salida en stdout