13 mayo 2016

Detección proactiva de phishing con Javascript



Sin duda alguna el phishing es uno de los métodos mas utilizados por ciber-delincuentes, esto para estafar y obtener información confidencial de usuarios legítimos. Actualmente existen diversas soluciones de pago, basadas en controles preventivos, detectivos y reactivos.

En esta ocasión deseo compartir un control detectivo para ataques de phishing, el control detectivo está codificado en Javascript, el cual funciona como un agente de verificación incrustado en el mismo sitio web que se desea proteger, y tiene por objetivo detectar cuando un sitio web es copiado y levantado desde un dominio distinto al original, tal y como sucede en los casos de phishing. 

Consideremos que en la mayoría de los casos de phishing, el atacante descarga la web original que quiere clonar (ya que así se asegura de mantener el mismo aspecto visual) y posteriormente adecua el código fuente para almacenar o enviar por correo la información robada.  Ahora bien, volviendo al punto de mantener un aspecto visual idéntico, es que el atacante se ve forzado a usar las mismas referencias u objetos, por ejemplo: CSS, JavasSript, JQuery, entre otros.  Por tanto, ¿podriamos "camuflar" un script de detección el cual nos alerte de manera temprana cuando estamos siendo victimas de phishing?.  La respuesta es SI.

1. Verificación en el lado del servidor.
En este caso, haremos uso de PHP para la verificación y envio de notificación por correo electrónico (Sin embargo es posible realizarlo con otros lenguajes). 

En este ejemplo el fichero PHP será capaz de recibir información desde el script (Javascript) alojado en cualquier otro dominio.  Por motivos de seguridad, este intercambio de información entre dominios no es permitido por los navegadores, sin embargo esto puede resolverse haciendo uso de CORS (Cross-Origin Resource Sharing)
  
El fichero PHP se encuentra alojado en el mismo servidor del sitio web a proteger, en este ejemplo el sitio a proteger es http://www.prosec-it.com/mi_sitio, y el fichero PHP se encuentra en http://www.prosec-it.com/phish/verif.php. Gracias a CORS (Cross-Origin Resource Sharing), es posible implementar el fichero verif.php en otro servidor web, si se se desea.

El código fuente del fichero verif.php es:
<?php
header("access-control-allow-origin: *");   // Con esta linea habilitamos CORS.
$domain = $_POST['domain'];                 // Variable que recibira el dominio origen.

if ($domain=="www.prosec-it.com"){       // Aca se debe escribir el dominio de la web a proteger
    exit(0);
}else{                                                       // El dominio recibido se compara
    $subject='Alerta Phishing!';                   // y si son diferentes se envia una alerta
    $msg="La pagina web ha sido cargada desde un origen desconocido.";
    $msg.='<br><br>';
    $msg.='<table><tr><td>Origen:</td><td>'.$domain.'</td></tr></table>';
    send_notif($subject,$msg);
}
?>
En este ejemplo, la función para enviar correo "send_notif" hace uso de "phpmailer", el cual es un conjunto de lilbrerias PHP para el envío de correos, el código fuente de la función es:

function send_notif($subject, $msg){
    require ('class.phpmailer.php');
    $mail             = new PHPMailer();   
    $mail->SetFrom('phishing@alerta.com', 'Alerta');   
    $mail->Subject    = $subject;       
    $mail->MsgHTML($msg);   
    $mail->AddAddress('cesarcuencad@gmail.com', "CesarR CuencaD");
    $mail->AddAddress('cesar.cuenca@owasp.org', "CesarR OWASP");
    if(!$mail->Send()) {return -1;}
    else {return 1;}
}
Con esto, el fichero verif.php se encuentra listo para recibir información del javascript que enviará información desde cualquier otro dominio donde sea ejecutado.

2. Envio de información de dominio desde Javascript 
El objetivo en este paso es diseñar una porción de código en Javascript, el cual será incrustado en la pagina web que deseamos proteger, en este ejemplo el sitio que se desea proteger es http://www.prosec-it.com/mi_sitio/index.html,  por tanto se debe incluir la siguiente porción de código en "index.html".
<script>
     // Esta linea permite que el control se ejecute cada vez que el fichero "index.html" se carga en un navegador.
    window.addEventListener('load', test, false);

    // Esta función envia el dominio desde el cual se esta accediendo al fichero "index.html"
    function check(){
          var ajax_url = "http://www.*******.com/phish/verif.php"; // Reemplazar con tu dominio
          var d=document.domain;
          var params = "domain="+d;
          var ajax_request = new XMLHttpRequest();
          ajax_request.open("POST",ajax_url,true);
          ajax_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
          ajax_request.send(params);
    }
