L'Open Web Application Security Project (OWASP) è una community online, un progetto open-source che offre consigli, guide, articoli e software nell’ambito della sicurezza delle applicazioni. L’OWASP Top 10 include una lista delle maggiori vulnerabilità che un’applicazione web può avere, e l’obbiettivo è quello di educare sulle conseguenze che possono avere delle implementazioni errate e facilmente vulnerabili. Altri progetti degni di nota dalla stessa community sono i Cheat Sheets, una pagina completa di guide approfondite per le maggiori vulnerabilità conosciute, e l’OWASP testing guide. In questa serie di articoli andrò ad analizzare e testare ogni vulnerabilità con esempi pratici, utilizzando Mutillidae.
Dopo aver introdotto e spiegato l'Injection, eccoci con un nuovo articolo, stavolta su come eludere l’autenticazione e sulla gestione della sessione di login.
Uno dei controlli di sicurezza maggiori da effettuare quando si crea, progetta e programma un’applicazione è il login. Quanto potrebbe essere valido un sito se è possibile loggarsi con un qualsiasi account e sfruttare l’identità di altre persone? Pensate anche solo ad un servizio come Amazon; e se fosse possibile autenticarsi con l’account di un altra persona utilizzando i suoi dati della carta di credito?
In questo articolo verranno introdotte alcune tecniche per bypassare l’autenticazione ad applicazioni web, e come è possibile autenticarsi senza conoscere o avere i dati effettivi di login.
Già in passato avevo introdotto l'Enumerazione, questa tecnica consiste nel trovare informazioni sugli utenti e dei servizi di un sistema. In questo caso cercheremo di trovare gli utenti registrati al sito, in modo da poter successivamente tentare un attacco di forza bruta ed entrare in un account senza conoscerne la password. Utilizzerò Burp Suite, in modo da rendere automatico il processo.
Per prima cosa, guardo la sorgente della pagina di login e noto che è presente uno script in cui è presente la variabile lAuthenticationAttemptResultFlag che permette al client di capire se un utente esiste o meno. Grazie a questa variabile possiamo effettuare l’operazione. Se la variabile è 0, l’account non esiste, altrimenti (se è 1) l’account esiste.
Apro Burp Suite, imposto il browser e apro la pagina di login di Mutillidae. Dopo che Burp Suite ha caricato correttamente la richiesta la invio all’Intruder, il quale ci permetterà di effettuare l’attacco
Nell’Intruder evidenzio solo l’username per effettuare l’enumerazione
Seleziono la lista di nomi utenti da provare nel tab Payload, ed infine imposto il Grep Match nelle opzioni. Quest’ultima operazione ci permetterà di capire se un utente esiste o meno, poiché il browser risponderà con un TRUE se l’account esiste, FALSE altrimenti. Per impostarla basta copiare la variabile trovata prima e incollarla nell’apposito spazio.
Fatto ciò, clicco su Intruder->Start Attack e il software inizia ad eseguire l’operazione. Dopo pochi minuti, terminata l’operazione, noto subito gli account esistenti, i quali hanno la spunta sulla variabile impostata precedentemente
Ora, avendo trovato un account di nome admin, proverò a trovare la password dello stesso.
Il metodo Forza Bruta è uno degli attacchi più famosi e conosciuti. Esso consiste nel provare tutte le combinazioni possibili fino a che non si trova quella corretta (l’avevo usato anche per trovare i dati di login del router). Esistono diversi software per effettuare questa tecnica, io utilizzerò Hydra.
Hydra è uno dei migliori tools per effettuare tecniche di forza bruta contro molti protocolli (HTTP, SSH, FTP, MYSQL, etc.). Per visualizzare le opzioni basta digitare, come al solito
hydra -h
L’utilizzo è abbastanza semplice, specialmente con protocolli come ssh, telnet o http-get. Nel nostro caso, Mutillidae utilizza il metodo HTTP-POST, cosa che rende un attimo le cose più complesse, ma nulla di eccezionale (per chi non sapesse la differenza post vs get, può leggere qui). La pagina che Mutillidae ci presenta è questa
Provando manualmente con un paio di account, si nota subito che ci avvisa se l’account non esiste, o la password è sbagliata. In questo modo possiamo focalizzarci con il nome di un solo account, piuttosto che provare molti nomi.
Il comando di hydra che andrò ad utilizzare è
hydra -l admin -P psw/wordlists-user-passwd/passwds/johnpassword.lst 127.0.0.1 http-post-form "/index.php?page=login.php:username=^USER^&password=^PASS^&login-php-submit-button=Login:Not Logged In" -V
dove:
-l indica il nome dell’account da utilizzare. Se non l’avessi saputo avrei utilizzato -L con una lista di nomi da testare;
-P si riferisce al file contenente le password (preso - come sempre - da questa lista);
127.0.0.1 è l’indirizzo da attaccare;
http-post-form è il “protocollo” utilizzato. Se fosse stato un get, avrei utilizzato http-get-form. Nell’help di prima sono comunque elencati tutti;
"/index.php?page=login.php:username=^USER^&password=^PASS^&login-php-submit-button=Login:Not Logged In" si riferisce all’indirizzo da attaccare. Spiegandolo con più precisione:
Si può notare l’utilizzo di username e password per i due rispettivi campi
-V opzione che permette di visualizzare tutti i tentativi che il software effettuerà.
Dopo aver lanciato il comando, aspetto pochi minuti, ed ecco che ha trovato la password dell’account.
N.B. Come al solito questo procedimento è illegale, e qualsiasi sysadmin di un sito si accorge di un eventuale attacco di questo tipo. Vengono fatte richieste multiple, a volte migliaia nel corso di pochi minuti. Hydra permette l’utilizzo di un proxy (come tor).