Sécurité

Comment créer un keylogger en moins de 20 minutes (même quand on débute en Python)

On estime aujourd’hui entre 100 à 150 million le nombre de PC sous le contrôle d’un hacker. Ils utilisent des logiciels espions ou spywares : des petits programmes taillés pour récupérer vos informations personnelles : mots de passe, compte facebook, carte bancaire, nudes, tout y passe et votre identité risque d’être volée. Nous allons voir ensemble comment créer un programme de ce style, un keylogger.

Je suis sûr que vous vous êtes toujours demandé comment ces pirates se débrouillaient pour récupérer ces précieuses données si facilement : quels sont leurs secrets, leurs techniques et surtout comment s’en protéger.

Parce que le savoir est une arme, aujourd’hui nous allons fabriquer un keylogger : un spyware qui pourra récupérer tout ce qui est tapé au clavier, et en particulier les mots de passe. Vous allez voir qu’il existe des méthodes qui ne demandent que quelques lignes de python, pas besoin d’être un génie du code : c’est assez terrifiant…

On va se focus sur linux uniquement : chaque système gère le clavier différement donc il n’y a pas de méthode portable. Les articles sur Windows et sur Mac OS viendront plus tard !

Disclaimer

Cet article a des visées purement éducatives. Je suis profondément convaincu par l’accès libre au savoir et l’intérêt de la culture hacker, mais cela ne donne pas le droit de voler des données : vous êtes responsable de ce que vous faites.

Coder un keylogger : la méthode facile

La solution fastoche, c’est d’utiliser une librairie toute faite. En python il y a pyxhook qui fait ça très bien, voilà ce que ça donne :

Ca marche bien et c’est très facile (c’en est flippant, 7 lignes de code et c’est parti). Le problème c’est que moi, j’ai envie de comprendre ce qu’il se passe. On ne va pas se contenter de ça du coup, mais voir comment les choses se font au niveau des fichiers systeme, et aussi comment récupérer les données qu’on capture via internet !

Coder un keylogger : les mains dans /dev/event*

Allez du coup on va essayer de comprendre ce qu’on fait !

Comment sont gérés les évênement sous Linux ?

Sous Linux, tout est fichier ! Et les évênements n’échappent pas à la règle. Mais du coup dans quel fichier on doit chercher ??

On va d’abord se diriger vers /dev, c’est là que sont les fichiers de tous les périphériques. Plus précisément, on va aller dans /dev/input : ce dossier contient tous les périphériques d’entrée (dans la plupart des cas ça veut dire le clavier et la souris). Voilà le contenu du mien :

