martes, 3 de noviembre de 2009

¿Por qué no consigo shell con mi Metasploit?

En muchas ocasiones un pentester se encuentra durante un test de intrusión con un servicio vulnerable y con el exploit en el framework de Metasploit . Ante esta situación tan favorable el pentester se frota las manos, prepara su Metasploit, configura los parametros propios del exploit y lanza el ataque. De manera inesperada, el pentester se encuentra que el resultado no es el deseado pese a que todo parecía pronosticar que así iba a ser.

Cuando se ejecuta un exploit sobre sistemas Microsoft Windows este comportamiento puede venir derivado porque el exploit haya sido realizado para atacar una versión determinada de Microsoft Windows, con un determinado lenguaje, como por ejemplo podría estar preparado para "Microsoft Windows XP SP0 English". Si el pentester lanza el exploit sobre un sistema con "Microsoft Windows XP SP3 Spanish", el exploit no será igual de efectivo que en la versión "English".

Para poder entender bien cómo personalizar nuestros exploits vamos a utilizar el material referenciado en el documento wiki de Metasploit. No nos centraremos en la escritura del exploit, para eso lo mejor es mirar el documento, sino que cogeremos la aplicación warftpd y adaptaremos el exploit (modules/exploits/windows/ftp/warftpd_165_user.rb) para que funcione sobre un "Windows XP SP3 Spanish", target no soportado por defecto por el exploit.

Si visualizamos el contenido del exploit veremos como existe un apartado donde trata los targets y donde nos encontraremos entradas como esta:

------------------------------------------------------------------------------
# Target 1 [ 'Windows XP SP0-SP1 English',

