ident-scan.c
上传用户:jxr_002
上传日期:2007-01-05
资源大小:12k
文件大小:4k
源码类别:

扫描程序

开发平台:

Unix_Linux

  1. /*
  2.  *   ident-scan [v0.15]
  3.  *   This TCP scanner has the additional functionality of retrieving
  4.  *   the username that owns the daemon running on the specified port.
  5.  *   It does this by by attempting to connect to a TCP port, and if it
  6.  *   succeeds, it will send out an ident request to identd on the
  7.  *   remote host.  I believe this to be a flaw in the design of the
  8.  *   protocol, and if it is the developers intent to allow 'reverse'
  9.  *   idents, then it should have been stated clearer in the
  10.  *   rfc(rfc1413).
  11.  *
  12.  *   USES:
  13.  *   It can be useful to determine who is running daemons on high ports
  14.  *   that can be security risks.  It can also be used to search for
  15.  *   misconfigurations such as httpd running as root, other daemons
  16.  *   running under the wrong uids.
  17.  *
  18.  *   COMPILES:  Compiles fine under Linux, BSDI and SunOS 4.1.x.
  19.  *
  20.  *   Dave Goldsmith
  21.  *   <daveg@escape.com>
  22.  *   02/11/1996
  23.  */
  24. #include <stdio.h>
  25. #include <string.h>
  26. #include <sys/types.h>
  27. #include <sys/socket.h>
  28. #include <errno.h>
  29. #include <fcntl.h>
  30. #include <netinet/in.h>
  31. #include <netdb.h>
  32. #include <unistd.h>
  33. enum errlist
  34. {
  35.   BAD_ARGS,BAD_HOST,NO_IDENT,SOCK_ERR
  36. };
  37. void
  38. usage(error)
  39. enum errlist error;
  40. {
  41.   fprintf(stderr,"ident-scan: ");
  42.   switch(error)
  43.   {
  44.     case BAD_ARGS: fprintf(stderr,"usage: ident-scan hostname [low port] [hi port]n");
  45.                    break;
  46.     case BAD_HOST: fprintf(stderr,"error: cant resolve hostnamen");
  47.                    break;
  48.     case NO_IDENT: fprintf(stderr,"error: ident isnt running on hostn");
  49.                    break;
  50.     case SOCK_ERR: fprintf(stderr,"error: socket() failedn");
  51.                    break;
  52.   }
  53.   exit(-1);
  54. }
  55. struct hostent *
  56. fill_host(machine,host)
  57. char *machine;
  58. struct hostent *host;
  59. {
  60.   if ((host=gethostbyname(machine))==NULL)
  61.   {
  62.      if ((host=gethostbyaddr(machine,4,AF_INET))==NULL)
  63.         return(host);
  64.   }
  65.   return(host);
  66. }
  67. int
  68. main(argc,argv)
  69. int argc;
  70. char **argv;
  71. {
  72.   struct sockaddr_in forconnect,forport,forident;
  73.   int i,sockfd,identfd,len=sizeof(forport),hiport=9999,loport=1,curport;
  74.   struct servent *service;
  75.   struct hostent *host;
  76.   char identbuf[15], recieved[85], *uid;
  77.   if ((argc<2) || (argc>4))
  78.     usage(BAD_ARGS);
  79.   if (argc>2)
  80.      loport=atoi(argv[2]);
  81.   if (argc>3)
  82.      hiport=atoi(argv[3]);
  83.   if ((host=fill_host(argv[1],host))==NULL)
  84.     usage(BAD_HOST);
  85.   forconnect.sin_family=host->h_addrtype;
  86.   forconnect.sin_addr.s_addr=*((long *)host->h_addr);
  87.   forident.sin_family=host->h_addrtype;
  88.   forident.sin_addr.s_addr=*((long *)host->h_addr);
  89.   forident.sin_port=htons(113);
  90.   if ((identfd=socket(AF_INET,SOCK_STREAM,0))== -1)
  91.      usage(SOCK_ERR);
  92.   if ((connect(identfd,(struct sockaddr *)&forident,sizeof(forident)))!=0)
  93.      usage(NO_IDENT);
  94.   close(identfd);
  95.   for(curport=loport;curport<=hiport;curport++)
  96.   {
  97.      for(i=0;i!=85;i++)
  98.         recieved[i]='';
  99.      forconnect.sin_port=htons(curport);
  100.      if ((sockfd=socket(AF_INET,SOCK_STREAM,0))== -1)
  101.         usage(SOCK_ERR);
  102.      if (connect(sockfd,(struct sockaddr *)&forconnect,sizeof(forconnect))==0)
  103.      {
  104.        if (getsockname(sockfd,(struct sockaddr *)&forport,&len)==0)
  105.        {
  106.           if ((identfd=socket(AF_INET,SOCK_STREAM,0))== -1)
  107.              usage(SOCK_ERR);
  108.           if (connect(identfd,(struct sockaddr *)&forident,sizeof(forident))==0)
  109.           {
  110.              sprintf(identbuf,"%u,%u",htons(forconnect.sin_port),
  111.                 htons(forport.sin_port));
  112.              write(identfd,identbuf,strlen(identbuf)+1);
  113.              read(identfd,recieved,80);
  114.              recieved[strlen(recieved)-1]='';
  115.              uid=strrchr(recieved,' ');
  116.              service=getservbyport(forconnect.sin_port,"tcp");
  117.              printf("Port: %3dtService: %10stUserid: %sn",curport,
  118.                 (service==NULL)?"(?)":service->s_name,uid);
  119.           }
  120.        }
  121.     }
  122.     close(sockfd);
  123.     close(identfd);
  124.   }
  125. }