Exploiting basico en Windows

Este es tu lugar para hablar de programación, compartir, crear y desarrollar nuevos proyectos

Moderador: Moderadores

Re: Exploiting basico en Windows

Notapor Sor_Zitroën » Lun Ago 22, 2011 1:10 am

Hay demasiadas cosas para estudiar, eh Neo :) (es una locura).

Bueno, al final ya me he sacado una shell remota. Me he puesto a generarme mis payloads con Mestasploit y una gozada oye; me he creado un bind_shell y he podido conectarme. Sencillo pero funcional. Como no me había creado un payload en mi vida, me ha costado un poco situarme con msfpayload y msfencode; así que si alguien está en las mismas me lo comenta y posteo el comando para crearla sin null bytes.

Mañana si me animo me saco un meterpreter, y en nada petando DEP + ASLR :badgrin: :badgrin:
[Padre] ¿Crees en el fracaso?
[Hijo] Sí
[Padre] Entonces lo experimentarás
Avatar de Usuario
Sor_Zitroën
-<|:·þ
-<|:·þ
 
Mensajes: 2064
Registrado: Vie Nov 25, 2005 2:01 am

Re: Exploiting basico en Windows

Notapor neofito » Lun Ago 22, 2011 10:50 am

Sor_Zitroën escribió:Hay demasiadas cosas para estudiar, eh Neo :) (es una locura).


Ya te digo, demasiadas cosas y muy poco tiempo.

Sor_Zitroën escribió:Bueno, al final ya me he sacado una shell remota. Me he puesto a generarme mis payloads con Mestasploit y una gozada oye; me he creado un bind_shell y he podido conectarme. Sencillo pero funcional. Como no me había creado un payload en mi vida, me ha costado un poco situarme con msfpayload y msfencode; así que si alguien está en las mismas me lo comenta y posteo el comando para crearla sin null bytes.

Mañana si me animo me saco un meterpreter, y en nada petando DEP + ASLR :badgrin: :badgrin:


Si es que el que vale, vale.

Saludos
La verdad nos hara libres

http://neosysforensics.blogspot.com
http://www.wadalbertia.org
@neosysforensics
-<|:-P[G]
Avatar de Usuario
neofito
Wadalbertita
Wadalbertita
 
Mensajes: 1799
Registrado: Dom Ene 30, 2005 7:16 am
Ubicación: En algun lugar

Re: Exploiting basico en Windows

Notapor vlan7 » Lun Ago 22, 2011 2:35 pm

Sor_Zitroën escribió:y en nada petando DEP + ASLR :badgrin: :badgrin:


Animaos, que esta calentito el tema de bypass de DEP + ASLR ultimamente. Os dejo dos referencias, la de Corelan que me aviso Sor y otra para mi gusto mas completa, aunque es innegable que Corelan son los amos en explotacion de Win.

https://www.corelan.be/index.php/2011/07/03/universal-depaslr-bypass-with-msvcr71-dll-and-mona-py/
http://abysssec.com/files/The_Arashi.pdf

Suerte,
There is a crack, a crack in everything That's how the light gets in. -subculture

zen7.vlan7.org
Avatar de Usuario
vlan7
<|:-D
<|:-D
 
Mensajes: 1176
Registrado: Dom Mar 05, 2006 11:16 pm
Ubicación: Mas alla del EIP

Re: Exploiting basico en Windows

Notapor Sor_Zitroën » Lun Ago 22, 2011 5:13 pm

Sor_Zitroën escribió:EDIT: si el binario no ha sido enlazado con DEP, aunque el SO incluya protección no debería haber problema. Si me equivoco que alguien me corrija.

Me corrijo, eso es falso. Juegando con un SP3 estoy trasteando con algún binario que no tiene para nada protección DEP y si no lo excluyo de la política OptOut Windows lo protege.


Neofito escribió:Si es que el que vale, vale.

Si supieras los conocimientos que tengo sobre exploiting y la de ostias que me estoy dando con cosas básicas, nos íbamos a echar unas risas.. :p
Última edición por Sor_Zitroën el Lun Ago 22, 2011 10:07 pm, editado 1 vez en total
[Padre] ¿Crees en el fracaso?
[Hijo] Sí
[Padre] Entonces lo experimentarás
Avatar de Usuario
Sor_Zitroën
-<|:·þ
-<|:·þ
 
Mensajes: 2064
Registrado: Vie Nov 25, 2005 2:01 am

Re: Exploiting basico en Windows

Notapor Sor_Zitroën » Lun Ago 22, 2011 5:37 pm

