19 août 2007

Sniffers remote detection

Bien que les sniffers soient des outils d'administration et de dévelopement terriblement utiles, leur mise en place sur un réseau par des utilisateurs malveillants peut leur permettre de corrompre peu à peu toutes les machines du réseau.

Ils peuvent être plus ou moins furtifs, mais la quasi-totalité fonctionnent en plaçant la carte réseau en mode promiscuous. C'est à dire en mode d'acceptation de tous les paquets qui se présentent à elle, qu'ils lui soient déstinés ou non.
Ce peut être extrêmement difficile à détecter sur de gros réseaux si l'on n'y prend garde, mais de là à penser que c'est mission impossible il y a un pas que nous n'allons pas franchir!

Sur une machine, un simple ipconfig permettra de constater si la carte est ou non en mode promiscuous.
Mais le problème est différent lorsque la détection doit se faire à distance, et c'est pourtant une nécessité sur de gros réseaux.
Plusieurs approches sont possibles, mais l'une a retenu mon attention, elle est basée sur l'envoi de requêtes ARP.

D'ordinaire, ces requêtes sont envoyées en broadcast (adresse MAC FF:FF:FF:FF:FF:FF). Mais si on modifie le champs "destination" en y mettant FF:FF:FF:FF:FF:FE , une machine en mode "normal" refusera le paquet, mais pas une hébergeant un sniffer.
Passé la barrière matérielle, le paquet sera envoyé au noyau. Nous nous retrouvons alors face à une barrière logicielle. Mais il y a un bug sur les noyaux Linux 2.2->2.6 et Windows 95->Vista (vérifié pour linux 2.4 et 2.6, windows XP et Vista). Les adresses de destination ne sont pas complètement analysées, et pour le kernel, FF:FF:FF:FF:FF:FE sera identique à FF:FF:FF:FF:FF:FF. L'ordinateur nous enverra donc un paquet de type ARP reply.

Il suffit alors, après l'envoi du paquet d'attendre une réponse et d'analyser les champs de cette réponse pour connaitre l'émetteur et en déduire que sa carte réseau est en mode promiscuous.
Je suis actellement en train d'écrire un logiciel exemple. Je posterais le code ici lorsqu'il sera fini.

Update : Voici une première version fonctionnelle du code (archive zip, archive tar.gz), toute fraichement sortie de vim. Il doit y avoir pas mal de choses à revoir et optimiser. Je tacherais de trouver le temps nécessaire dans les semaines à venir.
En attendant le code constitue un bon (j'espère) exemple d'utilisation des raw sockets.

30 mai 2007

Timing attacks

Je suis tombé il y a peu face à une description des "Timing Attack".
Ce type d'attaque s'en prend à la manière dont un algorithme est implémenté plutôt qu'à l'algorithme lui même. Elle consiste à analyser le temps pris par une implémentation de l'algorithme à éxecuter un jeu d'instruction dans différents cas de figure. Ainsi, on pourra détecter des noms d'utilisateurs valides ou l'état activation d'options de sécurité sur un système.
SSH était vulnérable jusqu'en 2003. Mais aujourd'hui bien des services restent vulnérables à de telles attaques.
Voici un Proof of Concept écrit en bash
Bien que les timing attacks ne représentent pas un danger bien grand, coder et menerl'exploit reste très intéressant et instructif!

Enjoy

29 mai 2007

Aping

Aping (advanced ping programm) est un logiciel écrit intégralement en python dans le but d'effectuer des sondes ICMP (ICMP probes). Il permet à l'utilisateur de choisir entre 4 types de sondes (là où le classique utilitaire ping n'en propose qu'une). Bien que Aping soit en cours d'écriture (V 0.4alpha) il fonctionne déjà bien, offrant d'intéressantes possibilités.
J'ai rejoint le projet il y a un mois afin de progresser en python et d'accroitre mes (maigres) connaissances à propos des réseaux.

Aping permet d'envoyer des echo request ICMP probes (tel le légendaire ping), address mask requests, timestamp requests et information requests. Le fait qu'il fonctionne à 100% en ligne de commande en fait un outil aisément scriptable. Nous avons essayé d'implémenter autant d'options que possible nécessaire (cf. la page de man du projet,écrite en parallèle par Kantor, l'administrateur et moi, contributeur)
La homepage du projet : http://directory.fsf.org/All_Packages_in_Directory/aping.html Le code source de Aping constitue un exemple (j'espère) assez bon de l'utilisation de la syntaxe objet de python ainsi que de l'usage dans ce même langage des RAW sockets..

RSA vs. factorisation

En voilà un combat sans merci, d'immenses clefs publiques contre de très efficaces algorithmes de factorisation!
Cet article à pour objectif de fournir un exemple d'utilisation de la lib msieve pour factoriser de gros entiers, permettant alors de mener des attaques contre RSA.

Tout d'abord la clef publique n et l'exposant de cryptage e:
openssl rsa -in rsa_pubkey -pubin -text -modulus
Attention, pour le transmettre à msieve, vous devez le convertir de l'hexadecimal vers la base décimale.
La factorisation m'a pris moins de 6 minutes sur un ordinateur récent:

./msieve -v 88260953927468241474867846663425636168437996919670523974529485668694484885501

prp39 factor: 292785807180363836183730601206614239829
prp39 factor: 301452296398701966007535887834606933769
elapsed time 00:05:55


L'algorithme utilisé ici est le "QS" il en existe d'autres extrêmement efficaces. Il pourrait être intéressant de distribuer la factorisation. Ici se trouve une source permettant de convertir une clef publique factorisée en une clef privée.
Msieve, lui, est disponible ici: http://www.boo.net/~jasonp/qs.html

28 mai 2007

Cryptage RSA pour systèmes *nix

RSA est l'un des plus solides algorithmes actuels. Implémenté dans OpenSSH pour sécuriser l'envoi de données sur les réseaux, il peut aisément être utilisé pour crypter des fichiers.
Quatres commandes suffisent pour celà:

Une clef privée se génère via la commande suivante (pour une clefs de 256 bits):

openssl genrsa -out rsa_privkey 2048



De la même manière, on génèrera la clef publique associée:

openssl rsa -in rsa_privkey -pubout -out rsa_pubkey



Cryptage / décryptage d'un fichier:

openssl rsautl -encrypt -pubin -inkey rsa_pubkey -in plain.txt -out
cipher.txt
openssl rsault -decrypt -inkey rsa_privkey -in cipher.txt


Maintenant si vous vous ennuyez en ce moment ou si votre ordinateur s'encroute voici pour vous occuper: J'ai entendu parler du challenge de factorisation de clefs RSA il y a quelques mois. Le challenge est ouvert ici Le plus petit modulo à n'avoir jamais été factorisé est long de 704 bits. Mais une clef inférieure à 640 bits ne peut être considérée comme sûre. Lors de mes tests, (voir dans un prochain article) il ne m'a fallu qu'une dizaine de minutes pour décrypter un fichier crypté par une clef de 256 bits!