N-PN White-Hat Project
[C] Port Scanner - Version imprimable

+- N-PN White-Hat Project (https://dev.n-pn.fr/forum)
+-- Forum : Programmation (https://dev.n-pn.fr/forum/forumdisplay.php?fid=72)
+--- Forum : Langages compilés (https://dev.n-pn.fr/forum/forumdisplay.php?fid=25)
+--- Sujet : [C] Port Scanner (/showthread.php?tid=2544)



[C] Port Scanner - sakiir - 22-12-2012

Hello après avoir fais un port scanner en php, je me suis dit pourquoi ne pas le faire en C.
Dites moi ce que vous en pensez..
Donne voila ça donne ça:
Code C :
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdlib.h>
#include <errno.h>

int main(int argc, char **argv)
{
   int   sock;        
   int    port;        
   struct hostent *hostaddr;  
   struct sockaddr_in servaddr;  

   if (argc != 3 )
   {
      printf("-----------------Sakiir-Security------------------\n");
      printf("**************************************************\n");
      printf("******* Usage: ./scan <IPaddress> < Port> ********\n");
      printf("-------------------------------------------------\n");
      exit(1);
   }
 



   sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);


   memset( &servaddr, 0, sizeof(servaddr));
    port = atoi(argv[2]);
   servaddr.sin_family = AF_INET;
   servaddr.sin_port = htons(port);

   hostaddr = gethostbyname( argv[1] );

   memcpy(&servaddr.sin_addr, hostaddr->h_addr, hostaddr->h_length);

 
int co = connect(sock, (struct sockaddr *) &servaddr, sizeof(servaddr));
if(co < 0)
{
printf("Le port %d n'est pas ouvert sur %s\n",port,argv[1]);
close(sock);
exit(0);
}else printf("Le port %d est ouvert sur %s\n",port,argv[1]);close(sock);exit(0);
 
}
 


Le nouveau :
Code C :

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdlib.h>
#include <errno.h>


int main(int argc, char **argv)
{
   int   sock;        
   int    port;        
   struct hostent *hostaddr;  
   struct sockaddr_in servaddr;  
errno = 0;  
   if (argc != 3 )
   {
      printf("-----------------Sakiir-Security------------------\n");
      printf("**************************************************\n");
      printf("******* Usage: ./scan <IPaddress> < Port> ********\n");
      printf("-------------------------------------------------\n");
      exit(1);
   }
 



   sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);


   memset( &servaddr, 0, sizeof(servaddr));
    port = atoi(argv[2]);
   servaddr.sin_family = AF_INET;
   servaddr.sin_port = htons(port);

   hostaddr = gethostbyname( argv[1] );

   memcpy(&servaddr.sin_addr, hostaddr->h_addr, hostaddr->h_length);

 
int co = connect(sock, (struct sockaddr *) &servaddr, sizeof(servaddr));
if(co == -1)
{
switch(errno){
case ETIMEDOUT:
    printf("[+] Connection TimeOut On Port %d : %s\n",port,argv[1]);
        break;
case ECONNREFUSED:
    printf("[+] Connection Refused (Blocked, No listenning) %d : %s\n",port,argv[1]);
        break;
case ENETUNREACH:
    printf("[+] Network is unreachable %d : %s\n ",port,argv[1]);
        break;
case ENETDOWN:
    printf("[+] Network is down %d : %s\n",port,argv[1]);
        break;
default:
    printf("[-] Erreur Inconnu\n");
        break;

}

close(sock);
exit(0);
}else printf("[+] Le port %d est ouvert sur %s\n",port,argv[1]);close(sock);exit(0);
 
}

 



RE: [C] Port Scanner - b0fh - 22-12-2012

Hello,

C'est un début. Quelques idées d'améliorations pas trop dures pour la prochaine étape:
- observer les différentes erreurs pour distinguer les ports fermés des ports firewallés
- ajouter une boucle pour scanner plusieurs ports à la suite
- ajouter des threads pour faire plusieurs connexions en parallèle


RE: [C] Port Scanner - ark - 22-12-2012

Salut,

C'est un début. Quelques idées d'améliorations un peu plus dures pour la prochaine étape:
- Faire une base de donnée qui contient les services qui tournent habituellement sur ce port.
- Faire des recherches sur le type de service qui tourne pour être sur que c'est bien celui trouve dans la bdd.


RE: [C] Port Scanner - Creepy_p0ney - 22-12-2012

moi j'avais fait un truc du genre mais un peu salasse :
Code C :

#include <stdio.h>
  #include <stdlib.h>
  #include <errno.h>
   #include <string.h>
   #include <sys/types.h>
   #include <netinet/in.h>
   #include <netdb.h>
   #include <sys/socket.h>
   #include <sys/wait.h>

int main(int argc,char *argv[]){
    int sockfd;
    int i=0;
    struct sockaddr_in addr;
    if(argc<=1){
        printf("usage : ./a.out [addr]");
    }
    else{
        while(i<=65535){
            if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0){
                perror("socket");
            }
            addr.sin_family=AF_INET;
            addr.sin_addr.s_addr=inet_addr(argv[1] );
            addr.sin_port=htons(i);
            if(connect(sockfd,(struct sockaddr *)&addr,sizeof(struct sockaddr))>=0){
                printf("le port %d est ouvert sur la machine %s \n",i,inet_ntoa(addr.sin_addr));
            }
            close(sockfd);
            i++;
       
        }
    }
}
 



