Chapitre 9. Exercices a rendre du TP numero 3

Table des matières

Backdoor avancee, reniflage de paquets
Preliminaires
Ce qui est attendu de vous

Vous devrez rendre par mail a secu@lse.epita.fr avant le mercredi 22 avril 2006 a 23h42 une tarball bz2 nommee avec votre login. Les fichiers a rendre sont expliques ci-dessous.

Backdoor avancee, reniflage de paquets

Preliminaires

Nous allons creer une backdoor cachee qui s'active lorsqu'elle recoit certains paquets. L'interet d'une telle backdoor est qu'elle ne cree pas de connexions : elle ecoute juste un certain port, recoit les paquets et execute une commande si le paquet et valide. Comme elle ne cree pas de connexions, elle n'apparait pas lorsque l'on fait un netstat ou un port scan. L'interet de ce type de backdoor tres discrete est souvent de faire des DDOS (Distributed Denial Of Service) [c'est mal].

Ce qui est attendu de vous

Objectifs et fonctionnement :

  • Votre backdoor userland doit etre executee en setuid, pour pouvoir executer des commandes en root et pour pouvoir capturer les paquets
  • Les paquets doivent etre captures sur un port classique, pour etre discret, tel que le port 53 udp (DNS)
  • Les paquets seront encryptes et contiendront une en-tete qui permetra de verifier qu'il soit bien destine a la backdoor
  • On ajoutera des fonctions classiques de backdoor pour la rendre moins detectable (changer le nom par default).

Il faut donc:

  • Masquer le nom du programme, augmenter le niveau de privilege (reecrire sur argv[0] et setuid/setgid).
  • Initialiser les variables et les filtres de capture de paquets (on utilisera la libpcap - voir au debut de ce chapitre).
  • Lancer une boucle infinie de sniffing. Si cette boucle recoit un paquet, l'envoyer a un handler.
  • Le handler verifie si le paquet est ok a l'aide d'en-tete et de crypto simple. Si il n'y pas de clef d'en-tete ou que le reste du paquet n'est pas crypte on ne l'execute pas. Sinon on execute la commande decryptee.

Voici les etapes effectuees par le handler :

  • On doit d'abord retrouver le payload du paquet. Pour cela on doit avancer le pointeur paquet de la taille d'une structure UDP (44 octets), on verifie si la taille du payload est > 0
  • On copie les n bytes de la taille de clef d'en-tete a partir de la position courante, on verifie la validite de cette en-tete puis on avance le pointeur si l'en-tete est valide.
  • On decrypte tout le reste du payload (on utilise une fonction de crypto simple, comme un XOR avec une clef de plusieurs caracteres (-> pas de DES ni AES ;-)).
  • On verifie si le paquet a bien etait decrypte grace a des marqueurs (start[ et ]end) qui se placent en debut de commande (on peut verifier leur presence avec strstr par exemple).
  • On execute la commande extraite, et on return.

Voila a quoi ressemble un packet : (la partie entre '*' est cryptee)

------------------------------------------------------------------------------------
|               |clef   |*                                                        *|
|               |en-tete|*                                                        *|
|en-tete udp    |       |*      start[command]end                                 *|
|               |       |*                                                        *|
|44 octes       |       |*                                                        *|
------------------------------------------------------------------------------------
      

Voila pour la backdoor, a vous de trouver comment envoyer les paquets cryptes, c'est assez simple : on peut utiliser un petit programme C de quelques lignes qui applique la crypto sur la commande et un script qui pipe dans hping2 par exemple qui est un programme qui va se charger de l'envoyer correctement.

Si vous suivez bien les details il ne devrait pas avoir de problemes. N'hesitez pas a poster des questions bien sur.

Vous devrez rendre dans votre tarball de rendu le fichier backdoor.c qui contient la source de votre serveur backdoor, avec quelques explications en commentaire (votre tout petit algo de chiffrement), et le fichier send_command.c qui servira de client, pour envoyer les commandes.