Bueno, allá va una duda. Tomando la siguiente estructura de la pila, de forma que ahora tengo el shellcode copiado donde está ptr argv; vamos justo debajo del EIP . El ESP apunta justo allí en el epílogo, y he comprobado antes de meter la shellcode que lo que copio allí está entero.

Vamos, que al final tengo el ESP apuntando al código desde el principio sin problemas. A la hora de ejecutarlo no me funciona, y añadiendo NOPs sí. Estoy más confundido que el Dinio... ¿Esto por qué pasa?
[Padre] ¿Crees en el fracaso?
[Hijo] Sí
[Padre] Entonces lo experimentarás
Avatar de Usuario
Sor_Zitroën
-<|:·þ
-<|:·þ
 
Mensajes: 2064
Registrado: Vie Nov 25, 2005 2:01 am

Re: Exploiting basico en Windows

Notapor NewLog » Lun Ago 22, 2011 11:12 pm

Pasa porqué el shellcode no está alineado a 4 bytes. El inicio del shellcode debe estar en una posición de memoria múltiple de cuatro, para que cuando se lean las instrucciones todo esté cuadrado (una instrucción en ensamblador, como máximo, ocupa 32 bits -4 bytes-, en una arquitectura, evidentemente, de 32 bits).


Como siempre, que alguien me corrija si me equivoco ;)
Imagen
http://www.overflowedminds.net - Quieres introducirte al exploiting?
Avatar de Usuario
NewLog
<|:-D
<|:-D
 
Mensajes: 1130
Registrado: Sab Ene 14, 2006 1:03 am

Re: Exploiting basico en Windows

Notapor Sor_Zitroën » Mar Ago 23, 2011 12:07 am

Creo que no va por ahí. A ver, por lo que estoy estudiando al finalizar la ejecución de código de una función se hace pop de todo el marco de la pila. Y parece que también se hace de los parámetros de la función; por lo tanto si se pasa un parámetro lo desapilará y el ESP irá a una posición creciente (4 bytes más). Por eso si se mete código justo después del EIP es probable que no se ejecute porque el ESP no apuntará al principio de ese código.

Juraría que en un código simple que he probado antes el ESP apuntaba justo después del EIP, y eso que la función tenía un parámetro. Todo sería volver a probarlo.
[Padre] ¿Crees en el fracaso?
[Hijo] Sí
[Padre] Entonces lo experimentarás
Avatar de Usuario
Sor_Zitroën
-<|:·þ
-<|:·þ
 
Mensajes: 2064
Registrado: Vie Nov 25, 2005 2:01 am

Re: Exploiting basico en Windows

Notapor Sor_Zitroën » Mar Ago 23, 2011 1:03 am

Sí, eso eso. Echadle un ojo a este apartado. Las convenciones de llamada supongo que dependen totalmente del compilador.

Por otro lado en el foro de Corelan también se habla de lo mismo, aunque en ese momento lo sugería un miembro del foro como posibilidad porque no estaba seguro (tampoco corelanc0d3r :) ):

Aren't the function parameters you've supplied (ptr to param1 in your example) getting popped also?

I mean, if you overwrite saved EIP with some acceptable address, and after DoStuff returns, EIP gets popped off the stack, but these passed input parameters must be popped too?

If I am correct,then ESP will point to "+ some bytes" after "EIP + input vars", and not directly after "EIP" and this is the reason you add four symbols before the shellcode (my $preshellcode = “XXXX”;) ?
[Padre] ¿Crees en el fracaso?
[Hijo] Sí
[Padre] Entonces lo experimentarás
Avatar de Usuario
Sor_Zitroën
-<|:·þ
-<|:·þ
 
Mensajes: 2064
Registrado: Vie Nov 25, 2005 2:01 am

Re: Exploiting basico en Windows

Notapor vlan7 » Mar Ago 23, 2011 8:40 am

Mas que del compilador depende de la arquitectura.

Citandome a mi mismo (modestia aparte) Call tiene una “feature”, y es que guarda en la pila la direccion de la siguiente instruccion, de tal forma que cuando la subrutina a la que llama finalice con un RET, se pueda retomar correctamente la siguiente instruccion (ret hace un pop de dicha direccion de memoria).

