Posso capire cos'è un overflow del buffer e che ti permette di scrivere in posti della memoria che non dovresti essere in grado di scrivere. Posso anche cogliere l'idea che ci possano essere altre vulnerabilità del software che funzionano in un modo diverso che ti consente di inserire le cose che vuoi in memoria. Ho anche avuto accesso ad alcune mie vecchie macchine XP usando metasploit, che è stato divertente.
Ma non riesco a capire perfettamente come sia possibile accedere al sistema remoto avendo in mente (ad esempio) la vulnerabilità di buffer overflow.
Ci sono alcuni punti che non sono chiari per me:
- È necessario eseguire il programma che presenta la vulnerabilità e ascoltare una porta specifica sulla macchina vittima (come un mini-server o qualcosa del genere)? Un programma mal scritto può essere sfruttato da remoto se non ascolta una porta?
- Presumo che il programma leggerà qualche input da quella porta e poi lo scriverà in memoria in qualche variabile e forse lo elaborerà. Fornendo al programma più dati di quanti ne dovrebbe leggere, e a condizione che abbia la vulnerabilità, scriverà in una posizione nella memoria (in particolare, esattamente dopo la variabile) qualunque cosa vogliamo. In che modo questo non arresta il programma il 99,9% delle volte? Cosa succede se esattamente dopo il luogo in memoria in cui è memorizzata questa variabile c'è un puntatore a qualche funzione che non riesce ad eseguire e il programma si blocca?
- Se il programma non si arresta in modo anomalo, come possiamo eseguire il codice che abbiamo iniettato nella memoria? Abbiamo bisogno di inserire il codice che vogliamo in un posto all'interno della memoria che sappiamo che verrà eseguito? Come può essere eseguita una parte casuale della memoria? Quasi mai nei miei programmi eseguo alcune mie variabili, a meno che non voglia eseguire qualche altro programma, che è molto raro e non dovrebbe essere lo stesso dell'esecuzione diretta del codice dalla memoria (che mi ricorda eval ()).
- Se il punto 2 presuppone che la vulnerabilità di solito si verifica quando il programma vulnerabile legge input dannosi da una porta e che questo codice viene eseguito, in che modo il codice eseguito può tornare a me, l'utente malintenzionato? Devo inviare il codice dannoso il mio indirizzo IP in una variabile o qualcosa del genere?
- I programmi generalmente non possono leggere o scrivere nella memoria di un altro programma. Questo significa che quando il programma vulnerabile si chiude, perderò la connessione alla shell remota aperta? Oppure genera un sottoprocesso indipendente una volta eseguito e io sono effettivamente collegato ad esso?
Qualcuno può darmi un esempio semplice ma realistico e completo di come funziona l'intero sistema, dal programma ascoltando alcune porte fino a quando l'attaccante non acquisisce una shell?