Inicio / Blog / Cómo prevenir un bypass de antivirus

Cómo prevenir un bypass de antivirus

Publicado el 29/12/2022, por INCIBE
mano rompiendo escudo de piedra

El antivirus es una herramienta útil en la prevención, detección y eliminación de procesos maliciosos dentro del sistema, teniendo como objetivos adicionales evitar la propagación de elementos malintencionados y la protección del sistema de almacenamiento.

Debido a que este tipo de software va evolucionando, adaptándose al tipo de amenazas y proporcionando funciones adicionales, existe una amplia variedad de opciones.

Una de estas opciones son los EDR (Endpoint Detection and Response), cuya finalidad es identificar, detectar y prevenir amenazas avanzadas (APT) proporcionando monitorización y análisis continuo del endpoint y de la red.

Aunque estos sistemas suelen facilitar la gestión de las amenazas y permitir acciones a nivel de red, en la detección de amenazas se siguen utilizando métodos basados en motores, los cuales determinarán el número de amenazas que van a ser capaces de detectar.

Existen diferentes tipos o métodos en los que se basan los antivirus:

  • Detección por firmas o estático: buscando coincidencias en una base de datos de firmas (patrones creados para detectar cierta secuencia de bytes) que está almacenada en el propio equipo o en un sistema ubicado en la misma red que el equipo que queremos analizar. Por lo general, cada fabricante es el encargado de agregar y actualizar las firmas de su base de datos, siendo esta razón por la que un programa malicioso puede ser detectado por algunos fabricantes y no por otros. El principal problema de estos antivirus es que es posible evadir la protección utilizando un malware totalmente nuevo o bien modificando parte de los existentes. Además, si no tienen la base de datos actualizada, es más fácil realizar este tipo de ataques.
  • Detección por ejecución dinámica o sandbox: mediante la utilización de un entorno controlado y con restricción de procesos, el antivirus es capaz de ejecutar software detectando sus acciones maliciosas.
  • Heurístico: técnica de detección de payloads maliciosos mediante la definición de algunas reglas y algoritmos, de forma que si el código contiene un determinado conjunto de código, instrucciones o segmentos ejecutables que realizan determinadas acciones que podrían resultar maliciosas, se activa la alerta.
  • Basado en comportamiento: esta técnica analiza el comportamiento del archivo binario y lo clasifica en malicioso y no malicioso, por ejemplo, un archivo que contenga una reverse shell (proceso que intenta conectar con una máquina atacante proporcionando una shell interactiva) podría ser detectado si el antivirus detecta que eso es normalmente un comportamiento malicioso, independientemente de si el archivo malicioso tiene firmas asociadas. Este tipo de antivirus tienen un problema general y es la tasa de falsos positivos, es decir, detecciones de aplicaciones legítimas como programas maliciosos. Esto hace que aumente la carga de gestión y revisión de estas alertas.

Cabe mencionar también la funcionalidad de desempaquetado de ficheros o de código, que se encuentra presente en muchos antivirus y que hace posible analizar el contenido de ficheros comprimidos, o incluso el contenido de unidades de disco en máquinas virtuales o archivos ISO. Un archivo ISO permite almacenar un sistema de ficheros en un solo archivo. Su nombre se debe a los estándares ISO 9660 o 13346.

Técnicas de evasión

Las técnicas de evasión consisten en aplicar ciertos cambios en el código malicioso para evadir la protección de los antivirus. Pueden clasificarse en función de qué y cómo se realizan estos cambios:

  • Malware residente en disco: cuyas técnicas de evasión se basan en modificar los archivos almacenados en la máquina víctima.
  • Malware residente en memoria: aquellas que trabajan a nivel de memoria, sin necesidad de almacenarse en disco.

Debemos tener en cuenta que para lograr evadir un antivirus es muy probable que haya que utilizar una combinación de varias técnicas, ya que los antivirus son capaces de detectar el comportamiento malicioso de varias formas.

Ofuscación

Es una técnica que consiste en ocultar el código malicioso en el código legítimo del proceso. Si tenemos un código que es detectado por los antivirus, ya que existe una firma de este, podríamos aplicar una serie de cambios, como, por ejemplo, reordenaciones de código, añadiendo código muerto o cambiando la semántica de las instrucciones existentes, para que cambie su firma y resulte más difícil de detectar. 

La ofuscación es especialmente útil para bypasear los antivirus basados en firmas, pero no funcionaría con los basados en comportamiento.