ret copia el valor de ESP en EIP. Recordemos que a grandes rasgos EIP indica el flujo del programa, que instruccion hay que ejecutar, y ESP apunta al top de la pila, es decir, es el punto de retorno. Entonces ret al copiar ESP a EIP la siguiente instruccion a ejecutar sera la inmediatamente siguiente al CALL del que salimos.
Y a bajo nivel el pop se hace a lo bruto, no se lanza una instruccion pop, se añaden 4 bytes a ESP (lo cual es lo mismo en la practica), de tal forma que se garantice la recursividad. Por cierto, desapilar los parametros de una funcion es responsabilidad total del programador, y estoy casi seguro de que lo haciamos asi en los 90, a lo bruto sumando a ESP 4 bytes por cada parametro. En Assembler claro.

Lo que si hace el compilador es optimizar todo, por ejemplo en pruebas yo he visto que gcc sustituye pares call/ret por saltos incondicionales (jmp). Es exactamente lo mismo. Algunos os preguntareis como puede ser igual si un jmp no guarda un punto de retorno en la pila. Os dejo pensar, mas que nada porque hay curro, luego sigo.

Suerte,
There is a crack, a crack in everything That's how the light gets in. -subculture

zen7.vlan7.org
Avatar de Usuario
vlan7
<|:-D
<|:-D
 
Mensajes: 1176
Registrado: Dom Mar 05, 2006 11:16 pm
Ubicación: Mas alla del EIP

Re: Exploiting basico en Windows

Notapor Sor_Zitroën » Mar Ago 23, 2011 11:19 am

Gracias por las aclaraciones. Cuando puedas comenta lo de la sustitución de call/ret por jmp, que está interesante :)
[Padre] ¿Crees en el fracaso?
[Hijo] Sí
[Padre] Entonces lo experimentarás
Avatar de Usuario
Sor_Zitroën
-<|:·þ
-<|:·þ
 
Mensajes: 2064
Registrado: Vie Nov 25, 2005 2:01 am

Re: Exploiting basico en Windows

Notapor vlan7 » Mar Ago 23, 2011 12:33 pm

Pues ahi va, expliquemos por que es lo mismo este codigo:

Código: Seleccionar todo
label:
   call func
   ret


que este:

Código: Seleccionar todo
label:
   jmp func


Bien, jmp no guarda ningun punto de retorno en la pila, pero en el codigo de ejemplo cuando label cede el control a func, los 4 bytes del top de la pila contienen el punto de retorno de la instruccion call que llamo a label (a bajo nivel a una etiqueta se llama con un call). Entonces cuando func llega a su punto de retorno, se puede pensar con cierta logica que func esperaria retornar al call label, pero lo que ocurre realmente es que se añaden 4 bytes a ESP (el RET se pone siempre al final de la funcion, pero dentro de ella), con lo que se desapila el punto de retorno de label y se consigue retornar a jmp func, que es la instruccion siguiente al call label.

Quizas no fui muy claro en el post anterior, porque esta optimizacion la hace gcc cuando se se usan etiquetas (las prisas).

De todas formas un (near) call es equivalente a:

Código: Seleccionar todo
push OFFSET_DE_INSTRUCCION_TRAS_JMP
jmp   func


Un far call seria parecido, pero necesitariamos hacer un push CS antes de esas dos instrucciones para forzar un push de una direccion de retorno lejana.

Y el ret pues tres cuartos de lo mismo. Un near ret es equivalente a:

Código: Seleccionar todo
pop   ax
jmp   ax


Un far ret no se me ocurre ahora como podria hacerse porque necesitariamos cargar CS:IP en una sola instruccion, de lo contrario el registro (E)IP se veria afectado.

Escribo rapido, errores diria que no hay, pero si puede que haya inexactitudes por falta de tiempo, lo revisare. Y seguro que existen mas hacks similares.

Y al tema de rellenar con NOPs, puede que tenga algo que ver el hilo ?f=6&t=6258 que abri y que no he solucionado aun.

Suerte,
There is a crack, a crack in everything That's how the light gets in. -subculture

zen7.vlan7.org
Avatar de Usuario
vlan7
<|:-D
<|:-D
 
Mensajes: 1176
Registrado: Dom Mar 05, 2006 11:16 pm
Ubicación: Mas alla del EIP

Re: Exploiting basico en Windows

Notapor Sor_Zitroën » Mar Ago 23, 2011 2:59 pm

Gracias, aunque hay alguna cosilla que se me ha escapado. De todas formas tampoco busco ser el megacrack del ensamblador, me conformo con tener un nivel básico-medio :) Me quedo con que call equivale a un jmp cuando se hace uso de etiquetas en el código.

