Puedo entender qué es un desbordamiento de búfer y que te permite escribir en lugares de la memoria que no deberías poder. También puedo entender el concepto de que puede haber otras vulnerabilidades de software que funcionen de alguna manera diferente que te permita colocar las cosas que deseas en la memoria. También obtuve acceso a algunas de mis antiguas máquinas XP usando metasploit, lo cual fue divertido.
Pero realmente no puedo entender cómo puede obtener acceso al sistema remoto teniendo en cuenta (por ejemplo) la vulnerabilidad de desbordamiento de búfer.
Hay algunos puntos que no están claros para mí:
- ¿Es necesario que el programa que tiene la vulnerabilidad se ejecute y escuche un puerto específico en la máquina víctima (como un mini servidor o algo así)? ¿Puede un programa mal escrito ser explotado de forma remota si no escucha un puerto?
- Supongo que el programa leerá alguna entrada de ese puerto y luego la escribirá en la memoria en alguna variable y tal vez la procese. Al proporcionar al programa más datos de los que debería leer, y siempre que tenga la vulnerabilidad, escribirá en una ubicación en la memoria (específicamente, exactamente después de la variable) lo que queramos. ¿Cómo no falla esto el programa el 99.9% del tiempo? ¿Qué sucede si exactamente después del lugar en la memoria donde se almacena esta variable hay un puntero a alguna función que no se ejecuta y el programa se bloquea?
- Siempre que el programa no se bloquee, ¿cómo podemos ejecutar el código que hemos inyectado en la memoria? ¿Necesitamos colocar el código que queremos en un lugar dentro de la memoria que sabemos que se va a ejecutar? ¿Cómo se puede ejecutar alguna parte aleatoria de la memoria? Casi nunca en mis programas ejecuto alguna variable mía, a menos que quiera ejecutar algún otro programa, lo cual es muy raro y no debería ser lo mismo que ejecutar código directamente desde la memoria (que me recuerda a eval ()).
- Siempre que el punto 2 asuma correctamente que la vulnerabilidad generalmente surge cuando el programa vulnerable lee información maliciosa de un puerto y este código se ejecuta, ¿cómo puede el código ejecutado volver a llamarme, el atacante? ¿Envío el código malicioso de mi dirección IP en una variable o algo así?
- Los programas generalmente no pueden leer ni escribir en la memoria de otro programa. ¿Esto significa que cuando se cierre el programa vulnerable perderé la conexión con el shell remoto abierto? ¿O genera un subproceso independiente una vez que se ejecuta y realmente estoy conectado a él?
¿Alguien puede darme un ejemplo simple pero realista y completo de cómo funciona todo el sistema, desde el programa escuchando a algún puerto hasta que el atacante obtiene una concha?