Existen multitud de herramientas de código abierto para modificar payloads (parte del código del malware que realiza la acción maliciosa en el sistema) y evadir antivirus. A continuación, vamos a explicar algunas de las herramientas que se usan normalmente. Estas herramientas no funcionan para bypasear muchos de los antivirus actuales, ya que estos también identifican las variantes de recodificación. 

  • Msfvenom es un framework para Linux que combina una biblioteca de payloads y una de codificadores (encoders), de forma que te permite generar un payload ofuscado directamente.
  • Veil es una herramienta para Linux que permite generar payloads ofuscados de metasploit (framework de código abierto con un conjunto de herramientas para explotar vulnerabilidades). Otras herramientas similares a Veil pueden ser GreatSCT, Unicorn, Shelter, etc.
  • Py2Exe es una extensión de Python que convierte los scripts de Python en programas ejecutables de Windows, capaces de ejecutarse sin necesidad de una instalación de Python. Esta herramienta funciona muy bien para bypasear antivirus en una máquina Windows. Además, se puede utilizar junto con Msfvenom para convertir un payload generado con algún encoder en un ejecutable de Windows.
  • Invoke-Obfuscation es un ofuscador de scripts de Powershell. 

También cabe mencionar la existencia de varios scripts que permiten bypasear la seguridad de la mayoría de las versiones de Windows Defender utilizando ofuscación:

  • Hoaxshell: script que te permite obtener una shell reversa ofuscada.
  • Mimikatz Ofuscator: script para ofuscar la herramienta Mimikatz (robo de credenciales).

Conocer el tipo de herramientas utilizadas nos va a facilitar su detección en el sistema, por ejemplo, mediante la comparación de los hashes o utilizando herramientas adicionales a los propios antivirus.

Es recomendable actualizar nuestros antivirus y sus bases de datos de firmas y utilizar un antivirus mixto que use firmas, pero que también compruebe comportamientos anómalos.

La utilización de reglas Yara no es efectiva, teniendo en cuenta que solo con cambiar una parte de la cadena a detectar el sistema ya no detectaría la amenaza, por lo que es recomendable utilizarlas como una capa de protección adicional, siempre en combinación con otras.

Cifrado

Mediante esta técnica se modifica criptográficamente el código del programa o ejecutable, creando también una función o subproceso para el descifrado que se oculta durante el envío, haciendo que el programa cifrado no pueda ser inspeccionado por el antivirus.

Posteriormente, se descifrará el código en memoria, dejando el código malicioso ejecutable en el disco, por lo que el antivirus no podría eliminarlo antes de ejecutarlo.

Este tipo de técnica tiene a su vez dos subtécnicas: el código oligomórfico, en el que el malware utiliza varios descifradores utilizando uno distinto cada vez que se ejecuta en el sistema, y el polimórfico, en el que el malware utiliza sistemas más sofisticados para elegir un descifrador con el que pueda cargar y comprobar que el código cifrado coincide realmente con el descifrado que vaya a utilizar.

Empaquetado

Actualmente, los empaquetadores no solo reducen el tamaño del ejecutable, sino que también crean una estructura binaria completamente nueva para el archivo. Esto permite en ocasiones eludir dichos motores.

La mayoría de las técnicas de desempaquetado utilizan numerosas técnicas de autoinyección que inyectan un shellcode o blob en una región predefinida de la memoria, transfiriendo así la ejecución al código inyectado y sobrescribiendo después su propio proceso.

Protecciones software

Estas protecciones, que se diseñaron para evitar el reversing, el debugging y el testeo de código en procesos de emulación, también pueden ser utilizadas para engañar a los antivirus, creando una carga útil bajo los protectores y enviándola a la víctima.

Inyección de procesos en memoria

Haciendo uso de los manejadores (handles) de la API de Windows para los procesos que ya se estén ejecutando o donde se poseen permisos de ejecución, es posible crear hilos en la memoria que se cargarán y ejecutarán automáticamente, eludiendo el antivirus.

Mediante la función OpenProcess() abriremos uno de estos procesos y le asignaremos memoria mediante VirtualAllocEx() para posteriormente escribir en él con WriteProcessMemory(). El siguiente paso será obtener el handle, GetModuleHandle(), y la dirección del proceso, GetProcessAddress(), con los cuales seremos capaces de crear nuestro propio hilo remoto en memoria, utilizando CreateRemoteThread().
 