Por otro lado planteo otra duda. Siempre cuando se busca conocer el offset en el que está ubicado el EIP en la pila se pone (por ejemplo) la A varias veces y luego se crea un patrón típicamente con pattern_create. Luego conociendo el patrón que se ha sobreescrito en el EIP lo buscamos y ya tenemos el offset. Para ahorrarme pasos el otro día intenté crear un patrón muy largo de base sin poner A, y al calcular el offset no me indicaba uno correcto. ¿Alquien sabe por qué? ¿Realmente es necesario siempre usar A antes del patrón?
[Padre] ¿Crees en el fracaso?
[Hijo] Sí
[Padre] Entonces lo experimentarás
Avatar de Usuario
Sor_Zitroën
-<|:·þ
-<|:·þ
 
Mensajes: 2064
Registrado: Vie Nov 25, 2005 2:01 am

Re: Exploiting basico en Windows

Notapor vlan7 » Mar Ago 23, 2011 7:19 pm

Hola Sor,

Si te soy sincero nunca he usado en la practica pattern_create / pattern_offset de Metasploit, suelo tirar de sentencias perl en gdb a pesar de lo poco que me gusta, pero que yo sepa la idea de estos dos scripts en Ruby que trae Metasploit es no tener que andar metiendo A's de relleno. Creas un patron con pattern_create sin meter ninguna A y luego lo buscas con pattern_offset. La verdad es que no entiendo bien donde esta el fallo.

Suerte,
There is a crack, a crack in everything That's how the light gets in. -subculture

zen7.vlan7.org
Avatar de Usuario
vlan7
<|:-D
<|:-D
 
Mensajes: 1176
Registrado: Dom Mar 05, 2006 11:16 pm
Ubicación: Mas alla del EIP

Re: Exploiting basico en Windows

Notapor NewLog » Mar Ago 23, 2011 8:49 pm

Sor_Zitroën escribió:Creo que no va por ahí. A ver, por lo que estoy estudiando al finalizar la ejecución de código de una función se hace pop de todo el marco de la pila. Y parece que también se hace de los parámetros de la función;


Eso no es así (almenos con gcc). Los argumentos de la función no se 'popean'. Lo único que se hace, tal y como comenta vlan es almacenar el valor de @ret (guardada anteriormente) en el registro eip.

Para destruir un marco de función simplemente se decrementa el valor del registro esp. Con eso destruyes el marco de pila. Cuando llames a otra función, los datos del nuevo marco de pila sobreescribiran los datos anteriores.



Vuelve a mirar el tema de los NOPs, usa gdb y seguro que ves que el shellcode no empieza en una posición de memoria múltiple de 4. Y si no es por eso, me pondrás en una situación en la que no he estado antes :P Algo nuevo aprenderé!

Saludos!

P.D.: He tenido que responder rápido a la pregunta que voy a cenar. Pero se que alguien lo dirá :P Los argumentos de la función, aunque se pasen por referencia o por valor no se popean, se obtienen de otro modo ;)
Imagen
http://www.overflowedminds.net - Quieres introducirte al exploiting?
Avatar de Usuario
NewLog
<|:-D
<|:-D
 
Mensajes: 1130
Registrado: Sab Ene 14, 2006 1:03 am

Re: Exploiting basico en Windows

Notapor vlan7 » Mar Ago 23, 2011 9:25 pm

Sobre el tema de los NOPs yo tampoco veo otra explicacion que lo que comenta NewLog. Aunque claro, yo me he visto con un problema distinto que no he sabido aun explicar (el hilo que enlace antes) tan solo una vez, aunque ya es mas que cero. De todas formas aun no tengo muy claro que hablemos de situaciones similares. Eso si, usar gdb en win va a ser complicado jeje

Sobre destruccion de los argumentosb apilados en la pila otra posibilidad valida seria hacer un push ebp al principio de la funcion y un pop ebp al final. Pero son dos instrucciones de 8+8 ciclos de reloj contra una de 8+2 ciclos de reloj (sumar a un registro un valor no contenido en registro suma 2 ciclos). Ya que programamos en ASM hagamoslo bien!

Y aunque haya nombrado el registro clave para decir otra cosa no sere yo el que no permita a otro wadalbertita explicar el uso de los parametros!

Suerte,
There is a crack, a crack in everything That's how the light gets in. -subculture

zen7.vlan7.org
Avatar de Usuario
vlan7
<|:-D
<|:-D
 
Mensajes: 1176
Registrado: Dom Mar 05, 2006 11:16 pm
Ubicación: Mas alla del EIP

AnteriorSiguiente

Volver a Programación

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 3 invitados