A Synack abbiamo davvero godere di grandi vulnerabilità, sia in web, mobile, host o anche in dispositivi e sistemi completamente scandaloso (satellite hacking chiunque?). Ma manteniamo sempre confidenziali i grandi risultati che noi e la SRT abbiamo fatto per i nostri clienti. Quindi, anche se questo non sarà un post su un grande vuln in un cliente Synack, copre il tipo esatto di cosa che vediamo su base settimanale o talvolta giornaliera: una vulnerabilità in un sistema con milioni di utenti che porta a un compromesso completo della sicurezza del sistema.

Recentemente ho trovato una vulnerabilità in Microsoft Live.com sistema di autenticazione, che, se si dispone di un account con qualsiasi servizio Microsoft, probabilmente avrebbe influenzato voi. Questo post descrive tutti i dettagli della vulnerabilità ora che Microsoft ha patchato il problema.

Introduzione

La comprensione della sicurezza informatica da parte della persona media è sempre stata piuttosto limitata. Back in the day, se qualcuno ha sentito che sei stato coinvolto nella sicurezza informatica, la domanda standard sarebbe “puoi hackerare il mio Hotmail”, o più spesso, “puoi hackerare Hotmail del mio amico”. Suppongo che nel corso della giornata la gente ancora utilizzato Yahoo mail e Microsoft doveva ancora acquisire Hotmail, ma questo è un po ‘ troppo indietro! Inevitabilmente suggeriresti che la persona indovini le domande di reimpostazione della password della persona o installi Sub7. In realtà hacking Hotmail era destinato ad essere troppo difficile, per non parlare del tutto illegale.

Il mondo della sicurezza informatica è cambiato molto negli ultimi due anni e, a differenza degli anni passati, Microsoft ora incoraggia pienamente i ricercatori di sicurezza a tentare di “hackerare Hotmail”. Naturalmente Hotmail è stato trasformato in Outlook.com, e in questi giorni tutti vogliono sapere se è possibile incidere il loro Facebook, ma questo è accanto al punto.

Microsoft Online Services bounty programma è stato recentemente aggiornato per includere “Account Microsoft” come un obiettivo, che è fondamentalmente i sistemi di accesso ospitato in ciascuno di questi domini:
– login.windows.net
– login.microsoftonline.com
– login.live.com

Nell’elenco di cui sopra, login.live.com è il sistema di autenticazione che si passerà attraverso se si tenta di autenticare Outlook.com e un numero enorme di altri servizi Microsoft. Ho deciso di esaminarlo prima per vedere se riuscivo a scoprire eventuali problemi. Come previsto, le varie API utilizzate per elaborare un login sembravano essere ben indurite. Ulteriori livelli di protezione esistevano in molti luoghi; ad esempio, in alcuni luoghi le password vengono crittografate con una chiave pubblica prima della trasmissione nonostante tutte le comunicazioni avvenissero su HTTPS.

Dopo aver testato per alcune ore, ho scoperto alcuni problemi minori che ho riportato, ma nulla di veramente degno di nota. Durante il test delle applicazioni Web, spesso trovo che il flusso di lavoro più comune sia anche il più sicuro, quindi mi sono ramificato per esaminare altri modi in cui un utente live.com sistema. Quasi un anno fa avevo trovato diverse vulnerabilità OAuth in Yammer che era anche un target di taglie di Microsoft Online Services, quindi è lì che ho cercato il prossimo live.com. Questo è dove iniziano i risultati interessanti!

Vulnerabilità Sfondo

Prima di entrare a destra nella vulnerabilità scoperta, una rapida panoramica del sistema di sicurezza fuorviante noto come OAuth è necessario:

Wikipedia mi dice che “OAuth fornisce alle applicazioni client un”accesso delegato sicuro” alle risorse del server per conto di un proprietario di risorse”. Wikipedia ha anche alcuni commenti graffianti sulla sua evoluzione e sicurezza, che vale la pena leggere per una bella risata. Realisticamente, tutto ciò che OAuth fa è consentire a un utente di concedere l’accesso ad alcuni o tutti gli accessi del proprio account a terzi. Ho fatto un disegno di MS Paint per illustrare questo perché non sono riuscito a trovare un grande su Wikipedia.

oauth-ridimensiona 2

Come si può vedere nell’immagine sopra, si dispone di un Server che l’Utente ha autorizzato a dare accesso al proprio account a un’app client. Il meccanismo che gestisce questo dietro le quinte può essere costruito in diversi modi, che sono definiti nella OAuth RFC. Un modo per costruirlo è un flusso di autenticazione” implicito”, che coinvolge il server di autenticazione che fornisce una chiave di accesso direttamente al client. Un altro modo popolare è utilizzare una procedura “codice di autorizzazione”, in cui il server di autenticazione emette un codice di autorizzazione, che il sistema client prende, e quindi scambia per una chiave di accesso usando il suo valore segreto client. Microsoft ha una buona descrizione del loro utilizzo di come hanno implementato questi meccanismi per live.com qui:
https://msdn.microsoft.com/en-us/library/hh243647.aspx