{
'Ret' => 0x71ab1d54 # push esp, ret } ]
......
buf[485, 4] = [ target.ret ].pack('V')
------------------------------------------------------------------------------

A la vista del código queda claro que es necesario modificar la dirección de retorno para adaptarlo a nuestro idioma y Service Pack. Como bien indica el comentario deberemos buscar una dirección de memoria que contenga primero un push esp y después un ret (para entender cómo funciona la pila, los buffers overflows y hacerse una idea de por qué es "push esp, ret" lo que necesita, ver este tutorial; quedando fuera del alcance de este post explicarlo).

Ahora deberemos buscar la dirección de memoria que nos interesa y para ello utilizaremos Ollydbg:

1. Arrancamos la aplicación warftpd:



2. Nos "attacheamos" (perdonar el palabro) al proceso warftpd.exe:



3. Buscamos en la memoria (Letra M de Ollydbg) los opcodes que se corresponden con "push esp, ret", que son "54 3C":



Como se puede ver en la imagen encontramos que en la dirección de memoria 0x71a32b53 existe un "push esp, ret".

4. Añadimos la entrada en el exploit:

# Target 2
[
'Windows XP SP3 Spanish',
{
'Ret' => 0x71a32b53# push esp, ret
}
]
5. Pasamos a ejecutar el exploit

Parametrización del exploit



Lanzamiento del exploit



Observamos la lista de procesos de la máquina con Windows XP SP3 Spanish:



Espero que os sea de utilidad y podáis obtener esa shell que tanto nos gusta.

38 comentarios :

Jose Selvi dijo...

Otra semana pondremos algún mini-tutorial de escribir exploits, así se entenderá mejor lo del "push ret".

De todas maneras, si a alguien le pica mucho la curiosidad, que pregunte y se lo intentaremos explicar.

Anónimo dijo...

Muy buen post, me ha gustado mucho. Es un tema muy interesante y espero que pongais más sobre esta temática.
Seguid asi chicos!!!
Myriam

Anónimo dijo...

Muy buen post!!

El otro día justamente estaba tratando esto, y la verdad no encontré nada que estuviera tan bien explicado como aqui.

Lo del mini-tutorial de escribir exploits estaría muy interesante, sobre todo si lo enfocais dentro de metasploit... que yo llevo ya unas semanas con ello y se le puede sacar mucho!!

Saludos y muy buen post.

Leonardo Pigñer dijo...

Excelente post, muy interesante!

Saludos,
Leonardo

Pedro dijo...

Como todos los post, elegantes y 100 % prácticos.

Gracias!

José Miguel Holguín dijo...

Muchas gracias por los comentarios a todos, así da gusto!

El mini-tutorial pasa al TODO del blog jejeje.

Un saludo y de nuevo gracias.

Ariel M. Liguori de Gottig dijo...

Excelente post! da gusto leerlos y que compartan esto ya que también me he topado con este lio varias veces (una lástima -o no, siempre es bueno machacarse y hacer las cosas uno - que cuando lo hice no los tuviera al lado).

Mis Saludos y felicitaciones!

Jose Selvi dijo...

Gracias Ariel, la verdad es que como más se aprende es haciendo las cosas uno, pero lo bueno es que veas como funciona y que luego lo intentes hacer tú.

Por ejemplo, el exploit no tiene porque estar saltando siempre a una secuencia push-ret, y si el desarrollador no te ha dejado el comentario en el código como en este caso tocará revisar los NOPs y el lugar donde está metiendo el Payload para sabes a que secuencia es necesario que se salte para que funcione el exploit (push-ret, pop-pop-ret, etc)

Lo dicho, prepararemos un pequeño tutorial para escribir exploits. No llegaremos al nivel de Str0ke (milw0rm) pero al menos que de una idea de por donde meterle mano a estas cosas.

Aprovecho que menciono a Str0ke para dar mi pésame. Este martes el fundador de milw0rm falleció a los 35 años debido a un problema cardíaco, según he podido leer.

Espero por su bien que "San Pedro" tenga bien parcheado y bastionado todo, sino Str0ke se lo va a pasar pirata.

Descanse en Paz...

Anónimo dijo...

Jose,

Me gusta vuestro blog. Seguid asi.

btw, str0ker is alive, healthy and well. Era un hoax.

Keyser Soze

Jose Selvi dijo...

Gracias! sí, la verdad es que me he dejado llevar por un Hoax, pero tantos blogs que sigo lo comentaron que lo tome como algo cierto.

Este Internessss, no te puedes fiar de lo que dicen ;P

Andres Buitrago dijo...

Hola Jose primero gracias por estos post, me han aclarado muchas dudas, segundo; mira que tengo una duda xD:
Cuando realizo la busqueda por "push esp, ret" el olly no encuentra nada, tengo que realizar la busqueda uno por uno, pero se supone que tiene que ser un espacio en memoria, que contenga los 3.
Mi pregunta es. ¿Como los buscaste o que estoy haciendo mal?.
Si alguien mas sabe igual gracias

Jose Selvi dijo...

Hola @Andres, en primer lugar la instrucción no es "push esp, ret" sino:

push esp
ret

Son dos instrucciones.

En segundo lugar, seguramente estás usando una de las opciones que tiene el OllyDbg paga buscar comandos o secuencias de comandos. Esa opción no te sirve porque solo busca dentro del módulo donde estás (donde se ha quedado parada la ejecución del programa).

Para buscarlo nosotros lo que hacemos es sacar la secuencia de comandos en hexadecimal y buscar directamente en la memoria del proceso. Puedes ver los detalles en otro de los posts que pusimos hace poco, un poco posterior a este:

http://www.pentester.es/2009/11/exploting-ii-stack-overflow-simple-ii.html

Lo que tú buscas está a partir de la frase "Bueno, pues ya sabemos lo que tenemos que hacer, tenemos que buscar un "push esp; ret" (por ejemplo) ¿Cómo lo hacemos?".

Pegale un ojo y nos dices si te ha servido o no. Si aún así no encuentras nada tendrás que buscar otra secuencia de comandos equivalente como "jmp esp" o algo así.

Saludos y gracias por el comentario :)

Andres Buitrago dijo...