keylogger contenu /dev/input (fichiers event*
Mon /dev/input

Et là c’est le drame : il y en a beaucoup plus que deux. On prend lequel ? Déja, pour le clavier, on peut éliminer les fichiers mouse*, ça nous en laisse quand même 18.

Quel event* est le bon ?

On va aller chercher dans /proc/bus/input/devices.

C’est quoi ce fichier me direz vous.

Eh bien il décrit les périphériques connectés au PC. Ca semble être le bon endroit pour continuer à enquêter sur notre clavier. Voilà un extrait de mon /proc/bus/input/devices :

keylogger extrait de /proc/bus/input/devices
Extrait de mon /proc/but/input/devices

Chaque périph’ correspond à un paragraphe, on y trouve le nom et l’adresse de chaque périphérique, mais surtout au niveau de la ligne “H: Handlers”, on trouve eventX.

On a donc nos périphériques et on sait dans quel fichier ils écrivent leur flux. Maintenant, comment savoir à coup sûr qui est notre clavier ?

Il faut chercher à la ligne “B: EV=”. Cette ligne décrit le type d’évênements envoyés. Là, ça ne s’invente pas, un clavier a un “EV=120013”. On sait donc que chez moi par exemple, le clavier écrit dans event3.

Implémenter le keylogger en Python

Première étape : trouver le clavier

On va commencer par automatiser ce qu’on a vu juste avant : trouver le bon fichier event. Le plus simple pour ça c’est d’utiliser des expressions régulières.

Voilà la fonction, commencez par essayer de comprendre, j’arrive en dessous pour tout détailler.

Donc on ouvre notre /proc/bus/input/devices ligne par ligne puis on commence par chercher à la fois les lignes des Handlers (où on trouve les eventX) et les lignes des EV (où on trouve le type d’évênements de l’eventX).

Ca donne une liste du style [eventX, type, eventX, type, eventX, type, eventX, type, …].

Il ne reste plus qu’à trouver le type qui matche avec le clavier (là où on a “EV=120013”) et de choisir la case d’avant dans la liste, c’est à dire le eventX du clavier. Normalement, c’est bon pour la première partie !

Deuxième étape : tout lui pomper !

Bon, essayons de voir ce qui se passe si on écoute directement le clavier :

Le fichier que notre keylogger va venir lire : rien de lisible directement
La sortie de notre event… pas très friendly

Euh… c’est pas vraiment ce qu’on a tapé…

Lire dans l’eventX

En effet, ces eventX ne reçoivent pas directement un caractère mais cette structure de données :

  • Un timestamp : la date de l’évênement
  • Le type et le code de l’event (si c’est un bouton relaché ou pressé, etc . On ne s’en servira pas mais si ça vous intéresse il y a des refs : ici)
  • Puis à la fin, une valeur : un nombre qui correspond à la position de la touche pressée. C’est cette valeur qui est ensuite convertie en caractère.

Donc voilà le bout de code qui va aller chercher ces valeurs :

Donc dans l’ordre :

  • On commence par un Format : c’est une chaine de caractère qui permet de dire à Python quoi lire et dans quel ordre. llHHI veut dire long int, long int, short int, short int, int.
  • Derrière on peut simplement unpack le flux c’est à dire le récupérer dans des variables séparées : les deux premiers long stockent la date (qu’on n’utilise pas), les deux short sont le type et le code, l’int de la fin est la valeur qui nous intéresse.
  • On vérifie ensuite que le code soit différent de 0, ça veut dire qu’il y a eu un évênement
  • Et aussi que le type vaut 1, ce qui correspond à une touche enfoncée
  • Il ne nous reste plus qu’à convertir la valeur en caractère (on utilise un dictionnaire pour ça, les valeurs se trouvent ici). Ce qui donne le dictionnaire python suivant, légèrement adapté pour un clavier azerty
  • Enfin on écrit tout ça dans un fichier. Vous remarquerez qu’on n’écrit que de temps en temps (tous les 128 caracteres) plutot que chaque caractère pour limiter le nombre d’accès disque.

Coder un keylogger : récupérer nos données par mail

On sait maintenant capturer les données mais il reste un problème : l’idéal serait de ne pas avoir à se reconnecter au pc de la victime pour récupérer un fichier. Il y a plein de techniques pour faire ça : on pourrait envoyer les données par ftp, par tcp ou même sur pastebin ou twitter.

Ici j’ai choisi d’utiliser les mails : encore un truc fourni gratos par Python ! Voici le bout de code en question :

Ce qu’on fait est plutot explicite, dans l’ordre on va :

  • créer un serveur mail
  • renseigner notre mail (on considère qu’on s’envoie un mail à nous même)
  • se connecter à notre serveur smtp
  • envoyer la chaine de caractères

C’est tout ce que fait cette fonction, et ça suffit largement pour envoyer des données, chez moi ça donne ça :

Exemple d'email envoyé par le keylogger
Le mail que notre programme nous envoie

Et si on éteint l’ordi ??

Je vous ai mis tout le code ensemble, c’est à retrouver sur mon github.

Super ! ça marche ! Il nous manque juste un truc : qu’est-ce qu’il se passe si on reboot ? Bah on perd notre keylogger. Il nous faut donc un mécanisme de persistance pardi !

Bienvenue au pays de Cron

Il y a plusieurs possibilités. Ici on va voir les Cron jobs. Alors qu’est-ce qu’un Cron job me direz vous ? Eh bien c’est une tache qu’on programme pour être exécutée régulièrement : c’est parfait pour nous et c’est super simple.

La commande pour éditer le fichier de conf de cron (le crontab) est sudo crontab -e (on l’execute en root car notre programme a besoin des droits root pour aller lire les event*)

Donc ça ouvre notre joli éditeur et il ne nous reste plus qu’à rentrer notre job :

00 */6 * * * ./path/to/keylog.py [parameters]

Pour comprendre il faut connaitre la syntaxe de cron : les nombres donnent la période à laquelle on recommence à executer le job (secondes, minutes, heures, jours, jours de la semaine, mois, etc) et la commande à exécuter suit, dans notre cas, on execute le keylogger toutes les 6h !

Et… c’est tout ! Si vous voulez le détail sur cron je vous invite à faire un tour sur la doc ubuntu de cron, c’est vraiment bien foutu.

Vous remarquerez que j’ai rajouté des parametres au programme, si vous faites un tour sur mon github vous verrez que ça permet de renseigner le serveur smtp, l’email, le nombre de caracteres à lire, etc, sans devoir retoucher au code, histoire de rendre tout ça un poil plus flexible !

Bravo !

On a réussi à créer une sale bestiole qui peut potentiellement récupérer tout un tas de mots de passe ou de secrets inavouables. C’est déja un petit projet fonctionnel qui permet aussi aux débutants en Python de travailler sur plein de sujets, en vrac on a vu :

  • les expressions régulières
  • la gestion des fichiers
  • l’envoi de mail
  • les évênements sous linux
  • et il faut avouer que c’est quand même bien badass

Le pas d’après serait de comprendre le genre de failles qui permettent d’installer ce type de programme, comment les trouver et les exploiter mais surtout comment s’en protéger. Il y a aussi un nombre énorme de possibilités : on pourrait faire des screenshots ou encore capturer la souris.

C’est ce dont je parle dans mes articles, que ce soit ici ou par email. N’hésitez pas à vous abonner à mes mails car les membres reçoivent du contenu exclusif !

Abonnez vous aux emails privés !
Recevez du contenu exclusif qui n'apparait pas sur le blog

Leave a Reply

Your email address will not be published. Required fields are marked *