Le but de ces Travaux Pratiques est de manipuler les concepts de base couverts en cours.
Nous allons écrire un scanner de ports en C. Il va s'agir de réaliser un programme simple manipulant des sockets TCP/IP.
Ces TPs sont notés : prière de m'envoyer vos résultats (source code, Makefiles, réponses à chaque question) sous 1 semaine, sur mon email du CNAM.
On cherche à écrire un scanner de ports en C.
La programmation de sockets en C manipule directement les objets utilisés par le noyau (appels systeme) et est plus bas niveau (id est: plus complexe) que via des langages de plus haut niveau.
Voici un bon tutorial, très complet, concernant la programmation de sockets en C : https://beej.us/guide/bgnet/html/
Sous les environements fondés sur Debian, tels qu'Ubuntu, il faut installer les packets suivant: build-essential
Ecrire un fichier Hello World ainsi que son Makefile, et vérifier que le compilateur C fonctionne effectivement.
Telecharger le code d'un client TCP simple ici: https://beej.us/guide/bgnet/examples/client.c . Vous pouvez utiliser les commandes curl ou wget.
Modifier le port destination dans le client.c afin de se connecter au port 80.
Ecrire un Makefile afin de compiler client.c.
Tester le client compilé en tentant de se connecter au port 80 de Google. Que se passe t'il ? Pourquoi ?
Utiliser la command strace (voir man strace) pour suivre les appels systèmes utilisés succèssivement par votre client TCP pour se connecter a Google. Quel est le dernier ? Pourquoi bloque t'il ?
Modifier le code du client pour effectuer une requete HTTP GET et afficher le résultat (voir par exemple ce lien pour la construction d'une requete GET: https://www.ibm.com/docs/en/cics-ts/5.3?topic=samples-example-http-get-request-using-query-string). Vous aurez besoin d'utiliser l'appel systeme send(). Utiliser le manuel Linux et/ou le Beej tutorial pour déterminer comment utiliser cet appel système.
Que se passe t'il ? Pourquoi ?
Quelle est l'IP de google.com ? Y en a t'il plusieurs ? Pourquoi ?
Le port 80 de Google est il ouvert ?
Modifier le code de client.c (le nommer scanner.c) pour se connecter au port 80 et afficher un message différent suivant que la connection est réussie (port ouvert) ou non (port fermé).
Modifier votre code afin d'effectuer ces operations sur les ports 1 à 1024.
Scanner les ports de gmail.google.com.
Quels sont les ports ouverts ?
Modifier le code de scanner.c pour afficher le nom des services associès aux ports ouverts (utiliser le fichier /etc/services).
Que pensez vous de la vitesse de scan ?
Lire https://nmap.org/man/fr/man-port-scanning-techniques.html et https://nmap.org/book/synscan.html
On cherche à augmenter la vitesse de scan.
Par default, quel est le type de scan réalisé par nmap ?
Utiliser la commande time (voir "man time") pour chronometrer un connect scan à destination de gmail.google.com sur les 1024 premiers ports. Réaliser la meme opération concernant un SYN scan à destination de gmail.google.com. Conclusion ?
Lequel d'un connect scan ou d'un SYN scan vous semble le plus discret et le moins à même de laisser des traces dans les fichiers logs de gmail.google.com ? Pourquoi ?
Modifier votre code pour afficher des couleurs différentes suivant que le port est ouvert ou fermé.
Voir https://en.wikipedia.org/wiki/ANSI_escape_code et https://stackoverflow.com/questions/4842424/list-of-ansi-color-escape-sequences
Envoyer votre scanner final scanner.c ainsi que les réponses aux questions de ce TP à mon email du CNAM : jonathan.brossard at lecnam.net
Good for you ! S'attacher à réaliser les wargames disponibles ici pour progresser: https://overthewire.org/wargames/