Hola Jose, mira si me funciono segun el otro post que publicaste, pero aun sigo sin entender porque no carga el exploit, lo estoy trabajando con un win SP2 y no carga.
Muestra lo siguiente:
[*] Trying target Windows XP SP2 Español...
[-] Exploit failed: undefined method `put' for nil:NilClass
[*] Exploit completed, but no session was created

Y en el servidor ftp muestra la conexion, osea se que voy bien pero aun hay algun error que no me deja pasar.

Perdon por la preguntadera, y despues que logre finalizar la practica de este post te voy a cansar con los que vengan xD.

Jose Selvi dijo...

Hola @Andres, parece algún error en el propio código del exploit ¿Has tocado algo más aparte de cambiar la dirección del "push esp; ret"?

Pasame por correo lo siguiente:
1) El código final de tu exploit.
2) El "show options" de como lo lanzar, para saber con que parámetros lo estás lanzando.
3) Una captura de red de que pasa cuando lo lanzas en formato pcap (puedes hacerlo con Wireshark, TCPDump o como quieras).

Pasamelo todo por correo, que lo tengo en la ficha personal, y le pegaré un ojo a ver que puede estar pasando.

Gracias por el comentario ;)

Andres Buitrago dijo...

Hola Jose, te comento que reinstale metasploit en la maquina virtual, y desde alli lance el exploit a la real y funciono de maravillas, solo reemplace la dieccion y el nombre de la version. Anteriormente habia agregado mas targets y tal vez eso fue lo que fallo, igual voy a volver a agregar los targets como los tenia antes, te envio el exploit y lo revisas, igual es weno tener las opciones en ingles.
Igual mil gracias, ya estoy en el siguiente post y te felicito una vez mas por tener estos documentales.

Jose Selvi dijo...

@Andres, tenía pinta de ser algo así, me alegra que ya te funcione y que te gusten los posts que ponemos.

Gracias por tus comentarios ;)

Anónimo dijo...

Hola jose, te felicito por el post, estoy probando el Metasploit, contra una maquina virtual funciona ok, pero cuando lo lanzo contra otra pc me sale el error
[*] Started reverse handler on port 4444
[*] Automatically detecting the target...
[*] Fingerprint: Windows XP Service Pack 3 - lang:Spanish
[*] Selected Target: Windows XP SP3 Spanish (NX)
[*] Triggering the vulnerability...
[*] Exploit completed, but no session was created.
msf exploit(ms08_067_netapi) > exploit

Si tienes alguna info que nos sea de ayuda te lo agradeceria.
Gracias por tu tiempo
Carlos.

Jose Selvi dijo...

Hola @Anónimo, por lo que veo no estás haciendo nuestra prueba, simplemente estás usando Metasploit con la vulnerabilidad Netapi, cierto?

Esa vulnerabilidad tiene tiempo (aunque yo aún me la encuentro por ahí), si has aplicado parches en la máquina física probablemente ya no sea vulnerable a esta vulnerabilidad, por lo que evidentemente el exploit no funciona.

Busca en la web de microsoft el boletín MS08_067, que es el que se corresponde a esta vulnerabilidad a ver que número de parche tiene, y luego busca en tu máquina física, a ver si está entre los parches instalados. Si lo está... no te va a funcionar.

Si el problema es otro, mándame un correo y miramos a ver que puede estar pasando, porque hacerlo todo por comentarios del post puede ser un poco... complicado.

Saludos!

Anónimo dijo...

si es correcto, tiene el parche, sucede que trabajo en soporte tecnico, y corriendo el nmap encontre portadas de impresoras sin clave, swiches y demas incluyendo pcs que pueden usarse para spam, me entretuve con el metasploit 3, y me parecio interesante, en una maquina virtual consigo la consola remota, pero en pcs parchadas no (obvio), he probado con otros payloads en msf pero no tuve exito, si tienes alguna informacion que sea de ayuda seria interesante, tambien encontre errores de configuracion en un isa server (para el jefe que jod3 mucho, deberias ver su cara de sorpresa cuando le mostre)si tienes algun manual basico y uno intermedio que no este escrito en criptico o cirilico sera bienvenido.
Gracias por tu tiempo.
@anonimo=cmansilla

Jose Selvi dijo...

@cmansilla, sí el exploit no funciona da igual que payload uses, no te va a funcionar.

Tenemos pensado poner unos posts de Metasploit y Meterpreter, seguramente te servirán sí nos das algunas semanas ;)

Anónimo dijo...

cmansilla
Ok Jose
Gracias por tu tiempo.
El tema es mas que interesante.

saludos

papilyn dijo...

hace dias que leo tu blog y me resulta muy util,solo que tengo varios problemas a la hora de obtener un shell remoto.tengo 2 pcs unos con backtrack y otro con guindows xp sp2 spanish y claro el metasploit siempre me tira esto:
[*] Could not determine the exact language pack
[*] Exploit completed, but no session was created.
la cuestion es si con esta guia que acabas de publicar puedo solucionar el problema.
ps:el link del warftp ya no esta disponible.
saludos y ya tienes un seguidor mas..

Jose Selvi dijo...

@Buah: Gracias por avisar lo del enlace. Parece que la web ya no existe. Podeis buscar el software en Internet, yo he encontrado un par de sitios donde descargar, pero prefiero no poner el enlace, no sea que me convierta en cómplice de que os infecteis con algún Malware :P

En cuanto a tu pregunta sobre el exploit que estás probando, necesitaría saber cual estás utilizando, porque dependiendo de cual sea igual es tan sencillo como forzar el TARGET si lo conoces.

Dinos algo al respecto.
Gracias por tu comentario.

papilyn dijo...

Gracias por responder tan pronto..!
te comento.: estaba probando lo que habias puesto en otro post vuestro :Santa Claus is Hacking Town,en un entorno cerrado 2 pcs uno con backtrack(atacante) y otro con winXP sp2 y IE 6 y 7(victima)al hacer todo los pasos y ejecutar exploit me tira esto:
[*] Could not determine the exact language pack
[*] Exploit completed, but no session was created.
msf exploit(ms08_067_netapi) >
pero claro mi pregunta es..1)cada modulo o exploits que vaya a usar tendré que modificarlo al español?>>vaya curro..
2)una vez modificado los exploits al gusto estos se perderan si actualizo el framework?
gracias de antemano.

papilyn dijo...

me autoRespondo..veo que ya le has contestado a anonimo y mas o menos voy por ahi..aunque tengo un Ie6 del año de la pera en la maquina de la victima.
aunque creo que el problema del idioma puede perjudicar un poco..

Jose Selvi dijo...

@Buah: Me parece que te has hecho un pequeño lio con los exploits. ms08_067_netapi no explota el Internet Explorer, sino el servicio SMB. Los exploits para navegadores no "se lanzan", sino que se quedan a la escucha esperando a que los navegadores los visiten.

Si estás intentando explotar con NetAPI y el sistema está sin parchear, probablemente no está encontrando el puerto, o bien la IP está mal, o el firewall está levantado, o el servicio de carpetas compartidas no está configurado.

En cuanto a las otras preguntas, NO, no siempre es necesario modiicar los exploits para sistemas en Español. Muchas veces los exploits son universales para la misma versión, independientemente del idioma.

Lo de perder tus modificaciones al actualizar... sí, efectivamente, puedes perderlas, salvo que reportes tu aportación a HD Moore y su equipo, así vendrá incluido en el repositorio oficial y todos los demás te estaremos agradecidos ;)
Mientras tanto, yo lo que hago es guardarme una copia del fichero que he modificado, solo por si acaso.

Espero haber aclarado tus dudas.
Saludos!

papilyn dijo...

ok! aclarado pues..muchas gracias! tu preparate que te voy a bombardear a preguntas :) ahora me voy a leer las entradas mas recientes..hasta ahora.

Jose Selvi dijo...

@Buah: Un placer, por aquí estamos ;)

Alberto García dijo...

Hola Jose.
Ya se que esto tiene tiempo pero te quería preguntar qué hacer cuando el exploit que queremos adaptar al idioma spanish no tiene extensión .exe sino .doc o .pdf....

Ya olly solo acepta .exe y .dll...

Un saludo y gracias

Jose Selvi dijo...

@Metasploiter: Al final, esos .doc o .pdf no se visualizan por si solos, sino que necesitan algún tipo de software para ser visualizados, que es donde realmente residirá la vulnerabilidad a explotar.

Fíjate que las vulnerabilidades salen para Acrobat, no para PDF, lo que haces es un PDF manipulado para explotar un Acrobat versión la que sea.

En estos casos, el .exe que deberías cargar en OllyDbg para buscar estas direcciones sería el Acrobat, o el Word, o el software que sea que estamos atacando y que es vulnerable, no el documento en si.

Espero que esto responda tus dudas.
Gracias por el comentario :)
Saludos!

Alberto García dijo...

Bufff pues entonces si que está complicado... El exploit que estoy utilizando salió ayer mismo y es el "ms11_xxx_createsizeddibsection" que lo que aprovecha es el modo que tiene windows de previsualizar los archivos en "mosaico" o "Thumbnails"

Solamente tiene el idioma inglés y está para XP SP3 auqneu según tengo entendido funciona hasta vista SP1.

Me puedes echar una mano para adaptarlo a idioma spanish??
Gracias

Jose Selvi dijo...

@Metasploiter: Le he pegado un vistazo, y el exploit que me comentas es un ROP, así que no es ni mucho menos tan sencillo de hacer como el ejemplo que hemos puesto en este post.

Hay una función llamada "rvas_explorer_xpsp3" que guarda una especie de correspondencia entre las instrucciones que se van a querer usar y las direcciones de memoria en las que se encuentran. A partir de esa información se genera la pila rop, y eso es lo que se mete en el exploit.

Para hacer funcionar este exploit tendrías que buscar todas las secuencias de instrucciones que se ven en esa función y buscar dentro del proceso "explorer.exe" en que posición de memoria están, y entonces modificar esta función.

Es un faenón, mucho más que cambiar un solo valor como fue el caso anterior. Para ayudarte más tendría que ponerme a hacerlo a ver si me surge algún otro problema, y ahora mismo no dispongo del tiempo. De todas maneras, si te surgen dudas puntuales, escríbeme al correo y si puedo te ayudo.

Anónimo dijo...

hola quiero atacar un windows server 2003 español , probe con ms03_026
pero me sale error no se pero ese exploit dice universal no sea que sea la target ! espero me puedas ayudar

security_thanks@hotmail.com

Jose Selvi dijo...

@Anónimo: Cuando el target de un exploit de Metasploit es "Universal" quiere decir que es válido para cualquier versión vulnerable. Este concretamente parece que va probando uno detrás de otro (lo he mirado muy rápido, podría no ser así).

Pueden pasar dos cosas, o bien el sistema está parcheado contra la vulnerabilidad y no va a funcionar, o bien el exploit no funciona por culpa del idioma. Según he mirado en el código del exploit, para un Windows 2003 intenta saltar a la dirección 0x001b0b0b, donde debería haber una instrucción call near [ebp+0x30].

Si no es así, tendrás que hacer algo similar a lo que comentábamos en este post para encontrar la dirección que tenga esa instrucción para el Windows 2003 en Español.

Josep Pi dijo...

Hola Jose,

En un pentest me he encontrado la famosa vulnerabilidad ms08_067 en un 2003server sp2 spanish.

La cosa es que el exploit.rb de metasploit tiene para XP spanish pero no para 2003Spanish (si tiene para 2003English) y por tanto no funciona.

He estado buscando las direcciones que hay q modificar en el exploit para 2003Spanish pero no encuentro nada...

Las tienes tu por casualiad ?


Muchas gracias !

Jose Selvi dijo...

Hola @Josep Pi, si no recuerdo mal el exploit de la versión en inglés de 2003 funciona en la version en español.

Pruebalo en un entorno de test a forzar el target a ver si te funciona:

show targets
set TARGET

Con eso se fuerza al target en Metasploit y pasa de la detección automática, pero eso sí, pruebalo antes con alguna máquina de test tuya que sea lo más parecida posible a la que vas a explotar, no sea que hagas que el servicio se caiga al explotarlo.

Suerte!

Josep Pi dijo...

Hola Jose,

Pues creo recordar que he probado seleccionando el target manualmente pero ya no me acuerdo y ya no puedo probarlo en el entorno real ! :(

Es que el nessus me detectaba la vulnerabilidad ms08_067 en 5 servidores y todos eran 2003spanish.. pero en todos pasaba lo mismo, sin embargo en otro win2k que detectaba el nessus si que funcionaba el exploit(claro, es universal en w2k)

Ahora me quedo con la duda de si seleccionando el target manualmente fucionaria o no... arff , lo que esta claro que automatico no funcionaba se "quejaba" por el lenguaje del S.O

Gracias! Saludos ;)

Jose Selvi dijo...

@Josep Pi: Pruebatelo en un entorno de test, así al menos ya lo sabes para otra ocasión. Te instalas un W2K3 en Español en una máquina virtual y lo pruebas.

A todos nos pasan cosas de esas, no te preocupes ;)