</script> 
El script anterior, obtiene el dominio de donde se esta ejecutando el "index.html" del sitio www.prosec-it.com/mi_sitio, por ejemplo, si el sitio se clonará, se subierá a otro dominio www.phishing.com, y se accediera a este sitio, el dato www.phishing.com será enviado a nuestro fichero PHP del paso 1.

3. Camuflaje del script
En este paso ofuscaremos el script para que no sea facilmente visible ni comprensible por simple inspección de código, para ello se debe copiar el código javascript del paso 2 en alguna herramienta de ofuscación, en este caso hice uso de la siguiente: http://www.javascriptobfuscator.com/Javascript-Obfuscator.aspx

Como resultado se obtiene el siguiente código javascript ofuscado.

<script>
var _0xbc3a=["\x6C\x6F\x61\x64","\x61\x64\x64\x45\x76\x65\x6E\x74\x4C\x69\x73\x74\x65\x6E\x65\x72","\x68\x74\x74\x70\x3A\x2F\x2F\x77\x77\x77\x2E\x6D\x6F\x65\x62\x69\x75\x73\x65\x63\x2E\x63\x6F\x6D\x2F\x70\x68\x69\x73\x68\x2F\x76\x65\x72\x69\x66\x2E\x70\x68\x70","\x64\x6F\x6D\x61\x69\x6E","\x64\x6F\x6D\x61\x69\x6E\x3D","\x50\x4F\x53\x54","\x6F\x70\x65\x6E","\x43\x6F\x6E\x74\x65\x6E\x74\x2D\x74\x79\x70\x65","\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x2F\x78\x2D\x77\x77\x77\x2D\x66\x6F\x72\x6D\x2D\x75\x72\x6C\x65\x6E\x63\x6F\x64\x65\x64","\x73\x65\x74\x52\x65\x71\x75\x65\x73\x74\x48\x65\x61\x64\x65\x72","\x73\x65\x6E\x64"];window[_0xbc3a[1]](_0xbc3a[0],test,false);function test(){var _0x56c1x2=_0xbc3a[2];var _0x56c1x3=document[_0xbc3a[3]];var _0x56c1x4=_0xbc3a[4]+_0x56c1x3;var _0x56c1x5= new XMLHttpRequest();_0x56c1x5[_0xbc3a[6]](_0xbc3a[5],_0x56c1x2,true);_0x56c1x5[_0xbc3a[9]](_0xbc3a[7],_0xbc3a[8]);_0x56c1x5[_0xbc3a[10]](_0x56c1x4)}
</script>
Ahora solo resta copiar el código ofuscado en el fichero "index.html" del sitio web a proteger.

4. Pruebas
 Ahora solo resta probar!. El sitio web de prueba (el que contiene el script) es http://www.prosec-it.com/mi_sitio/.

 

Descargué el anterior sitio y lo subi en un servidor local, http://172.29.21.16/mi_sitio/



Como resultado, a los pocos segundos me llegó el siguiente correo:



También probé subiendo la página clonada a un hosting:



 5. Conclusiones
Como se ha visto, la implementación de un control de detección temprana para ataques de phishing, empleando Javascript, es de mínima complejidad.  Si bien este control "reduce" la probabilidad de no detectar de manera oportuna un ataque de phishing, resta la posibilidad de que el atacante realice una inspección de código minuciosa antes de levantar un sitio clonado, y asi detectar y borrar nuestro script, por lo que se podría pensar en mejorar la tecnica de ofuscación y de camuflaje mostradas en este artículo. Por ejemplo se podría pensar en incrustar esta porción de código en librerias JS necesarias para replicar exactamente estilos y comportamientos visuales del sitio web (por ejemplo liberias jquery, grids, charts, sliders,etc.), y asi forzar al atacante a que incluya nuestro script sin percatarse de ello.

Espero que esta lectura haya sido de su agrado y mas importante aún, sea útil para ustedes.  Si desean mas información sobre este tema, no duden en escribirme. Muchas gracias a SBD por brindarme su espacio. Hasta la próxima.

Cesar Cuenca

Correo: cesar.cuenca@owasp.org
Twitter: @ccuencad