Esquema creación de subprocesos remotos en otros proceso

- Creación de subprocesos remotos en otros proceso (Proceso Víctima). Fuente.-

Este método se puede detectar identificando el uso de determinadas llamadas a la API de Windows, como CreateRemoteThread, SuspendThread/SetThreadContext/ResumeThread o QueueUserAPC/NtQueueApcThread, y otras que pueden utilizarse para modificar la memoria dentro de otro proceso, como VirtualAllocEx/WriteProcessMemory.

Inyección de DLL

Este método es idéntico a la inyección de procesos en memoria. Aquí inyectamos la DLL en memoria y se ejecuta. Este método no es el mismo que la inyección de la DLL en el disco y su llamada a través de LoadLibrary().

La forma de mitigarlo es la misma que para los ataques de inyección de memoria, es decir, detectando las llamadas que se utilizan para llevarlo a cabo.

Intercepción de llamadas a funciones

Este método se basa en crear una subrutina dentro de una función legítima, básicamente añadiendo código y cambiando el curso del flujo de ejecución, de tal forma que durante la ejecución de la función legítima el código malicioso también se ejecute de forma inadvertida para el antivirus.

Reemplazo de procesos legítimos

Esta técnica consiste en reemplazar procesos legítimos en estado suspendido por procesos duplicados que contienen el código malicioso para posteriormente reanudar el proceso suspendido, conduciendo a la ejecución de código arbitrario en el sistema. Para sustituir el proceso será necesario determinar la dirección del proceso legítimo mediante PEB.imageBaseAddress.

La forma más efectiva de evitarlo es mediante la detección del parentesco entre los procesos padre e hijo, comparando las estructuras PEB y VAD o detectando protecciones de memoria sospechosas.

Buenas prácticas

Llegados a este punto, ¿cómo podemos evitar que los atacantes evadan nuestro antivirus?

No hay una forma completamente efectiva, debemos contar con una configuración robusta en nuestros sistemas y redes, así como conocer todas las técnicas utilizadas por los atacantes para intentar prevenirlas, detectarlas y dar respuesta a ellas de forma apropiada.

Como medidas de protección, generales y aplicables a todos los sistemas operativos, se recomienda:

  • Actualizar nuestros sistemas y componentes: la mayoría de las actualizaciones del sistema o las aplicaciones solucionan fallos de seguridad o vulnerabilidades que pueden ser aprovechadas por los atacantes. Por lo tanto, tener un equipo actualizado evitará la explotación exitosa de vulnerabilidades conocidas.
  • Listas blancas de programas y librerías legítimas que pueden instalarse en los equipos: tener una lista de recursos que pueden ser instalados en los equipos nos protege de que cualquier atacante instale su malware, debido a que la configuración del equipo se lo impediría.
  • Prevenir la ejecución: es necesario tener controlada la ejecución de procesos. En muchos casos, esta facilidad está incorporada en los EDR. Si no fuera el caso, pueden utilizarse herramientas externas o realizarlo con la gestión de permisos del equipo. 
  • Detección de eventos: mediante herramientas de monitorización del sistema, como, por ejemplo, Sysmon de Windows Sysinternals, que nos proporcione  información detallada sobre la creación de procesos, además de las conexiones de red y los cambios en la hora de creación de los archivos. Al recopilar los eventos que genera, mediante herramientas de colección de eventos o agentes SIEM, y analizarlos posteriormente, se pueden identificar actividades malintencionadas o anómalas y comprender cómo funcionan los intrusos y el malware en la red.
  • Detección estática: para realizar análisis estático y dinámico o incluso detectar la inyección de procesos, puede utilizarse Yara. Esta herramienta permite identificar y clasificar muestras de malware y definir indicadores de compromiso (IOC).

Conclusiones

Podemos concluir que los antivirus son una medida de seguridad necesaria, pero que no nos garantizan, per se, una protección total de los equipos. Como hemos observado, existen diversas formas de evadir estos antivirus y conseguir ejecutar código malicioso. Por lo tanto, será necesario implementar mecanismos adicionales básicos, como la concienciación, seguridad perimetral y control de acceso. Esto dificulta que un atacante consiga acceder a los equipos, pero incluso si acceden, el tenerlos actualizados y con los permisos correspondientes, aumenta la complejidad para completar una evasión del sistema antivirus con éxito.