Cosa stanno cercando di ottenere gli attaccanti quando si effettuano attacchi a programmi locali come buffer overflow?

4

Negli attacchi ai programmi, come lo stack overflow, qual è l'obiettivo dell'attaccante? Sto riscontrando problemi nell'apprendimento dei dettagli tecnici dell'attacco (come la sovrascrittura dell'indirizzo di ritorno della funzione) perché non è chiaro che cosa intendano realizzare tali attacchi. Ad esempio, in SQL injection, di solito viene fatto per ottenere informazioni riservate o per far eseguire al server il codice. Sembra che il prerequisito per un attacco di buffer overflow sia che l'utente malintenzionato abbia già la possibilità di eseguire il codice sulla macchina, quindi cosa vogliono di più?

Di solito è un programma su un computer remoto che viene attaccato in queste situazioni? Tra l'altro ho più familiarità con C ++ rispetto a C.

    
posta Celeritas 14.12.2015 - 12:07
fonte

5 risposte

6

Un aspetto che non è stato ancora menzionato molto chiaramente: supponiamo di avere un sistema multiutente (come tutti i moderni sistemi operativi per PC come Windows, Linux, Unix e così via), e supponiamo che tu sia un normale (non- utente privilegiato) che può eseguire programmi applicativi "normali". Ora vuoi fare qualcosa di malevolo sul tuo PC (come installare un keylogger per ottenere tutte le password che gli altri utenti del PC stanno scrivendo o leggere le e-mail di altri utenti). Ma non puoi farlo perché sei solo un utente normale, non hai diritti amministrativi, non puoi installare software e non puoi visualizzare i dati di altri utenti.

Quindi il tuo obiettivo è diventare un utente con diritti amministrativi (amministratore in Windows, root in Linux / Unix, ecc.). Oltre a indurre l'amministratore a darti la sua password, un altro modo per ottenerlo è attaccare un programma vulnerabile che sta già correndo con diritti amministrativi. Se si potesse fare in modo che un tale programma eseguisse il proprio codice (ad esempio, abusando di un overflow del buffer), questo codice verrebbe eseguito anche con privilegi amministrativi e -bang- si potrebbe fare qualsiasi cosa si desideri con la macchina.

Si chiama escalation di privilegi . Si noti che (a causa di motivi tecnici che non possono essere spiegati qui in dettaglio) praticamente ogni sistema ha molti processi (server) con privilegi di root in esecuzione in background, quindi questo è uno scenario reale (in realtà, sto stimando che la maggior parte degli attacchi contro i programmi locali sono fatti per l'escalation dei privilegi).

Quindi il fattore chiave è: quando tu (un utente normale) esegui un programma, questo programma viene eseguito con i tuoi privilegi e le restrizioni di accesso, ma quando puoi fare un programma che è già in esecuzione con privilegi amministrativi esegui il tuo codice da abuso di buffer overflow e tecniche simili, il codice viene eseguito anche con privilegi amministrativi.

Si noti che questa spiegazione è strongmente semplificata (ad esempio, in Linux / Unix ci sono programmi SUID e così via), ma si spera che esprima l'idea alla base.

Un'ultima cosa: l'escalation dei privilegi è spesso l'obiettivo indipendentemente dal fatto che l'attacco venga eseguito localmente o in remoto. Abbastanza spesso, gli attacchi funzionano in due passaggi:

  1. In primo luogo, l'utente malintenzionato ottiene una password ingenua dell'utente (ad esempio, perché è troppo debole, è il compleanno di sua moglie o il nome del suo cane) e quindi utilizza queste credenziali per accedere alla rispettiva macchina da remoto .

  2. Quindi, come secondo passo, essendo l'utente, l'utente malintenzionato scansiona la rispettiva macchina per software vulnerabile e privilegiato e, ad esempio abusando di buffer overflow in quel software, lascia che quel software esegua il suo codice dannoso che a sua volta viene eseguito con gli stessi privilegi del software vulnerabile, rendendo efficacemente l'amministratore malintenzionato un amministratore.

Naturalmente, ci sono anche molti casi in cui un utente malintenzionato abusa direttamente il software privilegiato in esecuzione su un sistema remoto (ad esempio, i processi del server Web in esecuzione su Linux sotto root). Ma dal momento che hai chiesto principalmente il senso degli attacchi locali, lo lasceremo per ora.

    
risposta data 17.12.2015 - 12:50
fonte
3

La maggior parte degli exploit che sfruttano la vulnerabilità Buffer Overflow esegue Esecuzione codice sul computer della vittima, e questa è l'intenzione principale dell'aggressore, di assumere il controllo di altri computer in remoto o localmente.

    
risposta data 14.12.2015 - 13:16
fonte
2

I bug che causano overflow del buffer si manifestano spesso quando un programma opera su dati non validi, che riceve da un messaggio di rete o da un file che tenta di aprire.

Il potenziale di exploit del primo è ovvio: consente all'utente malintenzionato di eseguire codice su un sistema remoto.

Il secondo può essere sfruttato inviando un file malfunzionante all'utente e inducendoli ad aprirlo con il software vulnerabile. Mentre molti utenti sono consapevoli che l'esecuzione di programmi da una fonte non attendibile è una pessima idea, molti utenti sono molto meno cauti nell'aprire file da fonti non attendibili.

    
risposta data 14.12.2015 - 14:26
fonte
1

In attacks on programs, such as stack buffer overflows, what is the objective of the attacker? I’m having trouble learning the technical details of the attack (such as overwriting the function’s return address) because it’s not clear what such attacks are intended to achieve.

Sono concepiti per ottenere l'esecuzione di codice in modalità remota. Ciò significa che vogliono eseguire il codice nel tuo programma traboccando l'input previsto. Devi sempre verificare che il tuo input corrisponda alla lunghezza corretta.

Diamo un'occhiata da una prospettiva diversa: controllo della mente . E se potessi controllare la mente di qualcuno per fare ciò che vuoi che facciano?

Diciamo che c'è un exploit nel cervello di qualcuno dove possono solo prendere comandi di 8 caratteri. Qualsiasi cosa al di fuori di ciò viene eseguita perché non viene controllata.

Tu: Ciao. Per favore rispondi con "Ciao ..." ["Hello..." is 8 characters]

Vittima: Uhm, okay. Ciao ... [brain is only capable of processing 8 characters]

Tu : ti preghiamo di rispondere con "Cake".

Vittima: Uh, "Torta".

Tu: come su "Ciao ... <shellcode to make them say "Buffalo!", beyond the original 8 character limit> "

Vittima: Ciao ... Buffalo!

Vittima: Aspetta, cosa mi hai appena fatto?

Tu : come stai gentiluomini! Tutti i tuoi bufali appartengono a noi.

E se "Buffalo!" shellcode è stato progettato per eseguire qualsiasi tipo di codice che desideri, ad esempio il download di RAT ?

For example, in SQL injection, it’s usually done to get confidential information or make the server run code. It seems like the prerequisite for a buffer overflow attack is for the attacker to already have the ability to run code on the machine, so what more do they want?

Poiché il buffer overflow, come qualsiasi altro tipo di exploit che consente l'esecuzione di codice in modalità remota, di solito è il risultato di un difetto nel codice di qualcun altro. Come l'iniezione SQL, si sta tentando di far eseguire al codice la macchina remota.

Potrebbe essere qualcosa di semplice come inviare un comando errato a un programma normale. Potresti anche implementare vulnerabilità intenzionali nei tuoi programmi. Alcuni individui meno che scrupolosi possono farlo.

Ci sono molte vulnerabilità RCE in varie lingue. Il trucco è trovare qualcosa - qualsiasi cosa - che ti permetta di eseguire codice / comandi sul target in questione che apre ulteriori opportunità per ottenere un ulteriore accesso.

    
risposta data 17.12.2015 - 15:42
fonte
0

L'obiettivo generale di un buffer overflow è quello di ottenere il flusso del programma ed eseguire il tuo (malloso) codice.

Ciò che si desidera controllare al primo posto è il cosiddetto "indirizzo di ritorno" di una funzione. Prima che una funzione venga chiamata, l'indirizzo corrente viene inserito nello stack, quindi dopo che la funzione è terminata, il programma sa dove si trovava prima e continua l'esecuzione. Quindi, se consideriamo un esempio molto semplice:

void test() {
  char array[4];
  gets(array);
  printf("%s\n", array);
}

quindi lo stack sarebbe probabilmente simile a questo:

0000000n:  array[0]
00000n+1:  array[1]
00000n+2:  array[2]
00000n+3:  array[3]
00000n+4:  address where *test* was called

Quindi, poiché gets non controlla se il tuo input si adatta effettivamente al buffer che hai fornito, scriverà, scriverà e scriverà nello stack, anche se è più grande del tuo buffer. Quindi un utente malintenzionato può manipolare l'indirizzo di ritorno e fare in modo che il programma salti dove vuole dopo che test è terminato (in aggiunta inserisce un codice macchina dopo l'indirizzo di ritorno e fa jumpt in quell'area da qualche parte).

Si noti che questo esempio è molto astratto e solo qui per ottenere l'idea di base di questo attacco. Per maggiori dettagli visita siti come questo o questa spiegazione più semplice

    
risposta data 14.12.2015 - 12:53
fonte

Leggi altre domande sui tag