2 - Programmation des sockets en C sous Linux par Sboub

 

            Dans ce Hackerstorm MAG n°2 (yeah !) nous allons parler de la programmation

            des sockets en C sous LINUX (meme principe que sous WINDOWS vu que nous n'utiliserons pas

            encore de RAW SOCKET, mais le boss de WINDOWS c'est TIPIAX...salut à lui!).

            Cet article a été fait un petit peu vite vu que je manque de temps... mais promis la prochaine

            fois ce sera mieux :)

 

            ----

            N.B => Tous ceux qui ne pigent que dalle ou qui ont des questions particulères (ou

            bien qui peuvent m'instruire !) sont les bienvenus sur #hackerstorm en UNDERNET ou sur

            SBOUB666@hotmail.com

            ----

 

         A - Les sockets,qu'est ce que c'est ?

 

            Un socket (un/une ?, bon on s'en fou) c'est en fait un canal de communication que vous ouvrez ou

            que vous écoutez pour voir si d'autres personnes vous envoies des données.

            Il existe différents type de sockets:

 

            SOCK_STREAM

            Très utilisée, communiction dans les deux sens. Plusieurs connexions possibles en meme temps.

 

            SOCK_DGRAM

            Ici, il n'y a pas de moyen de controler si tous les paquets sont arrivés mais c'est un protocole

            très peu utilisé donc aucun problème.

 

            SOCK_RAW

            C'est le plus interressant : avec ce protocole vous faites CE QUE VOUS VOULEZ !! Vous pouvez envoyer

            un paquet IP avec la source désiréé etc... très utilisé pour le SPOOFING.

 

            SOCK_RDM

            Pas encore supporté ?

 

            SOCK_SEQPACKET

            Ressemble au DGRAM...

 

            J'ai été un peu court dans cette partie car ce n'est pas très utile... et je manque de temps ! :)

 

         B - Ouvrir une connection

 

            Il existe différents type d'adresse :

              AF_UNIX     (Unix internal protocols)

              AF_INET     (ARPA Internet protocols)

              AF_ISO      (ISO protocols)

              AF_NS       (Xerox Network Systems protocols)

              AF_IMPLINK  (IMP "host at IMP" link layer)

 

            Et protocoles....:

              ip     0   IP    # internet protocol, pseudo protocol number

              icmp   1   ICMP  # internet control message protocol

              igmp   2   IGMP  # internet group multicast protocol

              ggp    3   GGP   # gateway-gateway protocol

              tcp    6   TCP   # transmission control protocol

              pup    12  PUP   # PARC universal packet protocol

              udp    17  UDP   # user datagram protocol

              idp    22  IDP   # WhatsThis?

              raw    255 RAW   # RAW IP interface

 

            Les bibliothèque importantes sont <sys/types.h> et <sys/socket.h>.

 

            Donc voici comment ouvrir une connection:

 

            int sockfd; // le numéro du socket (utile car on peut en ouvrir plusieurs)

            struct hostent *he; // la structure qui recevra nos infos

            struct sockaddr_in serveur_addr; // la structure qui recevra les infos du serveur par exemple

 

            // On résoud le nom...

            if ((he=gethostbyname(server)) == NULL) {herror("gethostbyname");exit(1); }

            if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {perror("socket"); exit(1); }

 

            // On rempli les structures...

            serveur_addr.sin_family = AF_INET;

            serveur_addr.sin_port = htons(port);

            serveur_addr.sin_addr = *((struct in_addr *)he->h_addr);

 

            // On se connecte avec le serveur...

            if (connect(sockfd, (struct sockaddr *)&serveur_addr,sizeof(struct sockaddr)) == -1) {perror("connect"); exit(1);}

 

            Ca y est vous êtes connecté ! En cas de problème la fonction renvoie -1 et le type d'erreur.

 

         C - Envoyer et recevoir des données.

 

            Voici les définitions des fonctions le permettant...

 

              int recv(int s, void *buf, int len, unsigned int flags);

              int send(int s, const void *msg, int len, unsigned int flags);

 

              int recvfrom(int s, void *buf, int len, unsigned int flags, struct sockaddr*from, int *fromlen);

              int sendto(int s, const void *msg, int len, unsigned int flags, const struct sockaddr *to, int tolen);

 

 

            EXEMPLE:

            ~~~~~~~~

            char *envoi = "Test...";

            send(sock,envoi,strlen(envoi),0);

 

            sock=notre socket

            envoi=notre chaine

            strlen(envoi)=la longeur de la chaine envoyée

            0=le flag (MSG_OOB, NORMAL...)

 

            Nous pouvons aussi utiliser les fonctions READ et WRITE pour recevoir et envoyer des données.

 

            Comme ceci:

            write(s, envoi, strlen(envoi));

            read(s, recu, 69000);

 

         D - Fermer une connection

 

                  C'est très simple, utilisez la commande "close(socket)". Ici socket est le nom de votre socket.

 

         E - Un peu plus loin...

 

            Vous pouvez déjà vous amuser à étudier l'exemple BONUXX.

            J'ai cité les RAW SOCKET tout à l'heure, nous parlerons dans le prochain mag comment l'utiliser

            et pourquoi faire... sachez juste que tout bon hacker doit savoir l'utiliser !

            Si vous voulez des exemples de sources SOCKET allez sur le site du groupe : HACKERSTORM.COM

 

         F - L'exemple BONUXXXX !!!

 

            Un petit scanner TCP/IP à connexion complète qui illustre très bien

            les possibilitées de base des sockets... Etudiez le bien il pourra vous

            être très utile et en le modifiant un peu on peut faire beacoup de choses.

 

            COPIER/COLLER -------------------------------------------------------------------------------------------

                  /*SCANNER TCP à connexion complète

                                  By SBOUB.

                  */

 

                  #include <stdio.h>

                  #include <stdlib.h>

                  #include <unistd.h>

                  #include <string.h>

                  #include <netdb.h>

                  #include <arpa/inet.h>

 

                  struct in_addr resolve (char *name)

                  {

                     static struct in_addr in;

                     unsigned long l;

                     struct hostent *ent;

  

                     if ((l = inet_addr(name)) != INADDR_NONE) { in.s_addr = l; return in; }

                     if (!(ent = gethostbyname(name))) { in.s_addr = INADDR_NONE;  return in; }

 

                     return *(struct in_addr *)ent->h_addr;

                  }

 

                  main(int argc, char **argv)

                  {

                   struct sockaddr_in addr;

                   int soc, rc, addr_len;

                   unsigned long port, endp = 65334;

                   char *victim;

 

                   if (argc < 2) { fprintf(stderr,"Scanner TCP à connexion complète par SBOUB.\nUSAGE : %s <host> [endport]\n\n", argv[0]); exit(1); }

                   victim = argv[1];

                   if (argc > 2) { endp = atol(argv[2]); }

 

                   printf("Scanner TCP à connexion complète par SBOUB.\nScan TCP sur %s (port 0 -> %d)...\n\n", victim,endp);

 

                   addr.sin_addr = resolve(victim);

                   if (addr.sin_addr.s_addr == INADDR_NONE) { fprintf(stderr, "Host [%s] non trouvé\n", victim); exit(1); }

 

                   addr.sin_family = AF_INET;

                   addr_len = sizeof(addr);

 

                   for (port = 1; port <= endp; port++)

                   {

                    soc = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

                    addr.sin_port = htons(port);

                    rc = connect(soc, (struct sockaddr*) &addr, addr_len);

                    close(soc);

 

                    if (rc < 0)continue;

 

                  // A vous de rajouter vos propres ports (ceux des trojans par exemple...)

 

                    if (port==21) { printf("Port 21 (FTP)\n"); }

                    else if (port==22) { printf("Port 22 (SSH Remote Login Protoco)\n"); }

                    else if (port==23) { printf("Port 23 (TELNET)\n"); }

                    else if (port==25) { printf("Port 25 (SMTP)\n"); }

                    else if (port==37) { printf("Port 37 (TIMESERVER)\n"); }

                    else if (port==67) { printf("Port 67 (BOOTP SERVER)\n"); }

                    else if (port==68) { printf("Port 68 (BOOTP CLIENT)\n"); }

                    else if (port==70) { printf("Port 70 (GOPHER)\n"); }

                    else if (port==79) { printf("Port 79 (FINGER)\n"); }

                    else if (port==80) { printf("Port 80 (HTTP)\n"); }

                    else if (port==98) { printf("Port 98 (LINUXCONF)\n"); }

                    else if (port==107) { printf("Port 107 (RTELNET)\n"); }

                    else if (port==109) { printf("Port 109 (POP2)\n"); }

                    else if (port==110) { printf("Port 110 (POP3)\n"); }

                    else if (port==111) { printf("Port 111 (RPC 4.0 PortMapper)\n"); }

                    else if (port==113) { printf("Port 113 (AUTH authentication tap ident)\n"); }

                    else if (port==123) { printf("Port 123 (TIME)\n"); }

                    else if (port==137) { printf("Port 137 (NETBIOS Name Service)\n"); }

                    else if (port==138) { printf("Port 138 (NETBIOS Datagram Service)\n"); }

                    else if (port==139) { printf("Port 139 (NETBIOS Session Service)\n"); }

                    else if (port==213) { printf("Port 213 (IPX)\n"); }

                    else if (port==443) { printf("Port 443 (HTTPS)\n"); }

                    else if (port==512) { printf("Port 512 (EXEC)\n"); }

                    else if (port==513) { printf("Port 513 (LOGIN)\n"); }

                    else if (port==514) { printf("Port 514 (SHELL)\n"); }

                    else if (port==515) { printf("Port 515 (PRINTER)\n"); }

                    else if (port==530) { printf("Port 530 (RPC)\n"); }

                    else if (port==543) { printf("Port 543 (KLOGIN)\n"); }

                    else if (port==544) { printf("Port 544 (KSHELL)\n"); }

                    else if (port==1080) { printf("Port 1080 (SOCKS)\n"); }

                    else if (port==6000) { printf("Port 6000 (XWINDOW)\n"); }

                    else if (port==6660) { printf("Port 6660 (IRCD)\n"); }

                    else if (port==6661) { printf("Port 6661 (IRCD)\n"); }

                    else if (port==6662) { printf("Port 6662 (IRCD)\n"); }

                    else if (port==6663) { printf("Port 6663 (IRCD)\n"); }

                    else if (port==6664) { printf("Port 6664 (IRCD)\n"); }

                    else if (port==6665) { printf("Port 6665 (IRCD)\n"); }

                    else if (port==6666) { printf("Port 6666 (IRCD)\n"); }

                    else if (port==6667) { printf("Port 6667 (IRCD)\n"); }

                    else if (port==6668) { printf("Port 6668 (IRCD)\n"); }

                    else if (port==6669) { printf("Port 6669 (IRCD)\n"); }

                    else printf("Port %d (????)\n", port);

                   }

 

                   printf("\nOki boss... ;)\n");

                   exit(0);

                  }

            --------------------------------------------------------------------------------------------------

                  Pour tout commentaires : #hackerstorm en UNDERNET ou sur SBOUB666@hotmail.com

 

                  Dans le prochain mag, un bot complet en C. Un programme de chat. Et peut-etre les RAW SOCKET.........