Il grafico che hanno creato per il flusso “codice di autorizzazione” è simile a questo:

 IC621323 2

Un’immagine del genere è ottima per comprendere il processo, ma per me come tester di penna mostra anche molte opportunità e luoghi in cui le cose vanno male. Quindi, con questo come sfondo, su ciò che è stato scoperto!

Cosa potrebbe andare storto?

Come notato nella sezione precedente, ci sono molti posti in cui qualcosa potrebbe andare storto. Uno dei passaggi fondamentali nella procedura di autenticazione OAuth è che un utente scelga di concedere l’accesso a un’applicazione. Questo di solito è realizzato attraverso un prompt come questo:

 oauth-accept 2

Generalmente un utente avrà solo bisogno di accettare questo prompt una volta, ma fino a quando non lo accettano, quell’app non avrà alcun accesso al proprio account (se l’utente medio consentirà all’app malvagia di Wes di accedere è forse una domanda diversa!).

Pensando come un attaccante, sarebbe sicuramente bello se potessimo accettare la richiesta per conto dell’utente. Sfortunatamente per me, l’intestazione” X-Frame-Options “era impostata su” deny ” (anche le impostazioni di x-frame-options erano fuori portata per questa taglia). Così, mentre clickjacking è fuori, ho deciso di ottenere una migliore comprensione di come la richiesta stessa ha funzionato. Se un utente fa clic su “Sì”, la seguente richiesta viene postata sul server (più alcune intestazioni noiose):

Blog-Testo-Codice 2

Mentre il percorso URL sopra include alcuni token generati, i test hanno dimostrato che non erano necessari per il successo della richiesta. Un POST al seguente URL funzionerebbe altrettanto bene:

https://account.live.com/Consent/Update?ru=https://login.live.com/oauth20_authorize.srf%3flc%3d1033%26client_id%3d000000004C15E107% 26scope % 3dwl.base % 26response_type%3dcode%26redirect_uri%3dhttp:// exfiltrated.com& client_id=000000004C15E107& rd=esfiltrato.com&ambito di applicazione=wl.basic

Il cookie inviato con la richiesta necessaria per contenere un token di sessione valido in “IPT”. Questo valore del cookie viene popolato dahttps: / / login.live.com/oauth20_authorize.srf prima che venga visualizzata la pagina che richiede all’utente l’autorizzazione. Ciò accade indipendentemente dal fatto che un utente faccia o meno clic su “Sì”, sebbene sia impostato da un codice Javascript, quindi se stiamo attaccando questo processo, dovremmo costringere l’utente a caricare quella pagina ad un certo punto.

Se stai seguendo, spero che tu stia chiedendo: “OK, quindi per quanto riguarda la richiesta POST stessa e quel valore canary?”. Avevo esaminato prima tutti gli altri parametri e i flussi di comunicazione, poiché vedere un valore etichettato “canary” inviato con una richiesta POST significa quasi certamente che viene utilizzato come token per prevenire attacchi CSRF. Il punto dei test di sicurezza, tuttavia, è verificare che le ipotesi siano effettivamente corrette. Così ho modificato la richiesta POST e ho cambiato il valore canary in “hacks_go_here”. Invece di reindirizzare a un errore 500, il server ha inviato una risposta positiva!

Da CSRF a PoC

Poiché il token CSRF era l’ultima cosa che avevo provato a manomettere, sapevo per certo che questo avrebbe dovuto creare una vulnerabilità CSRF valida. Come con quasi tutti gli attacchi CSRF, l’unico prerequisito era che la vittima fosse loggata e avesse un token di sessione valido nel suo cookie. A differenza di molte altre vulnerabilità web, l’impatto di una vulnerabilità CSRF dipende interamente dalla funzione API interessata. Questo CSRF mi consente di bypassare la fase di interazione dell’utente del sistema di autenticazione OAuth, ma un PoC vale più di mille parole, quindi il passo successivo è stato quello di creare un codice per dimostrare in modo appropriato l’impatto di questa vulnerabilità.

Nel normale flusso di autenticazione OAuth, dopo che l’utente concede l’accesso, il server deve restituire un codice di accesso all’utente. L’utente lo passa all’applicazione client, che può quindi utilizzare le autorizzazioni concesse. A live.com l’applicazione client può richiedere una vasta gamma di autorizzazioni possibili. Ho considerato solo il dumping dei contatti dell’utente o qualcosa del genere, ma perché sacrificare l’obiettivo di hacking Hotmail ora? Le autorizzazioni necessarie al mio PoC erano:

wl.offline_accesso + wl.imap

Offline non era tutto ciò che era necessario, ma l’ho buttato dentro per dimostrare che sarebbe stato concesso.

Con le autorizzazioni necessarie scelte, ci sono 4 passaggi per accedere all’account di posta elettronica di un utente:

1) Dobbiamo fare una richiesta di autorizzazione per la nostra app client utilizzando le autorizzazioni di cui sopra. Il server chiederà all’utente di accettare o rifiutare.
2) Quando un utente accetta la nostra richiesta di tali autorizzazioni, il server aggiungerà un parametro “# access_token=<token> ” al reindirizzamento che gli viene richiesto di eseguire.
3) Poiché i nostri script lato server avranno bisogno di accedere a quel valore, dobbiamo creare una semplice pagina per prendere il token dal campo URL del browser e passarlo al nostro server.
4) Infine abbiamo bisogno di alcuni script lato server per prendere quel token e usarlo per accedere a IMAP. Microsoft ha un processo un po ‘ complicato per l’utilizzo del token OAuth per accedere direttamente tramite IMAP. Esistono alcune librerie di esempio per questo e l’intero processo è descritto in questa pagina:
https://msdn.microsoft.com/en-us/library/dn440163.aspx

Quel flusso di lavoro funzionerebbe bene supponendo che l’utente scelga di darci il permesso. Ora ho solo bisogno di modificare il flusso di lavoro per includere invece il CSRF. Come notato in precedenza, il live.com il server di autenticazione si aspetta un token di sessione nel cookie IPT. Possiamo assicurarci che sia popolato inviando prima l’utente a una pagina validhttps: / / login. live.com/oauth20_authorize. srf. Subito dopo, possiamo eseguire la richiesta CSRF che utilizzerà il valore del cookie appena popolato. Questo può ora sostituire il passaggio 1 e forzare il server a passare immediatamente al passaggio 2.

Demo e Impatto

Microsoft ha ora risolto questo problema, ma ecco un rapido video che lo mostra in azione.

 hacking-demo2 2

Come si può vedere nel video, tutto ciò che è veramente necessario è quello di ottenere la vittima di visitare la tua pagina web dannoso. La demo non è stato progettato per essere subdolo e correre in background di un sito web, o come parte di qualche banner pubblicitario dannoso, ma certamente avrebbe potuto essere fatto in questo modo.

L’utilizzo di questo come attacco mirato ha sicuramente un impatto elevato, ma questo è anche il tipo perfetto di vulnerabilità per trasformarsi in un worm. Con IMAP e contact book access, un worm potrebbe facilmente inviare via email tutti i contatti di un utente (o almeno quelli che usano Hotmail, Outlook.com, ecc.), con qualcosa di allettante, stile virus” ILOVEYOU ” e diffuso a tutti gli utenti che fanno clic sul link.

Considerazioni finali e timeline

La caccia a questa vulnerabilità e la creazione di un PoC di lavoro hanno comportato una discreta quantità di sforzi per scavare tra i vari live.com API. Guardando indietro a tutto, tuttavia, questa è solo una classica vulnerabilità CSRF. L’unica cosa che sorprende è che si trova in un sistema di autenticazione critico che alla fine può essere utilizzato per rilevare l’account di qualsiasi utente.

Come tester esterno non ho idea di quanto tempo questa vulnerabilità possa essere esistita, o se qualcuno abbia mai provato a sfruttarla. Allo stesso tempo, sono risultati come questo che mostrano sicuramente il valore di consentire ai tester esterni di presentare vulnerabilità alla tua azienda prima che gli aggressori li sfruttino contro di te. Microsoft è molto più avanti della maggior parte delle aziende quando si tratta di sicurezza, eppure sono ancora suceptible a problemi come questo. L’esperienza di Synack è stata che le vulnerabilità sono scoperte anche in sistemi apparentemente ben protetti quando un folto gruppo di ricercatori esterni testano quel sistema. Questa è essenzialmente la premessa su cui opera Synack, ed è per questo che sempre più aziende offrono i propri programmi di taglie(io, ovviamente, consiglierei il programma di Synack sull’esecuzione del tuo!).

Come si può vedere nella timeline qui sotto, Microsoft è stata reattiva nell’ottenere una correzione per questo problema, il che è stato bello da vedere.

Timeline:
23 agosto 2015: Vulnerabilità scoperta
25 agosto 2015: Vulnerabilità segnalata a Microsoft
31 agosto 2015: Microsoft problemi numero di caso per vulnerabilità
15 settembre 2015: Microsoft rilascia fix per problema, problemi bounty 24,000 bounty (double bounties promo)

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.