Salut à tous, je vous présente
un petit article de prog réseau sous windows (qui peut aussi s'adapter
à linux) puisqu'il s'agit des sockets. Le programme que je vous présente
est un backshell (backdoor qui ouvre un shell). Ce terme est un peu un
abus de langage car nous n'ouvrirons pas de shell dans ce programme, mais
nous allons le reproduire avec la fonction p) qui appartient à la
norme POSIX du langage C (d'où l'utilisation de Dev-C++ pour la compil).
Le principe du programme est simple, il ouvre un serveur TCP en écoute
sur le port 44 (port pris arbitrairement) et attends des requetes du client.
Les requetes
sont passées à la fonction p) qui va exécuter la commande
et stocker son
résultat dans un tampon (assez gros pour les grosses réponses,
par exemple le
listing d'un gros répertoire). Le contenu du buffer est ensuite envoyé au
client
à travers la socket.
Plusieurs directives sont indispensables au bon fonctionnement du programme :
_ Priorité sur la stabilité du serveur, bien gérer les erreurs, en cas d'erreurs
du client, on préferera le déconnecter que de planter !
_ Gérer la gestion des chaines de caractères, pour un si petit serveur, ce serait
bete qu'il souffre de buffer overflow...
_ Assurer la continuité du serveur, il est fait pour tourner infiniement dans
toutes les conditions !
Maintenant avoir fait un peu de théorie, passons à la pratique. Vous trouverez
le code à cette adresse :
Le code étant plutot bien commenté niveau prog, je tiens à mettre en valeur quelques
notions de programmation pure qui pourront vous servir tout le temps.
la fonction
GetConsoleHwnd() permet de récupérer
le handle de
la console pour pouvoir la masquer, j'ai récupéré cette
fonction dans la base
microsoft MSDN...
-> Concaténation sécurisée
strncat(buff, request, BUF_SIZE-strlen(buff)-1);
Cette utilisation de strncat permet de concaténer 2 chaines suivant la taille
disponible sur le tampon de destination, si le tampon lu est trop gros, la requete
est coupée (cela évite d'etre vulnérable à un buffer overflow)
En cas d'erreur du client, on sort de la boucle et on le déconnecte (voir à la
fin de la fonction main()) la dernière ligne permet de fermer explicitement le
buffer contenant la requete au cas ou la requete ait été coupé à la réception.
Cette méthode permet également d'éviter les dépassements...
Remarques finales :
L'infection n'est pas gérée dans ce code, il s'agit juste d'illustrer le principe
de base à travers un serveur stable et opérationnel.
Je vous confie un petit secret ;) Ce code fera peut etre l'objet du développent
de la suite de JackTrojan qui commenceà se faire vieux (dans un projet totalementSource, ça évitera les demandes intempestives :))