Sobre el funcionamiento de Metasploit (no como usarlo sino como trabaja)

Iniciado por oxydec, 18 Febrero 2011, 02:48 AM

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

oxydec


Hola, bueno en primer lugar quiero comentaros que no se mucho de seguridad informatica, estoy empezando a aprender, asi que os pido un poco de comprension, ya que es posible que mis dudas sean una tonteria.

El caso es que he descubierto esta gran herramienta que es Metasploit y la verdad me tiene fascinado.

Se un poco de programacion y entiendo lo que es un exploit (basicamente he leido sobre desbordamientos de la pila) y comprendo su funcionamiento en local. Pero lo que realmente me tiene intrigado es como hace metasploit para ejecutar un explot en una maquina remota.

Basicamente mi comprension del tema se reduce a:
- tengo un programa "A" (vulnerable) ejecutandose con privilegios altos.
- hago un programa "B" (el exploit) que rebienta el programa "A" y ejecuta el shellcode que le he metido en "B" pero con los privilegios de "A"
- Ejecuto "B" y reviento "A" obteniendo sus permisos.

Ahora mi duda es: ¿como pasar de la situacion anterior a una situacion en que "A" se este ejecutando en una maquina remota? No entiendo ese paso.

¿como hace para mandarle el exploit y decirle a la maquina remota que lo execute? ¿No seria eso tener ya privilegios en la maquina remota antes de que esta execute el exploit?


Stelio Kontos

Exactamente igual que en local.
Cuando un programa que funciona en local pide que introduzcas X argumento, y la funcion para leer el contenido de esa cadena provoca un desbordamiento (es decir, reserva X bytes de espacio en la pila, y si al leerlos, éstos sobrepasan el límite, el cual no tenga un filtro, por ejemplo, provocan el desbordamiento), el tema va a estar en desbordar ese espacio de memoria y calcular cuantos bytes son necesarios para llegar a la dirección de retorno, la cual si es sobreescrita, el programa pegará el error.
Entonces, el tema va a estar en sobreescribir ese retorno con una dirección de memoria válida, donde se encuentre la shellcode. Te voy a poner un ejemplo:
Un programa que lee una cadena, el cual, reserva un buffer de 100 bytes. Si el programa tiene una función (strcpy, por ejemplo) que lea esa cadena, y si la cadena es de por ejemplo 150 bytes, esos 50 bytes restantes van a sobreescribir lo que haya después de ese espacio en la pila, si el exceso es suficiente como para llegar a la dirección de retorno, el flujo del programa se interrumpirá, ya que esa dirección de retorno va a apuntar a algo que ha sido sobreescrito, y obviamente, "no existe".
Ahora imagina, que hago una aplicación en ensamblador, la cual deje una shell a la escucha por el puerto 4444, creo el binario, saco sus opcodes, y hago la shellcode.
He calculado cuantos bytes son necesarios para llegar al retorno y me da 124, esa cantidad de bytes, es la que hay desde el principio del espacio reservado, hasta la dirección de retorno, a la cual llego desbordando el limite del espacio.
Ahora sé, que 4 de esos bytes (los últimos), son pertenecientes a la dirección de retorno sobreescrita, de lo que saco la conclusión de que en 120 bytes tiene que ir mi sellcode.
Entonces, en el argumento, tengo que introducir 120 bytes + 4 del retorno, en esos 120 bytes tiene que ir mi shellcode, si ésta no es suficiente, meto basura.
Ahora tenemos basura + shellcode + ret, ese retorno tiene que ser sobreescrito con la dirección de memoria donde se encuentre la shellcode.
En resumen, en 120 bytes tiene que ir mi shellcode y basura si es necesario, para que al sobreescribir el retorno, retorne a mi shellcode, el flujo se "cambie" y se ejecute mi shellcode.

¿Tu pregunta era refiriendote a remoto, no?
Pues igual, en vez de meter los argumentos desde el teclado, se los envías mediante un socket.

oxydec

Ah ok, ya lo entiendo, no era tan complicado.
buena explicacion, muchas gracias.