RE: [C] Port Scanner - sakiir - 22-12-2012

J'ai eu quelque barriere du genre quand un port est en timeout, ca prend vraiment beaucoup de temps pour le detecter, et encore, il ne le detecte pas, on le sait uniquement si ca prend du temps.
Ensuite j'aimerais savoir comment je pourrais savoir si la connexion est refusé, ouverte, ou alors en timeout.


RE: [C] Port Scanner - Creepy_p0ney - 22-12-2012

Je suis pas sûr, je vais peut être dire une grosse connerie mais avec perror("connect") ?


RE: [C] Port Scanner - b0fh - 22-12-2012

En cas d'erreur tu peux tester la valeur de errno pour savoir quelle erreur s'est produite (timeout ou refused). Les détails sont dans la manpage de connect().


RE: [C] Port Scanner - sakiir - 22-12-2012

Ok il y a une liste ici http://linux.die.net/man/2/connect
Mais ces erreur sont retourner je ne comprend pas ..
Je dois utiliser errno

if(errno == ..) ok merci bofh


RE: [C] Port Scanner - gruik - 22-12-2012

cool & merci de partager ton code sakiir Wink

(22-12-2012, 15h30)sakiir a écrit : quand un port est en timeout, ca prend vraiment beaucoup de temps pour le detecter

de mémoire faut aller chatouiller la socket à coups de setsockopt() il me semble, et peut être de select() aussi, et en root possiblement... bref en cherchant "connect timeout c" sur google tu dois facilement trouver des exemples de code à mon avis

des pistes :
http://stackoverflow.com/questions/2597608/c-socket-connection-timeout
http://forums.codeguru.com/showthread.php?353217-example-of-SO_RCVTIMEO-using-setsockopt%28%29
http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man2/setsockopt.2.html

Citation :Ensuite j'aimerais savoir comment je pourrais savoir si la connexion est refusé, ouverte, ou alors en timeout.

ben c'est simple en fait, suffit de tester la valeur de retour de connect(), si la fonction réussi c'est que le port est ouvert, si elle échoue c'est que le port est fermé, et si y'a toujours pas de réponse à la fin du timeout c'est que le port est firewallé (ou qu'il n'y a pas de machine à cette IP évidement)


RE: [C] Port Scanner - sakiir - 23-12-2012

merci pour ta réponse gruik Smile
Et bien je vais réecrire le programme avec plus de fonctionnalité dans quelques temps Smile


RE: [C] Port Scanner - sakiir - 25-12-2012

*NEW* Gestion des erreur avec errno : detection Timeout ou Closes